Плохая производительность SQL-запроса из-за предложения ORDER BY - PullRequest
7 голосов
/ 26 января 2010

У меня есть запрос, объединяющий 4 таблицы с множеством условий в предложении WHERE. Запрос также включает предложение ORDER BY для числового столбца. Возвращение занимает 6 секунд, что слишком долго, и мне нужно ускорить его. Удивительно, но я обнаружил, что если я удалю предложение ORDER BY, это займет 2 секунды. Почему так важен порядок заказов и как его оптимизировать? Я использую SQL Server 2005. Большое спасибо.

Я не могу подтвердить, что ORDER BY имеет большое значение, так как я очищаю кэш плана выполнения. Однако можете ли вы пролить свет на то, как это немного ускорить? Запрос выглядит следующим образом (для простоты есть «SELECT *», но я выбираю только те, которые мне нужны).

SELECT *
FROM View_Product_Joined j 
INNER JOIN [dbo].[OPR_PriceLookup] pl on pl.siteID = NodeSiteID and pl.skuid = j.skuid 
LEFT JOIN [dbo].[OPR_InventoryRules] irp on irp.ID = pl.SkuID and irp.InventoryRulesType = 'Product'
LEFT JOIN [dbo].[OPR_InventoryRules] irs on irs.ID = pl.siteID and irs.InventoryRulesType = 'Store'
WHERE (((((SiteName = N'EcommerceSite') AND (Published = 1)) AND (DocumentCulture = N'en-GB')) AND (NodeAliasPath LIKE N'/Products/Cats/Computers/Computer-servers/%')) AND ((NodeSKUID IS NOT NULL) AND (SKUEnabled = 1) AND pl.PriceLookupID in (select TOP 1 PriceLookupID from OPR_PriceLookup pl2 where pl.skuid = pl2.skuid and (pl2.RoleID = -1 or pl2.RoleId = 13) order by pl2.RoleID desc))) 
ORDER BY NodeOrder ASC

1 Ответ

8 голосов
/ 26 января 2010

Почему заказ так важен и как его оптимизировать?

ORDER BY необходимо отсортировать набор результатов, который может занять много времени, если он большой.

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

Однако путь доступа к индексу имеет свои недостатки, поэтому он может занять больше времени.

Если в вашем запросе есть что-то отличное от эквиджоин или ранжированных предикатов (например, <, > или BETWEEN или GROUP BY), тогда индекс, используемый для ORDER BY, может помешать другие индексы не используются.

Если вы отправите запрос, я, вероятно, смогу рассказать вам, как его оптимизировать.

Обновление:

Перепишите запрос:

SELECT  *
FROM    View_Product_Joined j 
LEFT JOIN
        [dbo].[OPR_InventoryRules] irp
ON      irp.ID = j.skuid
        AND irp.InventoryRulesType = 'Product'
LEFT JOIN
        [dbo].[OPR_InventoryRules] irs
ON      irs.ID = j.NodeSiteID
        AND irs.InventoryRulesType = 'Store'
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    OPR_PriceLookup pl
        WHERE   pl.siteID = j.NodeSiteID
                AND pl.skuid = j.skuid
                AND pl.RoleID IN (-1, 13)
        ORDER BY
                pl.RoleID desc
        ) pl
WHERE   SiteName = N'EcommerceSite'
        AND Published = 1
        AND DocumentCulture = N'en-GB'
        AND NodeAliasPath LIKE N'/Products/Cats/Computers/Computer-servers/%'
        AND NodeSKUID IS NOT NULL
        AND SKUEnabled = 1
ORDER BY
        NodeOrder ASC

Отношение View_Product_Joined, как следует из названия, вероятно, является представлением.

Не могли бы вы опубликовать его определение?

Если он индексируется, вы можете воспользоваться созданием индекса для View_Product_Joined (SiteName, Published, DocumentCulture, SKUEnabled, NodeOrder).

...