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

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

ORDER BY について簡単に説明してみる

 最近、すっかりブログを書かなくなりました。習慣化しておかないといけませんね。去年はこんなに書いていたのに...一か月に 10 も投稿していたんだなぁ。
f:id:koogucc11:20170926231920p:plain

 クエリのレビューをしていてふと気が付いたことを書いてみます。それは、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

f:id:koogucc11:20170926233446p:plain

 上記のクエリの場合、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)

f:id:koogucc11:20170926234214p:plain

 再度、下記のクエリを実行してみます。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

f:id:koogucc11:20170926234428p:plain

 ついでに付加列を足せば、スッキリとした実行プランになりますね。
f:id:koogucc11:20170926235045p:plain

 実際、業務でクエリを書いていると、完全に Sort オペレーターを排除することは相当困難ではありますが....

 秋めいてきました。夏とは違った感じでビールの美味しい季節になってきました。

いまさらだなぁと思いつつ、キャッシュプランがどのくらいのサイズがあるのか確認してみる

 怒涛の出張が継続しております。今年も出張三昧です(笑)(´;ω;`)
f:id:koogucc11:20170907233018p:plain

 さて、今回チューニングの一環で指示により、キャッシュプランが増えそうだなぁというクエリになりそうで..... あ、そういえばキャッシュプランのサイズって一度もみたことないとふと思ったので、早速サイズをチェックしてみました。下記のクエリを SQL Server Management Studio で実行してみましょう。各クエリのキャッシュサイズが確認できます。

SELECT
    [クエリ] = st.text,
    [キャッシュサイズ(byte)] = cp.size_in_bytes
FROM
    sys.dm_exec_cached_plans cp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
WHERE
    cp.cacheobjtype = 'Compiled Plan'

f:id:koogucc11:20170907232701p:plain

 総合計を出力してみます。あれ、エラーでました。int の範囲を超えるサイズがキャッシュされているのか。

SELECT
    [キャッシュサイズ合計(byte)] = SUM(cp.size_in_bytes)
FROM
    sys.dm_exec_cached_plans cp
WHERE
    cp.cacheobjtype = 'Compiled Plan'

f:id:koogucc11:20170907232718p:plain

 BIGINT でキャストしましょう。正しく出力できました。こんなにキャッシュされていたのか...普通なのでしょうか?

SELECT
    [キャッシュサイズ合計(byte)] = SUM(CAST(cp.size_in_bytes AS BIGINT))
FROM
    sys.dm_exec_cached_plans cp
WHERE
    cp.cacheobjtype = 'Compiled Plan'

f:id:koogucc11:20170907232725p:plain

 Mac Book Pro ほしい。

 けど、Lenovo Yoga 920 もいいな。
www3.lenovo.com

 シャンパンゴールドがなくなったのは、非常に残念。けど、ブロンズいいな。
f:id:koogucc11:20170907234441p:plain
f:id:koogucc11:20170907234434p:plain

あー、最近ブログ書いてないなぁとふと思ったので、記事書いてみた

 お久しぶりです。最近、色々と忙しくて記事が全然書けていませんでした。新しい技術にも全くキャッチアップできず、日々雑な仕事ばかりしていると、気持ちがすさんでいきますし、技術力が下がっていく一方です。11月には Tech Summit があります。このようなカンファレンスにも出ていないと、モチベーション保てないです....
f:id:koogucc11:20170815095539p:plain
Microsoft Tech Summit 2017 | インフラエンジニア、アーキテクト、IT 戦略立案に関わる皆様の為の技術カンファレンス - Microsoft Events & Seminars

 さて、気を取り直して...最近、SQL Server Management Studio 17.2 がリリースされてました。
Download SQL Server Management Studio (SSMS) | Microsoft Docs

 New in SSMS: Performance Dashboard built-in だそうなので、ちょっと見てみましょう。
blogs.msdn.microsoft.com

 ということで、17.2 をインストール。
f:id:koogucc11:20170815013425p:plain

 下図のようにクリックします。
f:id:koogucc11:20170815093659p:plain

 パフォーマンスダッシュボードが表示されます。日本語化けてますが、気にせず使いましょう。
f:id:koogucc11:20170815093900p:plain

 CPU の高いクエリを抽出したりできます。棒グラフをクリックすると、
f:id:koogucc11:20170815093920p:plain

 実際のクエリを参照できます。便利ですね。
f:id:koogucc11:20170815093942p:plain

 dmv、dmf に関してまだあまり理解していない!という方にはお勧めです。下図のように SQL Server Profiler 等を用いて、どのようなクエリが発行されているかを参照するのも勉強になるかもしれません。
f:id:koogucc11:20170815094911p:plain

 働きすぎ、社畜やん。

社畜のススメ (新潮新書)

社畜のススメ (新潮新書)

.NET Core を勉強してみる

 最近連日暑いですね。クーラーが苦手なのと、扇風機が一つ壊れたので二つゲットしました。寝室用と、

 リビング用です。

 最近の扇風機は高機能ですね。首振りの範囲が指定できたりします。360度全方向に首振りもしてくれます。
f:id:koogucc11:20170708181920j:plain

 次のお仕事では .NET Core を使用する予定です。ということで、今まで触れたこともなかった ( 最近あまりコーディングの興味が薄れていた ) ので、少しお勉強してみます。

 CentOS,Ubuntu での構成もアリな気がしますが、結局有償サポートとか組んでしまうとイニシャルはいいんですが、保守費用は結構高額になるんですよね。結局使い慣れた Windows Server でやったほうが、技術者育成の面とか、コスト面とかでメリットがありそうです。

最近、やたらと〇〇横丁なるものができています。
retrip.jp

蒲田バル横丁。今年5月オープン。
food-stadium.com

川崎のれん街 ほのぼの横丁。今年6月オープン。
www.kanaloco.jp

恵比寿横丁。これ昔からありますね。
jion.tokyo

澁谷のんべい横丁。これは最近でしたっけ?
www.nonbei.tokyo

ASP.NET Core!!

ASP.NET Core 2 High Performance - Second Edition

ASP.NET Core 2 High Performance - Second Edition

DBCC MEMORYSTATUS の結果を見ていてふと思い出したことがあったので記事書いてみた

 昨日は子供と遊び疲れて早々に寝てしまい、5時前に起きてしまいました。ということで....記事書きます(笑) DBCC MEMORYSTATUS って出力結果が非常に長いですよね。目的の結果を探すのが非常に面倒です。
f:id:koogucc11:20170605080429p:plain

 ゲートウェイでクエリがコンパイルされている数を把握するのにも、かなりスクロール(赤枠を参照)する必要があります。
f:id:koogucc11:20170605081054p:plain

 SQL Server 2016 以降、統計情報などの参照も dmv に徐々に移行されており、ゲートウェイの情報も dmv に移行されていました。下記のクエリを SQL Server Management Studio で実行してみましょう。

SELECT 
    * 
FROM 
    sys.dm_exec_query_optimizer_memory_gateways

f:id:koogucc11:20170605081349p:plain
 
 DBCC コマンドから出力される結果を dmv に移行してくれるのはいいですね。調査用クエリなどの作成が容易になるので非常にありがたいです。

 キャンプ向けに AC 電源欲しいんですよね。

 それか、ノートパソコンの給電用にも使えるように持ち歩けるものがいいかなぁ。

Microsoft Flow とそのスマフォアプリを試してみる

 週末はいい天気になりました。昨日は一日運動会でグッタリ、今日は朝から子供の習い事の送迎係です(笑)。お迎えまで少し時間があるので、待ち時間に Microsoft Flow を試してみました。
flow.microsoft.com

 どのようなものか把握していないので、早速お試ししてみました。Microsoft Flow のスマフォアプリでボタンをクリックすると、その時間をエクセルに記録し、スマフォアプリに通知するといった動作をします。
flow.microsoft.com

 早速試してみましょう。

  • テンプレートを選択し、続行をクリックします。
    f:id:koogucc11:20170521105034p:plain
  • エクセルでテーブルを作成します。ここでは、OperatingTime というテーブル名を付けています。
    f:id:koogucc11:20170521112927p:plain
  • OneDrive にアップロードします。場所は適当でかまいません。
    f:id:koogucc11:20170521105415p:plain
  • OneDrive にアップロードしたエクセルファイルとそのテーブル名を指定します。
    f:id:koogucc11:20170521105555p:plain
  • テーブルに対して、型を指定します。
    f:id:koogucc11:20170521105915p:plain
  • 通知の設定を行い、完了をクリックします。
    f:id:koogucc11:20170521111145p:plain
  • スマフォアプリで、『稼働時間を追跡する』をクリックします。f:id:koogucc11:20170521110316p:plain
  • 2,3秒で処理の完了が通知されます。
    f:id:koogucc11:20170521110430p:plain
  • エクセルに記録されたかを Excel Online で参照します。きちんと記録されていますね。
    f:id:koogucc11:20170521111203p:plain

 そろそろ、お迎えの時間です。いいサービスですね。様々な WebAPI など結びつけることで、面白いサービスが構築できそうですね。構築するのに大した時間もかかりませんし、お手軽です。まさにクラウドといったサービスの一つですね! ( このようなサービスが欲しいんですよね。レガシーがどうとか、どうでもいいのです。パブリッククラウドで競争するなら、このようなサービスを追加しないと無理なので。(独り言) ) さて、お迎えに行ってきます!

Microsoft Flow のドキュメントはこちらです。

そろそろキャンプシーズン。新たなアイテムを買おう。ワゴンの種類多いなぁ。迷うわ。

コールマン アウトドアワゴン 2000021989

コールマン アウトドアワゴン 2000021989