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

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

便利な SQL の関数とか、構文とか、その他色々まとめてみる - その18 ( 令和元年記念投稿 )

 平成も終わり、令和が始まりました。平成最後の年は、自分自身として人生の転機でした。ただ、まだまだ進化はしていきたいので、変化を恐れず進んでいきたいと思っています。
 今回は、TRANSLATE (Transact-SQL) - SQL Server | Microsoft Docs について説明します。一見、REPLACE (Transact-SQL) - SQL Server | Microsoft Docs 似ていますが、REPLACE では複雑になってしまう処理も TRANSLATE では非常に簡潔に記述することが可能です。それでは、REPLACE と TRANSLATE で記述内容を比較してみましょう。下記のクエリを SQL Server Management Studio で実行してみましょう。

DECLARE @str NVARCHAR(255) = 'aaa,aaa,aaa|bbb,bbb,bbb'

SELECT
    REPLACE(REPLACE(REPLACE(@str,'|','*'),',','|'),'*',',') [REPLACE],
    TRANSLATE(@str, ',|', '|,') [TRANSLATE]

f:id:koogucc11:20190429083951p:plain
REPLACE と TRANSLATE の実行結果

 TRANSLATE は下記の部分が特徴となります。

TRANSLATE 関数の動作は、複数の REPLACE 関数を使用した場合と似ています。 ただし、TRANSLATE では文字が複数回置き換えられることはありません。 これは、使用するたびに関連するすべての文字が置き換えられる複数の REPLACE 関数とは異なります。

 ストアドプロシージャでよく RELACE 関数が何重にも入れ子になっている処理を見かけることがあります。全ての場合において使用できるわけではありませんが、TRANSLATE を使って、複雑になってしまったストアドプロシージャをリファクタリングしましょう。

The features you should know about SQL Server Management Studio - Part 14 - (New Features in SSMS 18)

Golden Week of 10 consecutive holidays has started. It's a historical Golden Week that changes from HEISEI( 平成 ) to REIWA( 令和 ) during consecutive holidays. Recently, I thought that SQL Server CTP update was quick. SSMS 18 has become generally available. Whenever a new version comes out related to SQL Server, I tend to look around dmv, execution plans. Since there were changes in the SSMS graphical execution plan, I tried it.

  • AdventureWorks2017, SalesOrderHeader is used.
  • A NonClustered index of OrderDate is created.

Let's execute the following query in SQL Server Management Studio!

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,
    ModifiedDate
FROM
    AdventureWorks2017.Sales.SalesOrderHeader WITH(INDEX(NonClusteredIndex))
WHERE
    OrderDate BETWEEN '2011-05-30 00:00:00.000' AND '2012-05-31 00:00:00.000'

f:id:koogucc11:20190427181744p:plain
Execution Result

The operator sees something that is unfamiliar when you look closely.

f:id:koogucc11:20190427182111p:plain
New one is displayed to the operator!

The elapsed time, actual number of lines and estimated number of lines are displayed. This sounds good. It is possible to check if there is a statistical problem or not. The red line of 3028 is the actual line, and the blue line of 3041 is the estimated number of lines.

f:id:koogucc11:20190427182532p:plain
actual number of lines and estimated number of lines

Every time a version is upgraded, good improvements are added. Thanx!

SQL Server Management Studio の知っておいたほうが良い機能について挙げてみる - その14 - ( SSMS 18 の新しい機能 )

 さて、10 連休のゴールデンウィークが始まりました。しかも、連休中に平成から令和に変わるという歴史的なゴールデンウィークです。最近、SQL Server の CTP のアップデートが早いなぁと思っていたら、SSMS の 18 が GA されました。SQL Server 関連で新しいバージョンが出たときはどうしても、dmv、実行プラン周りなどに目がいきがちです。SSMS のグラフィカルな実行プランで変更があったので、早速試してみました。
※AdventureWorks2017, SalesOrderHeader を使用しています。
※OrderDate の非クラスタ化インデックスを作成しています。

 下記のクエリを SQL Server Management Studio で実行してみましょう。

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,
    ModifiedDate
FROM
    AdventureWorks2017.Sales.SalesOrderHeader WITH(INDEX(NonClusteredIndex))
WHERE
    OrderDate BETWEEN '2011-05-30 00:00:00.000' AND '2012-05-31 00:00:00.000'

f:id:koogucc11:20190427181744p:plain
実行結果

 よく見ると見慣れないものがオペレータに表示されています。

f:id:koogucc11:20190427182111p:plain
オペレーターに新たな何かが表示されている!?

 オペレーター単位の経過時間、実際の行数および推定の行数が表示されています。これはいいですね。パッとみて統計の問題が発生していないかなど判断することが可能です。赤線の引かれている 3028 が実際の行、青線の引かれている 3041 が推定の行数です。

f:id:koogucc11:20190427182532p:plain
実際の行数と推定の行数

 バージョンアップされるたびに、いい改善が追加されていますね。有難いです。

 こんな SQL Server 本あるのか。ちょっと見てみたい。

 こんな感じのキャンプで使えるチェア欲しい。

 

SQL Server の構造について記事にしてみる - その4 ( SQL Server 2019 をインストールしたら、sys.dm_db_page_info というものを見つけたのでちょっと動きをしらべてみた ) -

 少しだけ SQL Server 2019 をお触りしてみました。その中で一つ気になった sys.dm_db_page_info (Transact-SQL) - SQL Server | Microsoft Docs というものがあり、もしや DBCC PAGE の代替となるものでは!と思い調べてみました。

 DBCC PAGE といえば、『 SQL Server の構造について記事にしてみる 』 でインデックスの構造を調査するのに使用していました。
ryuchan.hatenablog.com

 その後、図とか色々と書くのが面倒なため、シリーズはその3で打ち切りとなっていました(笑) 今回はちょっと興味を持ったので、勢いにまかせて一気に記事書きます。
※『 SQL Server の構造について記事にしてみる - その3 』で使用したクエリをベースにします。
※ データベースは、AdventureWorks2017 を使っています。
※テーブルは、Sales.SalesOrderHeader を使っています。

 それでは、早速下記のクエリを SQL Server Management Studio で実行してみましょう。

SELECT
    dpa.allocated_page_page_id,
    dpa.page_type,
    dpa.page_type_desc,
    dpa.page_level,
    dpa.next_page_page_id,
    dpa.previous_page_page_id
FROM
    sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID('Sales.SalesOrderHeader'), null, NULL, 'DETAILED') dpa

f:id:koogucc11:20190421113513p:plain
クエリの結果

 次に、下記のクエリを SQL Server Management Studio で実行してみましょう。

DBCC TRACEON(3604)
DBCC PAGE(N'AdventureWorks2017',1,16416,3) WITH TABLERESULTS
DBCC TRACEOFF(3604)

f:id:koogucc11:20190421113826p:plain
DBCC PAGE の結果

 次に、dm_page_info を使ったクエリを SQL Server Management Studio で実行してみましょう。

SELECT
    pi.*
FROM
    sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID('Sales.SalesOrderHeader'), null, NULL, 'DETAILED') dpa 
CROSS APPLY 
    sys.dm_db_page_info(dpa.database_id, dpa.allocated_page_file_id, dpa.allocated_page_page_id, 'DETAILED') pi
WHERE
    dpa.allocated_page_page_id = 16416

f:id:koogucc11:20190421114418p:plain
f:id:koogucc11:20190421114435p:plain
f:id:koogucc11:20190421114447p:plain

f:id:koogucc11:20190421114457p:plain
dm_page_info の結果

 DBCC PAGE のヘッダー情報にあたるものくらいが取得できるようです。Undocumented な DBCC コマンドが dmv 化されたか!?と思ったのですが、DBCC PAGE の全ての情報を参照できるものでは無いようです。バージョンアップされることで、データ部、個別情報を出力できる dmv が追加( dm_page_info_detail... とか? )されるのでしょうか。今後のバージョンアップに期待ですね。

最新の iPad mini が欲しい。

Apple iPad mini 4 (Wi-Fi, 128GB) - シルバー (第4世代)

Apple iPad mini 4 (Wi-Fi, 128GB) - シルバー (第4世代)

けど、iPad Pro 11 に使える Pencil も欲しい。
www.amazon.co.jp

SQL Server Management Studio の知っておいたほうが良い機能について挙げてみる - その13 - ( オブジェクトエクスプローラーの詳細って? )

 お久しぶりです。もう半年ほど記事投稿していませんでした。そして、二カ月ほど SQL Server を扱っていませんでした。時間もあったんですが、仕事で使わないものは中々使う気にならないですし、記事にしようという気力が湧かないものです。今日久しぶりに Windows Update をしようかと思い、Parallels から Windows を起動してみました。そして、ついでに SQL Server Management Studio を 17.9.1 へアップデートしてみました。
 

f:id:koogucc11:20190416002014p:plain
懐かしの SSMS 笑

 メニューを触っていると、表示→オブジェクトエクスプローラーの詳細というメニューを見つけました。クリックしたこともなかったので、クリックしてみます。ふむ、選択したオブジェクトの詳細が参照できるわけですね。

f:id:koogucc11:20190416002707p:plain
オブジェクトエクスプローラーの詳細でデータベースを選択

 さらにクリックして行くと、テーブルのプロパティも参照できます。

f:id:koogucc11:20190416003014p:plain
オブジェクトエクスプローラーの詳細でテーブルを選択

 列を右クリックすると、一覧に表示する列をカスタマイズできます。

f:id:koogucc11:20190416003219p:plain
オブジェクトエクスプローラーの詳細の列で右クリック

 うーん。dmv 使ってクエリ書くかな笑。久しぶりの投稿内容が薄っぺらくて申し訳ありませんでした。

 少し前に第三世代の iPad Pro 買ったから、Apple Pencil 2 も欲しいなぁ。

Apple Pencil(第2世代)

Apple Pencil(第2世代)

 Apple Watch 4 のベルトを新調。純正は高いので、お安いものを購入。

やはりダークテーマはいいなぁと思って SSMS ver. 18 Preview 4 を扱っていたら、Azure Data Studio とか見えたのでお試してみた

 SQL Server Management Studio 18 preview 4 がリリースされました。
cloudblogs.microsoft.com

 やっぱりダークテーマはいいですね。可能であれば、オブジェクトエクスプローラーも Visual Studio と同じくダークなテーマになるとより見やすくなるかなと思います。(おそらく正式リリースでは対応されるんでしょう。)
f:id:koogucc11:20181007225018p:plain

 明るい箇所があると目に優しくないですね。
f:id:koogucc11:20181007225428p:plain

 mac も速攻ダークに変えました。たまに対応していないツールがあったりすると、目が疲れますが....

 ちょっとメニューを触っていたら、見慣れない ( というか自分が情弱なだけ? ) 項目が目に入ってきました。Azure Data Studio。
f:id:koogucc11:20181007225609p:plain

 インストールしてみました。あれ、SQL Operations Studio じゃない?名前が変更されたんですかね?
f:id:koogucc11:20181007230751p:plain

 色々リリースされていますね。もうまったくついていけていません。SQL Server については情弱の一途をたどっています...

 これくらいのバッテリーがほしくなってきました。キャンプ兼災害時用。色々あって迷ってしまいます。やはり信頼性の高い Anker ですかね?

 ソーラーパネルもあると対策としては完璧かもしれませんね。