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

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

Docker for Mac を試してみる

 全国飛び回りの毎日です。前回、macOS 版の sqlops を試したので、その他にも macOS で何か試したくなりました。
ryuchan.hatenablog.com

 今更感はありますが、Docker を試したいと思います。Docker for Mac をダウンロードし、インストールします。
f:id:koogucc11:20171119172632p:plain

 3.25 GB 以上が推奨のようです。ここではとりあえず 3.5 GB にしておきます。
f:id:koogucc11:20171120094614p:plain

 次に Docker に対応した SQL Server をインストールします。下記のコマンドをターミナルから実行します。( 詳しくはココ。 )

$ docker pull microsoft/mssql-server-linux

f:id:koogucc11:20171119221524p:plain

 イメージインストールに成功したら、下記のコマンドを実行し、Docker イメージの SQL Server を実行します。( 詳しくはココ。 )

$ docker run -e ACCEPT_EULA=Y -e SA_PASSWORD=10n@ideh@t@r@ku -p 1433:1433 -d microsoft/mssql-server-linux

f:id:koogucc11:20171119221732p:plain

 SQL Operations Studio から Docker 上の SQL Server に接続してみましょう。sa で接続しましょう。IP は Docker が動作しているクライアントの IP アドレスを設定します。
f:id:koogucc11:20171119222338p:plain

 下記のクエリを実行してみましょう。

SELECT @@VERSION

f:id:koogucc11:20171119222630p:plain

Microsoft SQL Server 2017 (RTM-CU1) (KB4038634) - 14.0.3006.16 (X64) 	Oct 19 2017 02:42:29 	Copyright (C) 2017 Microsoft Corporation	Developer Edition (64-bit) on Linux (Ubuntu 16.04.3 LTS)

 手軽に SQL Server の環境を準備できますね。複数の環境を素早く作成しなければいけない時に重宝しそうですね。Docker 楽しいなぁ。

Docker

Docker

Docker入門

Docker入門

Microsoft SQL Operations Studio Preview がリリースされたので、早速 macOS で触ってみる

 年末に向けてダイヤモンド修行は続きます(笑)今年はダイヤモンド少し危うい.....気を抜かずに頑張ります(笑)
f:id:koogucc11:20171118115422p:plain

 Microsoft SQL Operations Studio ( sqlops ) Preview がリリースされました。WindowsmacOS および Linux で使用することができます。
blogs.technet.microsoft.com
 
 ダウンロードはこちら。
docs.microsoft.com

 折角なので、macOS で試してみます。ダウンロードしたファイルを、
f:id:koogucc11:20171118115713p:plain
 
 アプリケーションにコピーするだけ。普段使用する OS を Windows から macOS にして実感することの一つにインストールが非常に速くて、楽な点があります。
f:id:koogucc11:20171118115743p:plain

 それ以外には、ライブ変換ですね。この機能のおかげで、記事を書くのが非常に早くなりました。
www.youtube.com

 Dock より起動します。
f:id:koogucc11:20171118125524p:plain
f:id:koogucc11:20171118123226p:plain
 
 Azure 上に展開している SQL Server にアクセスしてみました。
f:id:koogucc11:20171118123145p:plain
 
 World Wide Importers のデータベースでさらっと触ってみましょう。インテリセンスも動作しますね。
f:id:koogucc11:20171118124125p:plain

 クエリを実行します。
f:id:koogucc11:20171118124159p:plain

 実行プランも表示することができます。
f:id:koogucc11:20171118124402p:plain

 設定は全て JSON なんですね。
f:id:koogucc11:20171118125050p:plain

 当然だとは思いますが、SSMS の方が機能はまだまだ充実しています。今後に期待ですね。

MacBook にすると逆に周辺機器が増える気がする....

SQL Server のチューニングについてまとめてみる - その 24 - ( これもチューニングについてまとめてみるだった )

 一応、その 24 でww
ryuchan.hatenablog.com

 ここ二日寝続けたので、腰痛が悪化...(´;ω;`)

カラー版 9割の腰痛は自分で治せる (中経の文庫)

カラー版 9割の腰痛は自分で治せる (中経の文庫)

臨床研究で実証! 80%以上が改善!  「ねたままストレッチ」で腰痛は治る!

臨床研究で実証! 80%以上が改善! 「ねたままストレッチ」で腰痛は治る!

SQL Server のチューニングについてまとめてみる - その 23 - ( 色々な観点が必要です。 )

 今週月曜日から本日まで2日間、高熱を出してしまいお休みを頂いておりました。しかも、昨日の夜には子供に感染し、本日は妻にまで感染(´;ω;`) 非常にまずい状況です。発熱時にはやはり、麻黄湯エキスが効きますね。汗かきますし、短時間で熱が下げられます。
www.rad-ar.or.jp

 まだ、頭の回転がよくならないので、記事書いて元の状態に戻したいと思います。最近、下記の類のクエリを見かけました。(あくまでもサンプルです。実際のものとはことなります(当然ですね(笑)))

SELECT 
    *
FROM
    AdventureWorks2014.Sales.SalesOrderDetail 
WHERE
    SalesOrderID IN (43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689)
AND ProductID IN (720,721,722,723,725,726,727,729,730,732,733,736,738,739,741,742)

 下記のインデックスも作成しています。

CREATE NONCLUSTERED INDEX [SampleIndex]
ON  [Sales].[SalesOrderDetail](
        [SalesOrderID] ASC,
        [ProductID] ASC
    ) INCLUDE(
        [SalesOrderDetailID],
        [CarrierTrackingNumber],
        [OrderQty],
        [SpecialOfferID],
        [UnitPrice],
        [UnitPriceDiscount],
        [LineTotal],
        [rowguid],
        [ModifiedDate]
    )

 そして、実行プランは下図の通りです。一見、そんなに問題のないプランに見えますね。
f:id:koogucc11:20171017234433p:plain

 このような残念なクエリでも、テーブルの件数が数十万、数百万であれば大した問題にはなりませんが、これが数億オーバーのテーブルになると途端に問題が発生します。上図のクラスターシークで数千万件ヒットしたとします。それだけでも大惨事ですが、その次のフィルター処理も非常に時間がかかってしまいます。しかも、件数が多いことから SQL Serverクラスターシークから Parallel 処理に切り替えますので、その後の処理もすべて Parallel 処理に切り替わりますので、余計な CPU コストも使用することになってしまいます。

 すこしトリッキーかもしれませんが、下記のように変更するのも一つの手法です。

;WITH SalesOrderDetail_CTE(
    SalesOrderID,
    SalesOrderDetailID,
    CarrierTrackingNumber,
    OrderQty,
    ProductID,
    SpecialOfferID,
    UnitPrice,
    UnitPriceDiscount,
    LineTotal,
    rowguid,
    ModifiedDate)
AS(
SELECT 
    *
FROM
    AdventureWorks2014.Sales.SalesOrderDetail
WHERE
    ProductID IN (720,721,722,723,725,726,727,729,730,732,733,736,738,739,741,742)
)
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43659
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43660
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43661
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43662
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43663
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43664
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43665
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43666
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43667
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43668
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43669
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43670
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43671
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43672
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43673
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43674
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43675
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43676
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43677
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43678
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43679
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43680
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43681
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43682
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43683
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43684
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43685
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43686
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43687
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43688
UNION ALL
SELECT * FROM AdventureWorks2014.Sales.SalesOrderDetail WHERE SalesOrderID = 43689

 実行プランは下図の通りです。一瞬、『ん?』と思われるかもしれませんが、重たい Filter 処理がなくなっており、Where 句条件がすべてシーク述語になっています。
※述語などの内容について下記を参照
ryuchan.hatenablog.com
 その結果、非常に高速にアクセスできています。実際、IO も減少しています。
f:id:koogucc11:20171017235611p:plain

 ご興味のある方は、STATISTICS TIME,IO などで確認してみてください。使い方は下記の記事を参照してください。
ryuchan.hatenablog.com

 実行プランの見方がわからない方は、下記のシリーズを。
ryuchan.hatenablog.com

チューニングについては下記のシリーズを。
ryuchan.hatenablog.com

 行数が非常に多い場合の一つの例として見ていただければ幸いです。チューニングには色々な経験と観点が必要ですので。

 ※ちなみに、実際のプランはこんな感じです。見ただけで寒気がしますね(笑)
f:id:koogucc11:20171018001241p:plain

 相変わらす SQL Server 本は少ないなぁ....

SQL Server 2016の教科書 開発編

SQL Server 2016の教科書 開発編

SQL Server 2016データベース構築・管理ガイド Enterprise対応

SQL Server 2016データベース構築・管理ガイド Enterprise対応

 風邪対策しないとね。

カルピス 守る働く乳酸菌 L-92 200ml×24本

カルピス 守る働く乳酸菌 L-92 200ml×24本

 これ、最強。

SQL Server 2012 SP4 をみてみる

 いい天気に恵まれました。そして、数か月ぶりの連休。ゆっくり過ごせました。しかし、明日からまた怒涛の出張が待っています。今月は国内外合わせてあと 10 回の搭乗がまっています...さて、気を取り直して...先週、SQL Server 2012 の SP4 がリリースされました。まだまだ、SQL Server 2012 を使用しているシステムも多いかと思います。(自分の参画しているプロジェクトではまだまだ主力です...)
blogs.msdn.microsoft.com

2014 と 2016 の機能がいくつか 2012 にフィードバックされますね。DMV、拡張イベントとか、クエリプランの機能強化とか、DBCC CLONEDATABASなど監視、パフォーマンスチェックなどに必要な機能がフィードバックされているのはうれしいですね。

  • All fixes and Cumulative Updates (CUs) for SQL Server 2012 up to and including SQL Server 2012 SP3 CU10.Scalability and performance improvements for SQL Server.
  • Additional monitoring capabilities through enhancements in DMV, Extended Events and Query Plans and the ability to clone the database including statistics with DBCC CLONEDATABASE.
  • New improvements based on Connect feedback items filed by the SQL Server Community.
  • Some of the improvements originally introduced in SQL Server 2014 SP2 and SQL Server 2016 SP1.

 Premium Assuranceを使用すると製品サポートを6年間延長できますyo!

Customers running SQL Server 2012 can extend their product support lifecycle by six years with Premium Assurance. Learn more about this option and read the Premium Assurance datasheet to explore this opportunity to stay compliant with minimal disruption.

 色々試そうかと思いましたが、明日の顧客先に持っていく資料ができていないので、ここでおわりでございます

 今日は秋冬物のスーツ買ったり、壊れてしまったリモワのボレロの代わりを探してました。ここ一年くらいは、多いときに週4回くらい使っていたので、壊れても仕方ない、かな。


 二輪が好きなんですが、最近四輪のスーツケースが売れ筋らしく、二輪のスーツケースがあまり売ってません。色々さがした結果、見た目で判断して、エンド―鞄株式会社 の『フリークエンター』にチョイス。