2013-05-07 2 views
1

Какие подсказки можно использовать для повышения производительности запроса OR.TSQL или подсказки плана запроса

Индивидуально два запроса ниже запускаются мгновенно и возвращают 0 строк.

SELECT * FROM AuditInfo ai 
WHERE (ai.AppointmentIdForChange = 60231) 
and ai.objectname = 'dbo.Appointments' 

SELECT * FROM AuditInfo ai 
WHERE (ai.AppointmentIdForKey = 60231) 
and ai.objectname = 'dbo.Appointments' 

AuditInfo - это точка зрения.

Однако следующий запрос работает навсегда (10+ минут)

SELECT * FROM AuditInfo ai 
WHERE (ai.AppointmentIdForKey= 60231 OR ai.AppointmentIdForChange = 60231) 
and ai.objectname = 'dbo.Appointments' 

Как я могу улучшить это? Могу ли я использовать подсказки для запросов?

В оценочном плане выполнения я вижу, что отдельные запросы используют Key Lookups, тогда как запрос с оператором OR использует Index Seeks (который занимает 74% стоимости).

UPDATE:

Вид AuditInfo определяется следующим образом:

ALTER VIEW AuditInfo 
AS 
SELECT 
    ae.Id 
    ,ae.AuditDateTime AS DateTime 
    ,ae.ChangeTypeId 
    ,ae.ObjectName 
    ,aek.KeyName 
    ,aek.KeyValue 
    ,aek.KeyValueNumeric 
    ,ae.UserId 
    ,ae.HostName 
    ,ae.ServerName 
    ,aec.OldValue 
    ,(SELECT TOP 1 aecNewValue.OldValue AS Value 
     FROM dbo.AuditEntries aeNewValue 
     JOIN dbo.AuditEntryKeyValues aekNewValue ON aeNewValue.Id = aekNewValue.AuditEntryId AND aek.KeyName = aekNewValue.KeyName AND aek.KeyValueNumeric = aekNewValue.KeyValueNumeric 
     JOIN dbo.AuditEntryChanges aecNewValue ON aeNewValue.Id = aecNewValue.AuditEntryId AND aec.ColumnName = aecNewValue.ColumnName 
     WHERE aeNewValue.ChangeTypeId IN (0, 1) AND aeNewValue.AuditDateTime > ae.AuditDateTime AND aeNewValue.ObjectName = ae.ObjectName 
     ORDER BY aeNewValue.AuditDateTime 
    ) AS NewValue 
    ,appointmentForKey.AppointmentId AS AppointmentIdForKey, appointmentForChange.AppointmentId AS AppointmentIdForChange 
FROM dbo.AuditEntries ae 
JOIN dbo.AuditEntryKeyValues aek on ae.Id = aek.AuditEntryId 
LEFT JOIN dbo.AuditEntryChanges aec on ae.Id = aec.AuditEntryId AND aec.ColumnName IN ('PatientId', 'AppointmentId') 

-- Get AppointmentId 
LEFT JOIN dbo.Appointments appointmentForKey ON aek.KeyName = 'AppointmentId' AND aek.KeyValueNumeric = appointmentForKey.AppointmentId 
LEFT JOIN dbo.Appointments appointmentForChange ON aec.ColumnName = 'AppointmentId' AND aec.OldValueNumeric = appointmentForChange.AppointmentId 

GROUP BY ae.Id, ae.AuditDateTime, ae.UserId, ae.ChangeTypeId, ae.ObjectName, ae.HostName, ae.ServerName, aek.KeyName, aek.KeyValue, aek.KeyValueNumeric, aec.OldValueNumeric, aec.OldValue, aec.ColumnName 
,appointmentForKey.AppointmentId, appointmentForChange.AppointmentId 
+0

Являются ли 'AppointmentIdForKey',' AppointmentIdForChange' и 'objectname' проиндексированы? –

+0

Оба они соответствуют индексированным столбцам на двух разных таблицах. – Jeff

+0

Какую таблицу размеров мы говорим здесь? Я предполагаю, что 'AppointmentIdForChange' и' AppointmentIdForKey' являются типами 'INT' и' objectname' является 'VARCHAR' или' NVARCHAR'? –

ответ

1

Я знаю, что вы просите подсказки запросов, но вы можете просто запустить его как два запроса с профсоюзом

SELECT * FROM AuditInfo ai 
WHERE (ai.AppointmentIdForChange = 60231) 
and ai.objectname = 'dbo.Appointments' 
UNION 
SELECT * FROM AuditInfo ai 
WHERE (ai.AppointmentIdForKey = 60231) 
and ai.objectname = 'dbo.Appointments' 

Как это будет завтра.
Я возьму СОЮЗ над СОЕДИНЕНИЕМ ИЛИ ИЛИ для стабильности.
С Union SQL делает их по одному, а оптимизатор запросов имеет меньше шансов стать глупым.

+0

объединение выполняет то же самое, что и OR. UNION ALL отлично работает, но не дает желаемого результата. SELECT DISTINCT * FROM (... UNION ALL ...) работает ... но несколько подробный – Jeff

+0

Так что DISTINCT * FROM (... UNION ALL ...) работает. 10 минут до доли секунды, но вы отклоняете его, потому что он многословный? – Paparazzi

+0

Не уволил его ... Я просто хочу понять, почему он работает, и, возможно, как я могу заставить желаемый план выполнения, который, как представляется, производит отдельный плюс союз, кажется, что процесс исполнения кажется настолько неустойчивым, что меня волнует вопрос о том, чтобы полагаться на этом как на решение. , – Jeff