MS SQL - запрос

Slavaga

Почему вот такой запрос выполняется <1 сек:
SELECT * FROM SV_PatientStatus PSt
WHERE --проверка разрешений
(dbo.f_CheckUserRights('A_VIEW_PATIENT_CONTACTS') = 1)

Вот такой запрос выполняется <1 сек:
SELECT * FROM SV_PatientStatus PSt
WHERE --проверка разрешений
(dbo.f_CheckUserRights('A_VIEW_EGGDONOR_CONTACTS') = 1 AND PSt.IsEGGDonor = 1)

А вот такой запрос выполняется >40 сек:
SELECT * FROM SV_PatientStatus PSt
WHERE --проверка разрешений
(dbo.f_CheckUserRights('A_VIEW_PATIENT_CONTACTS') = 1)
OR
(dbo.f_CheckUserRights('A_VIEW_EGGDONOR_CONTACTS') = 1 AND PSt.IsEGGDonor = 1)

SV_PatientStatus - представление

gopnik1994

видимо в первом и втором случае оптимизатору удается использовать индексы, а во втором нет...
'or' - вообще очень сложная вещь для оптимищации...
А план запросов есть?

Slavaga

gopnik1994

для всех 3-х случаев давай

Slavaga

(второй и первый запросы)

madik_zxz

SELECT * FROM SV_PatientStatus PSt
WHERE --проверка разрешений
(dbo.f_CheckUserRights('A_VIEW_PATIENT_CONTACTS') = 1)
OR
(dbo.f_CheckUserRights('A_VIEW_EGGDONOR_CONTACTS') = 1 AND PSt.IsEGGDonor = 1)
попробуй выполнить это так:
SELECT * FROM SV_PatientStatus PSt
WHERE --проверка разрешений
(dbo.f_CheckUserRights('A_VIEW_PATIENT_CONTACTS') = 1)
UNION
SELECT * FROM SV_PatientStatus PSt
WHERE
(dbo.f_CheckUserRights('A_VIEW_EGGDONOR_CONTACTS') = 1 AND PSt.IsEGGDonor = 1)
MS SQL распараллелит выполнение, выполняться будет быстрее.

svi83

а самое интересное (для третьего) где?

Slavaga

Так я пробовал - запрос моментом обрабатывается.

Slavaga

а самое интересное (для третьего) где?
Третий пост сверху.
Оставить комментарий
Имя или ник:
Комментарий: