Название игры - ограничение ввода-вывода в таблице workrecordfact.То, как в настоящее время настроены запрос и индексация, мы сканируем 100% работы в третьем квартале, а затем отфильтровываем это до работы CSR.Интересно, могут ли критерии CSR быть более избирательными и привести нас к меньшему количеству прочитанных строк?
Этот запрос довольно быстр, верно?
SELECT es.EmployeeID, es.StartDate, es.EndDate
FROM Positions p
JOIN Employeestatus es
ON p.PositionID = es.PositionID
WHERE PositionCode = 'CSR'
Вероятно, CSR точно соответствуетодин ряд позиций.Предполагая, что должности выполняют примерно одинаковую работу, нам, вероятно, нужно только прочитать 10% части рабочего стола Q3.
Думая о том, чтобы потом ввести рабочие факты, как это.
SELECT w.*
FROM
(
SELECT es.EmployeeID, es.StartDate, es.EndDate
FROM Positions p
JOIN Employeestatus es
ON p.PositionID = es.PositionID
WHERE PositionCode = 'CSR'
) es2
JOIN workrecordfact w
ON es2.EmployeeID = w.EmployeeID
AND es2.startdate <= w.workdate AND w.workdate <= es2.enddate
WHERE
'2018-06-01' <= w.workdate AND w.workdate <= '2018-09-30'
Этот запрос лучше всего поддерживать с помощью этого индекса:
CREATE INDEX WorkRecordFact_EmployeeId_WorkDate ON WorkRecordFact(EmployeeId, WorkDate)
Может быть полезно перенести условный выбор рабочей даты логически ранее в запрос:
SELECT w.*
FROM
(
SELECT es.EmployeeID,
CASE WHEN es.StartDate <= '2018-06-01' THEN '2018-06-01' ELSE es.StartDate END as StartDate,
CASE WHEN '2018-09-30' <= es.EndDate THEN '2018-09-30' ELSE es.EndDate END as EndDate
FROM Positions p
JOIN Employeestatus es
ON p.PositionID = es.PositionID
WHERE PositionCode = 'CSR'
) es2
JOIN workrecordfact w
ON es2.EmployeeID = w.EmployeeID
AND es2.startdate <= w.workdate AND w.workdate <= es2.enddate