2017-09-04 14 views
1

我運行下面的查詢:ORDER BY子句,巨大的性能下降

SELECT A.ID, A.CODE, A.NAME, (SUBQUERY CALCULATING SALES) 
FROM PRODUCTS A 
JOIN PRODUCTSALES B ON A.ID = B.ID 

查詢在不到一秒鐘返回250行。如果我在末尾添加ORDER BY A.CODEORDER BY A.NAME,則查詢在20秒內返回。

我不明白爲什麼排序250行數據需要這麼長時間。如果訂單列是像A.ID這樣的整數,則此行爲不存在。

+2

你使用哪個dbms?任何索引?冷/熱數據? A.ID是主鍵嗎? – jarlh

+0

如果A.ID是主鍵,它可能有一個聚集索引,這意味着它已經排序。你能查看一個查詢計劃嗎?它應該給你更多關於發生的事情的信息。例如。缺少索引。 – gcaton

+0

你在使用GROUP BY嗎?你用什麼dbms確實很重要! –

回答

3

原因是因爲您迫使SQL Server按順序返回行。

  • 排序可能是因爲它消耗大量的連接表的昂貴之前的操作可以執行

  • 聚集/非聚集索引已經通過某種提供的訂單,所以優化可以肯定的訂購。

正常情況下,SQL Server只抓取匹配的前250行,沒有任何關於順序或順序行的關注,並且使用查詢完成。

但是由於您現在堅持以特定順序返回前250行,因此優化程序現在必須先使用表之間的排序操作,然後再抓取250個請求的行。

這就是爲什麼你看到性能受到打擊,因爲SQL Server現在必須將大部分匹配表加載到內存中進行處理。

至於你爲什麼不在ID列上注意到這一點,那是因爲訂單至少是基於聚集索引,所以已經有了某種保證的排序順序,所以優化器不需要加載爲很多要達到250行。

+0

但是,爲什麼優化器選擇不對最終結果集執行排序?爲什麼它假設我堅持要返回一個有序集合,而不是事後整理呢?從最終結果來看,它實際上不是一種去優化策略嗎? – Saloom