У нас есть функция табличного значения, которая возвращает список людей, к которым вы можете получить доступ, и у нас есть связь между поиском и человеком, называемым результатом поиска.
То, что мы хотим сделать, - это не выбирать всех людей из поиска и представлять их.
Запрос выглядит так
SELECT qm.PersonID, p.FullName
FROM QueryMembership qm
INNER JOIN dbo.GetPersonAccess(1) ON GetPersonAccess.PersonID = qm.PersonID
INNER JOIN Person p ON p.PersonID = qm.PersonID
WHERE qm.QueryID = 1234
Есть только 25 строк с QueryID = 1234, но в таблице QueryMembership содержится почти 5 миллионов строк. В личном столе около 40 тысяч человек.
QueryID - это не PK, но это индекс. План запроса говорит мне, что 97% от общей стоимости затрачивается на «Поиск ключей» с предикатом поиска.
QueryMembershipID = Scalar Operator (QueryMembership.QueryMembershipID as QM.QueryMembershipID)
Почему PK там, когда он вообще не используется в запросе? и почему это занимает так много времени?
Количество человек всего 25, с индексом, это должно быть сканирование таблицы для всех строк QueryMembership с QueryID = 1234 и затем JOIN для 25 человек, которые существуют в функции табличных значений. Который, кстати, должен быть оценен только один раз и завершается менее чем за 1 секунду.