都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

便利な SQL の関数とか、構文とか、その他色々まとめてみる - その19 (FASTって?)

 最近、副業でほんの少しだけ SQL Server のお仕事を開始しました。チューニングは、パズルを組みなおすような作業なので個人的に非常に好きな分野です。色々調べものをしていたら、FAST という使ったことのないクエリヒントを見つけました。

FAST number_rows
最初の number_rows を高速検索するためにクエリの最適化を行うことを指定します。 この結果は負以外の整数です。 最初の number_rows を返した後、クエリは実行を続け、完全な結果セットを作成します。

 高速検索というキーワードにこんな都合がいいものあるんかいな?と思いながらも興味を持ったので、早速動作をチェックしてみます。下記のクエリを使用します。

SELECT 
    SOH.SalesOrderID,
    SOH.CustomerID,
    SOH.SalesPersonID
FROM 
    Sales.SalesOrderHeader SOH
WHERE 
    SalesPersonID = 279;

 実行プランは下図の通りです。
f:id:koogucc11:20200831201858p:plain

 次に、OPTION (FAST n) を付加してみましょう。n = 100 にしておきます。

SELECT
    SOH.SalesOrderID,
    SOH.CustomerID,
    SOH.SalesPersonID
FROM 
    Sales.SalesOrderHeader SOH
WHERE 
    SalesPersonID = 279
OPTION (FAST 100);

 実行プランは下図の通りです。
f:id:koogucc11:20200831201946p:plain

 二つのプランを比較してみましょう。件数が違っていたり、Cost が OPTION (FAST 100) を付加したほうが低くなってますね。
f:id:koogucc11:20200831202923p:plain

 推定行数が異なっていますね。OPTION (FAST 100) を付加したほうは 100件になっています。しかも、付加した方には EstimateRowsWithoutRowGoal = 429 とか見たことない属性があります。(知識が 2012 で止まっているのですが、こんなの昔からあったっけ?)
f:id:koogucc11:20200831203652p:plain

 こちらも推定行数が減っており、EstimateRowsWithoutRowGoal = 31465 が付加されています。
f:id:koogucc11:20200831204006p:plain

 うーん、久しぶりに記事を書いてみたけど、中途半端に終わってしまった。しかし、これは記事を書くネタになるから都合がいいかな笑