我有兩個以下查詢:SQL子查詢或INNER-JOIN?
declare @UserId as int
set @UserId = 1
-- Query #1: Sub-query
SELECT
u.[Id] ,
u.[Name] ,
u.[OrgId] AS Organization,
(SELECT o.[Name] FROM Org o WHERE o.Id = u.OrgId) As OrganizationName,
[UserRoleId] AS UserRole,
[UserCode] AS UserCode,
[EmailAddress] As EmailAddress,
(SELECT SearchExpression FROM SearchCriteria WHERE UserId = @UserId AND IsDefault=1) AS SearchCriteria,
(SELECT PageSize FROM UserPreferences WHERE UserId = @UserId) AS UserPreferencePageSize,
(SELECT DrilldownPageSize FROM UserPreferences WHERE UserId = @UserId) AS UserPreferenceDrilldownPageSize
FROM [User] as u
WHERE u.Id = @UserId
-- Query #2: LEFT OUTER JOIN-query
SELECT
u.[Id] ,
u.[Name] ,
u.[OrgId] AS Organization,
(SELECT o.[Name] FROM Org o WHERE o.Id = u.OrgId) As OrganizationName,
[UserRoleId] AS UserRole,
[UserCode] AS UserCode,
[EmailAddress] As EmailAddress,
sc.SearchExpression As SearchExpression,
up.PageSize As PageSize,
up.DrilldownPageSize As DrilldownPageSize
FROM [User] as u
LEFT OUTER JOIN [UserPreferences] as up ON u.id = up.UserId
LEFT OUTER JOIN [SearchCriteria] as sc ON u.id = sc.UserId
WHERE ISNULL(sc.IsDefault,1)=1 AND u.Id = @UserId
查詢執行計劃的統計:(相對於批次查詢成本)
- 查詢#1(子查詢):56%
- 查詢#2(加入):44%
我打算子查詢將是最優的,因爲子查詢將在執行後應用WHERE過濾器。統計數據表明查詢#2 - JOIN方法更好。
請建議。作爲一個適度的SQL服務器用戶,我怎樣才能得出哪個查詢更好(除了執行計劃之外的任何其他執行計劃,如果它更有幫助)
謝謝。
- 查詢#3:完全LEFT OUTER JOIN查詢 選擇 \t U [ID], \t U [名], \t U [ORGID] AS。組織, \t u.OrgId作爲ORGID, O操作。[名]作爲單位名稱, \tü。[UserRoleId] AS的UserRole, \tü。[USERCODE] AS USERCODE, \tü。[EmailAddress的作爲EmailAddress的,\t \t sc.SearchExpression As SearchExpression, \t up.PageSize由於PageSize, \t up。DrilldownPageSize作爲DrilldownPageSize \t FROM [用戶]爲u LEFT OUTER JOIN [使用UserPreferences]至多ON u.id = up.UserId 左外連接[SearchCriteria如SC ON u.id = sc.UserId LEFT OUTER JOIN [ Org] as o ON o.Id = u.OrgId \t WHERE ISNULL(sc.IsDefault,1)= 1 AND u.Id = @UserId – 2009-11-24 08:59:02