【发布时间】:2010-12-19 19:24:26
【问题描述】:
我有以下两个查询:
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 过滤器之后执行。统计数据表明 Query#2 - JOIN 方法更好。
请建议。同样作为一个适度的 SQL-Server 用户,我怎样才能得出哪个查询更好(除执行计划之外的任何其他内容,如果它更有帮助的话)
谢谢。
【问题讨论】:
-
-- 查询 #3:完成 LEFT OUTER JOIN-query SELECT u.[Id] , u.[Name] , u.[OrgId] AS Organization, u.OrgId As OrgId, o.[ Name] As OrganizationName, u.[UserRoleId] AS UserRole, u.[UserCode] AS UserCode, u.[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 LEFT OUTER JOIN [Org] as o ON o.Id = u.OrgId WHERE ISNULL(sc.IsDefault,1)=1 AND u.Id = @UserId
标签: sql-server performance sql