Какие подсказки можно использовать для повышения производительности запроса 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
Являются ли 'AppointmentIdForKey',' AppointmentIdForChange' и 'objectname' проиндексированы? –
Оба они соответствуют индексированным столбцам на двух разных таблицах. – Jeff
Какую таблицу размеров мы говорим здесь? Я предполагаю, что 'AppointmentIdForChange' и' AppointmentIdForKey' являются типами 'INT' и' objectname' является 'VARCHAR' или' NVARCHAR'? –