ORDER BY について簡単に説明してみる
最近、すっかりブログを書かなくなりました。習慣化しておかないといけませんね。去年はこんなに書いていたのに...一か月に 10 も投稿していたんだなぁ。
クエリのレビューをしていてふと気が付いたことを書いてみます。それは、ORDER BY。意外と考慮からもれている場合が多く見受けれます。クエリを実行する上で、CPU パワーを使うし、IO も大量に発生させてしまう原因になりやすいです。ORDER BY を効率的に処理させるには、兎に角 Sort オペレータをなるべく出現させないようにする、が鉄則です。早速、AdventureWorks データベースを使って実験してみましょう。下記のクエリを SQL Server Management Studio で実行されてみましょう。Sort オペレータが出現しているのが確認できます。
SELECT SalesOrderID, RevisionNumber, OrderDate, DueDate, ShipDate, Status, OnlineOrderFlag, SalesOrderNumber, PurchaseOrderNumber, AccountNumber, CustomerID, SalesPersonID, TerritoryID, BillToAddressID, ShipToAddressID, ShipMethodID, CreditCardID, CreditCardApprovalCode, CurrencyRateID, SubTotal, TaxAmt, Freight, TotalDue, Comment, rowguid, FROM Sales.SalesOrderHeader WITH(FORCESEEK, INDEX(IX_SalesOrderHeader_SalesPersonID)) WHERE SalesPersonID = 277 ORDER BY OrderDate
上記のクエリの場合、OrderDate で ORDER BY しているため、OrderDate をインデックスに含めることでインデックスによる並び替えがされている状態になるため、Sort オペレーターをなくすことが可能です。インデックスを変更してみましょう。
CREATE NONCLUSTERED INDEX IX_SalesOrderHeader_SalesPersonID ON Sales.SalesOrderHeader ( SalesPersonID ASC, OrderDate ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
再度、下記のクエリを実行してみます。Sort オペレーターがなくなっていることが判断できます。
SELECT SalesOrderID, RevisionNumber, OrderDate, DueDate, ShipDate, Status, OnlineOrderFlag, SalesOrderNumber, PurchaseOrderNumber, AccountNumber, CustomerID, SalesPersonID, TerritoryID, BillToAddressID, ShipToAddressID, ShipMethodID, CreditCardID, CreditCardApprovalCode, CurrencyRateID, SubTotal, TaxAmt, Freight, TotalDue, Comment, rowguid, FROM Sales.SalesOrderHeader WITH(FORCESEEK, INDEX(IX_SalesOrderHeader_SalesPersonID)) WHERE SalesPersonID = 277 ORDER BY OrderDate
ついでに付加列を足せば、スッキリとした実行プランになりますね。
実際、業務でクエリを書いていると、完全に Sort オペレーターを排除することは相当困難ではありますが....
秋めいてきました。夏とは違った感じでビールの美味しい季節になってきました。
- 出版社/メーカー: アサヒビール
- メディア: 食品&飲料
- クリック: 17回
- この商品を含むブログ (6件) を見る
- 出版社/メーカー: サントリー
- メディア: 食品&飲料
- この商品を含むブログを見る
【2017年リニューアル】 新・キリン 一番搾り 350ml×24本
- 出版社/メーカー: キリンビール
- メディア: 食品&飲料
- この商品を含むブログを見る
- 出版社/メーカー: サッポロビール
- メディア: 食品&飲料
- この商品を含むブログを見る