У меня есть запрос sql с внутренними объединениями четырех таблиц, которые занимают более 30 секунд с текущими индексами и структурой запросов. Я хотел бы сделать это как можно быстрее; по крайней мере, быстрее, чем 5 секунд.Какие индексы оптимизируют этот запрос с четырьмя объединениями?
Сначала я подумал о денормализации, но прочитал here, что в принципе можно оптимизировать с помощью правильных индексов и т. Д. В этом случае я не могу понять. Текущий план запроса содержит сканирование индекса в самой маленькой таблице и предупреждение о недопустимом соединении в одном из внутренних соединений.
- Как я могу оптимизировать скорость следующего?
- Какие индексы?
- Какая структура запросов?
- Другие соображения?
Мы следующие таблицы (с числом строк и соответствующих полей указывается):
TableName Rows Fields ------------------- ----- ---------------------------------------------- ProjectType 150 ProjectTypeID, ProjectTypeName Employee 200 EmployeeID, RefDepartmentID Project 0.2M ProjectID, RefProjectTypeID ProjectTransaction 3.5M Hours, RefEmployeeID, RefProjectID, Date, Type
Запрос должен подвести часы для данного отдела, диапазон дат и т.д. В настоящее время я пытаюсь:
SELECT E.RefDepartmentID, SUM(PTran.Hours)
FROM Employee E
JOIN ProjectTransaction PTran
ON E.EmployeeID = PTran.RefEmployeeID
JOIN Project P
ON PTran.RefProjectID = P.ProjectID
JOIN ProjectType PType
ON P.RefProjectTypeID = PType.ProjectTypeID
WHERE E.RefDepartmentID = @departmentID
AND @from <= PTran.Date AND PTran.Date <= @to
AND PTran.Type = 0
AND PType.ProjectTypeName NOT IN (N'1', N'2', N'3')
GROUP BY E.RefDepartmentID
Спасибо за все быстрые ответы. (У меня уже были индексы по «внешним ключам» и критериям в предложении WHERE
.) Я переупорядочил запрос, чтобы сначала иметь две маленькие таблицы, затем средний размер, а большой - последний. И вояла занимает около одной секунды:
SELECT E.RefDepartmentID, SUM(PTran.Hours)
FROM Employee E
JOIN ProjectType PType
ON E.RefCustomerID = PType.RefCustomerID
JOIN Project P
ON PType.ProjectTypeID = P.RefProjectTypeID
JOIN ProjectTransaction PTran
ON E.EmployeeID = PTran.RefEmployeeID
AND P.ProjectID = PTran.RefProjectID
WHERE E.RefDepartmentID = @departmentID
AND @from <= PTran.Date AND PTran.Date <= @to
AND PTran.Type = 0
AND PType.ProjectTypeName NOT IN (N'1', N'2', N'3')
GROUP BY E.RefDepartmentID
Какой сервер баз данных вы используете? В лучшем случае добавьте вопрос тега с именем сервера базы данных. –