都内で働くSEの技術的なひとりごと

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

土曜日の夜に仕事するのやだなぁと思って、気晴らしついてでに MSSQL Tiger Team の SQL Server 2017 Showplan enhancements を確認してみた

 SQL Server 2017 で実行プランの機能追加がありました。
blogs.msdn.microsoft.com

 早速、SQL Server 2017 で下記のクエリを実行してみましょう。

SELECT
    soh.*,
    sod.*
FROM
    Sales.SalesOrderHeader soh
    INNER JOIN
        Sales.SalesOrderDetail sod
    ON  sod.SalesOrderID = soh.SalesOrderID
WHERE
    CustomerID = 29565

f:id:koogucc11:20170513222920p:plain

 プリパティからオプティマイザが使用している統計の情報が参照できるようになっています。
f:id:koogucc11:20170513223300p:plain

<optimizerstatsusage>
    <statisticsinfo database="[AdventureWorks]" schema="[Sales]" table="[SalesOrderHeader]" statistics="[PK_SalesOrderHeader_SalesOrderID]" modificationcount="0" samplingpercent="100" la14-07-17t16:11:30.67="La14-07-17T16:11:30.67">
    </statisticsinfo>
    <statisticsinfo database="[AdventureWorks]" schema="[Sales]" table="[SalesOrderDetail]" statistics="[_WA_Sys_00000002_44CA3770]" modificationcount="0" samplingpercent="68.2155" lastu05-13t20:28:34.77="LastU05-13T20:28:34.77">
    </statisticsinfo>
    <statisticsinfo database="[AdventureWorks]" schema="[Sales]" table="[SalesOrderHeader]" statistics="[IX_SalesOrderHeader_CustomerID]" modificationcount="0" samplingpercent="100" last-07-17t16:11:32.41="Last-07-17T16:11:32.41">
    </statisticsinfo>
    <statisticsinfo database="[AdventureWorks]" schema="[Sales]" table="[SalesOrderDetail]" statistics="[PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID]" modificationcount="0" sampl67.8454="Sampl67.8454">
    </statisticsinfo>
</optimizerstatsusage>

 クエリが予想したパフォーマンスが出ていない、インデックスを使用していないときに統計情報の最終更新時間が古すぎるとか、サンプリングが低すぎるなどが起因していることはよくあることです。実行プランに使用統計の情報が出るだけでも、パフォーマン調査の効率が上がりそうですね。それ以外にも、CPU Time や WaitStats の情報も出力されます。
f:id:koogucc11:20170513224157p:plain

<waitstats>
    <wait waittype="PAGEIOLATCH_SH" waittimems="9" waitcount="26">
    </wait>
</waitstats>
<querytimestats cputime="2" elapsedtime="11">
</querytimestats>

 これは非常に助かる、いい機能追加ですね。

なんとなく、タバスコ全種類買ってみたくなった。