我目前有這個查詢(SQL Server):
DECLARE @PageNum int = 1;
DECLARE @PageSize int = 2;
SELECT *
FROM (
SELECT *,ROW_NUMBER() OVER(PARTITION BY Color ORDER BY Name) AS Row
FROM Orders
) t1
WHERE Row BETWEEN ((@PageNum-1)*@PageSize 1) AND (@PageNum*@PageSize)
ORDER BY Color,Name
此查詢的作用是為每個Color. 意思是如果表包含:
| ID | 顏色 | 姓名 |
|---|---|---|
| 1 | 紅色的 | 紙#1 |
| 2 | 紅色的 | 論文#2 |
| 3 | 紅色的 | 論文#3 |
| 4 | 綠 | 論文#4 |
| 5 | 綠 | 論文#5 |
| 6 | 綠 | 紙#6 |
| 7 | 綠 | 論文#7 |
那么上面的查詢將導致:
| ID | 顏色 | 姓名 |
|---|---|---|
| 1 | 紅色的 | 紙#1 |
| 2 | 紅色的 | 論文#2 |
| 4 | 綠 | 論文#4 |
| 5 | 綠 | 論文#5 |
在第 1 頁和
| ID | 顏色 | 姓名 |
|---|---|---|
| 3 | 紅色的 | 論文#3 |
| 6 | 綠 | 紙#6 |
| 7 | 綠 | 論文#7 |
在第 2 頁。
這有效。但是,在我的真實示例中,此查詢需要很長時間才能執行——實際上大約需要 10 分鐘。我有一個靜態表,其中有超過 800K 條永遠不會改變的記錄。由于這個表永遠不會改變,我為我要過濾/排序的每一列創建了一個索引。這個表還有一個 column RowId,它實際上只是行號,它有一個唯一的索引。
執行計劃可以在這里看到:https : //www.brentozar.com/pastetheplan/?id=BkeWfVCSY
我能做些什么來加速這個查詢?
uj5u.com熱心網友回復:
執行計劃中的第一個操作是表掃描,所以我假設這是一個堆表(否則我們應該看到聚集索引掃描)并且您創建的索引沒有被使用。
另外,一旦這是一個永遠不會改變的靜態表,根據描述,碎片應該不是問題。
我沒有在這臺機器上安裝 SQL Server,所以我無法比較之前和之后的執行計劃,但我相信對于您的查詢,我們可能會看到聚簇索引的一些改進,按照 Martin Smith 的建議對鍵進行排序他的評論。
CREATE CLUSTERED INDEX IX_Order ON dbo.Order(OrderType ASC, From DESC)
如果這能改善您的查詢,請告訴我。如果沒有,我可以創建一個類似的場景來在白天進行測驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332838.html
標籤:sql sql-server 查询语句
上一篇:重寫查詢
下一篇:拋出例外:當物體資料模型物件實體化時,C#Windows服務中的“System.IO.FileNotFoundException”
