Оптимизировать SQL-запросы, используя функции SUM и COUNT - PullRequest
0 голосов
/ 21 марта 2012

У меня следующий запрос, который занимает слишком много времени, чтобы получить около 70000 записей.Я заметил, что время выполнения пропорционально количеству извлеченных записей.Мне нужно оптимизировать этот запрос, чтобы время выполнения не было пропорционально количеству полученных записей.Есть идеи?

;WITH TT AS (
      SELECT TaskParts.[TaskPartID], 
      PartCost,
      LabourCost,
      VendorPaidPartAmount,
      VendorPaidLabourAmount,
      ROW_NUMBER() OVER (ORDER BY [Employees].[EmpCode] asc) AS RowNum  
      FROM [TaskParts],[Tasks],[WorkOrders], [Employees], [Status],[Models]
      ,[SubAccounts]WHERE 1=1 AND (TaskParts.TaskLineID = Tasks.TaskLineID)
AND (Tasks.WorkOrderID = [WorkOrders].WorkOrderID)
AND (Tasks.EmpID = [Employees].EmpID)
AND (TaskParts.StatusID = [Status].StatusID)
And (Models.ModelID = Tasks.FailedModelID) 
And (SubAccounts.SubAccountID = Tasks.SubAccountID)AND (SubAccounts.GLAccountID = 5))
SELECT  --*
    COUNT(0)--,
    SUM(ISNULL(PartCost,0)), 
    SUM(ISNULL(LabourCost,0)), 
    SUM(ISNULL(VendorPaidPartAmount,0)), 
    SUM(ISNULL(VendorPaidLabourAmount,0))
    FROM TT 

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Как отметил Ливен, вы можете удалить TD0, TD1 и TP1, поскольку они являются избыточными.

Вы также можете удалить столбец row_number, так как он не используется и функции управления окнамиотносительно дороги.

Возможно также удалить некоторые таблицы из TT CTE, если они не используются;однако, поскольку имена таблиц не были включены в каждый выбранный столбец, невозможно определить, какие таблицы не используются.

Помимо этого, ответ вашего запроса всегда будет пропорционален количеству строквозвращено, потому что СУБД должна прочитать каждую возвращенную строку для вычисления результатов.

0 голосов
/ 21 марта 2012

Убедитесь, что у вас есть индекс поддержки для каждого внешнего ключа, и, скорее всего, это не проблема в этом случае, но оптимизация MS SQL лучше работает с внутренними объединениями.Также я не вижу причин, по которым вам нужен RowNum, если вам нужны только итоги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...