この場合、クライアントから送信された文字列のリストがあるとします。コンプライアンス・リージョンと呼ばれる表があります。私は、名前のプロパティを持つ行を検索したいと地域の項目は、行に存在する必要があります。SQL INNER JOINとWhere Exists Performance Consideration
LINQでは、私は2つの異なる方法でそれを行うことができます。以下のように、2つの異なるSQLクエリを生成します。 私の質問は私が選ぶべきですか?どのクエリの方がパフォーマンスが良いですか?
List<string> regions = new List<string>() { "Canada", "EN 50530" };
var cregions = from c in complianceRegions
from r in regions
where c.Name.Equals(r)
select c;
var cregions2 = from c in complianceRegions
where regions.Any(x => x == c.Name)
select c;
生成されるSQLは、以下を示しています。
し、要求されたとして
--cregions2
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent1].[Description] AS [Description]
FROM [Administration].[ComplianceRegions] AS [Extent1]
WHERE EXISTS (SELECT
1 AS [C1]
FROM (SELECT
N'Canada' AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable1]
UNION ALL
SELECT
N'EN 50530' AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable2]) AS [UnionAll1]
WHERE [UnionAll1].[C1] = [Extent1].[Name]
)
-- cregions
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent1].[Description] AS [Description]
FROM [Administration].[ComplianceRegions] AS [Extent1]
INNER JOIN (SELECT
N'Canada' AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable1]
UNION ALL
SELECT
N'EN 50530' AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable2]) AS [UnionAll1] ON [Extent1].[Name] = [UnionAll1].[C1]
。
*パフォーマンスが優れているクエリはどれですか?*自分のテストで明らかになったことは何ですか? –
興味深い部分は、私は同じクエリを何回か実行すると、SQLサーバーがクエリをキャッシュし、私に間違ったパフォーマンスを与えます。 –
最初のクエリで 'Contains'と2番目の' == 'が使用されるのはなぜですか?どのような比較演算子ですか?現在、あなたはリンゴとオレンジを比較しています。 –