最近、副業でほんの少しだけ SQL Server のお仕事を開始しました。チューニングは、パズルを組みなおすような作業なので個人的に非常に好きな分野です。色々調べものをしていたら、FAST という使ったことのないクエリヒントを見つけました。
FAST number_rows
最初の number_rows を高速検索するためにクエリの最適化を行うことを指定します。 この結果は負以外の整数です。 最初の number_rows を返した後、クエリは実行を続け、完全な結果セットを作成します。
高速検索というキーワードにこんな都合がいいものあるんかいな?と思いながらも興味を持ったので、早速動作をチェックしてみます。下記のクエリを使用します。
SELECT SOH.SalesOrderID, SOH.CustomerID, SOH.SalesPersonID FROM Sales.SalesOrderHeader SOH WHERE SalesPersonID = 279;
実行プランは下図の通りです。
次に、OPTION (FAST n) を付加してみましょう。n = 100 にしておきます。
SELECT SOH.SalesOrderID, SOH.CustomerID, SOH.SalesPersonID FROM Sales.SalesOrderHeader SOH WHERE SalesPersonID = 279 OPTION (FAST 100);
実行プランは下図の通りです。
二つのプランを比較してみましょう。件数が違っていたり、Cost が OPTION (FAST 100) を付加したほうが低くなってますね。
推定行数が異なっていますね。OPTION (FAST 100) を付加したほうは 100件になっています。しかも、付加した方には EstimateRowsWithoutRowGoal = 429 とか見たことない属性があります。(知識が 2012 で止まっているのですが、こんなの昔からあったっけ?)
こちらも推定行数が減っており、EstimateRowsWithoutRowGoal = 31465 が付加されています。
うーん、久しぶりに記事を書いてみたけど、中途半端に終わってしまった。しかし、これは記事を書くネタになるから都合がいいかな笑