Я два следующих запросов: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 (Sub-запросов): 56%
- Запрос № 2 (JOIN): 44%
Я хочу, чтобы подзапрос был бы оптимальным, потому что будет выполняться подзапрос после применения фильтра WHERE. Статистика говорит, что подход Query # 2 - JOIN лучше.
Pls предложить. Также как умеренный пользователь SQL-Server, как я могу получить, какой запрос лучше (что-то другое, кроме плана выполнения, если это более полезно)
Спасибо.
- Запрос # 3: Полный LEFT OUTER JOIN-запрос ВЫБОР \t U [Id], \t U [Имя], \t и [OrgId] АС... Организация, \t u.OrgId Как OrgId, о. [Имя] Как OrganizationName, \t и. [UserRoleId] AS UserRole, \t и. [UserCode] AS USERCODE, \t и. [EmailAddress] Как EmailAddress, \t \t sc.SearchExpression As SearchExpression, \t up.PageSize As PageSize, \t up.DrilldownPageSize В DrilldownPageSize \t из [Пользователь] как у LEFT OUTER JOIN [НайтиСтраницу], как вверх на u.id = up.UserId левое внешнее соединение [SearchCriteria] в качестве СБН ON u.id = sc.UserId LEFT OUTER JOIN [ Org] as o ON o.Id = u.OrgId \t ГДЕ ISNULL (sc.IsDefault, 1) = 1 И u.Id = @UserId –