2017-01-10 4 views
0

У меня есть этот запрос, которые работают на MS SQL Server:Как оптимизировать SQL запрос

SELECT o.phone AS Number, o.code AS Code, o.name AS Name, 
o.expireDate AS ExpireDate, o.disabled AS cardStatus, a.disabled AS AccountStatus, 
MAX(j.cDate) AS LastUse 
FROM [DATAB].[dbo].[Card] AS o 
LEFT OUTER JOIN [DATAB].[dbo].[journal] AS j 
ON j.phone = o.phone, 
[DATAB].[dbo].[CardType] AS ct, [DATAB].[dbo].[Account] AS a, 
[DATAB].[dbo].[CardProduct] AS cp 
WHERE o.accountProductId = ct.id 
AND ct.accountId = a .id 
AND a.number = 'XXXXXXXXXX' 
AND ct.partnerProductId = cp.id 
AND cp.code = 'XXXX' 
GROUP BY o.phone, o.code, o.disabled, o.name, o.expireDate, a.disabled 
ORDER BY o.name ASC; 

Я хотел бы, чтобы оптимизировать его для того, чтобы работать быстрее, но не как начать.

FYI, я проверил оценочный план выполнения, анализ индекса DATAB]. [Dbo]. [Журнал] говорит, что он стоит 70% от запроса, но сообщение об ошибке отсутствует.

+0

Прежде всего, изменить ваш код, чтобы присоединиться к собственно заявления. Добавьте индексы к внешним ключам. Попробуйте добавить индекс в 'a.number' и' cp.code'. –

+0

Вам нужно левое соединение или вам нужны только телефоны, которые появляются в журнале dbo.Journal? – TJB

+0

Giorgi: Я проверил с индексом, который вы мне сказали, но результат тот же, я получаю 1400 строк за 5 секунд. TJB: Я хочу последний MAX (cDate) из dbo.Journal –

ответ

1

Вот один из способов использования Outer Apply

SELECT o.phone  AS Number, 
     o.code  AS Code, 
     o.name  AS Name, 
     o.expireDate AS ExpireDate, 
     o.disabled AS cardStatus, 
     a.disabled AS AccountStatus, 
     LastUse 
FROM [DATAB].[dbo].[Card] AS o 
     INNER JOIN [DATAB].[dbo].[CardType] AS ct 
       ON o.accountProductId = ct.id 
     INNER JOIN [DATAB].[dbo].[Account] AS a 
       ON ct.accountId = a .id 
     INNER JOIN [DATAB].[dbo].[CardProduct] AS cp 
       ON ct.partnerProductId = cp.id 
     OUTER apply (SELECT Max(cDate) 
        FROM [DATAB].[dbo].[journal] AS j 
        WHERE j.phone = o.phone) ou (LastUse) 
WHERE a.number = 'XXXXXXXXXX' 
     AND cp.code = 'XXXX' 
ORDER BY o.name ASC; 

Создание индекса NONCLUSTERED на phone,cDatejournal столбцов в таблице должны помочь в запросе

Смежные вопросы