Farz edelim, bu durumda bölgelerden istemciden gönderilen bir dize listesi var. Ve Uygunluk Bölgeleri adlı bir masa var. Bir name özelliğine sahip satırları aramak istiyorum ve bölge öğesi bölge üzerinde bulunmalıdır.SQL INNER JOIN vs Var Olduğu Durum Performans Değerlendirmesi
LINQ'ta bunu iki farklı şekilde yapabilirim. Aşağıda olduğu gibi iki farklı SQL Sorgusu üretirler. Sorum şu ki hangisini seçmeliyim? Hangi sorgu daha iyi performansa sahip?
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;
oluşturulan SQL aşağıda gösterdi.
Ve istendiği gibi
--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]
.
* Hangi sorgu daha iyi performansa sahip? * Kendi testleriniz neler gösterdi? –
ilginç bir bölüm, aynı sorguyu birkaç kez çalıştırdığımda, SQL sunucusu sorguyu önbelleğe alır ve yanlış performans verir. –
Neden ilk sorgu 'Contains' ve ikinci' == 'kullanır? Amaçlanan karşılaştırma operatörü hangisidir? Şu anda elmaları portakallarla karşılaştırıyorsunuz. –