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

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

今年たてた抱負をみてみる

 こんな事書いてました。
ryuchan.hatenablog.com

  1. 将来のことを考えてみたい。
    引き続き。
  2. 自分にあった仕事は何か考えてみる。
    引き続き。
  3. マイクロソフトの技術に強くなる。
    引き続き。
  4. MCP を更新する。( MCITP とかそのまま放置してる。)
    2016出たら考えよう。
  5. インフラ関係に強くなる。
    まだまだ知識が薄いので。
  6. ブログを継続する
    当然継続します。
  7. 勉強会も二回以上は開催する。
    去年と同様継続します。

 ふぅ。相変わらず達成していないものが多いです。MCPMCITP から全然更新していないなぁ。来年の抱負は少し少な目にしようww 一つづつ確認してみると、

  1. 将来のことを考えてみたい。
    働き方を変えたいのと、自分の好きなことをもっと生かせるようにしたい。
  2. 自分にあった仕事は何か考えてみる。
    エンジニアであることは間違いないです。
  3. マイクロソフトの技術に強くなる。
    あんまり変わってないかなぁ。本当進歩がないです。
  4. MCP を更新する。( MCITP とかそのまま放置してる。)
    2016 出ましたが、まだ考えてないです。
  5. インフラ関係に強くなる。
    ネットワーク、仮想化関係は若干強くなったかな?と思います。
  6. ブログを継続する
    継続した。
  7. 勉強会も二回以上は開催する。
    二回は開催してません....

ある程度達成可能なものにしよう。数減らそう。

今年の抱負

今年の抱負

SQL Server v.Next CTP1.0 で追加された DMF をお試してみる

 もう一つ dmf をお試ししてみます。sys.dm_exec_query_statistics_xml です。
ryuchan.hatenablog.com

 sys.dm_exec_query_statistics_xml は、実行中リクエストのクエリ実行プランを返します。一時的な統計情報を含む showplan XML を取得することが可能です。下記のクエリを SQL Server Management Studio で実行してみましょう。(別セッションで何らかのクエリを実行させ続けてください。) ん?結果が得られませんね。

SELECT
    er.*,
    eqsx.*
FROM 
    sys.dm_exec_requests er
    CROSS APPLY sys.dm_exec_query_statistics_xml(er.session_id) eqsx

f:id:koogucc11:20161227005423p:plain

 トレースフラグを設定する必要がありそうです。下記のコマンドを SQL Server Management Studio で実行してみましょう。

DBCC TRACEON(7412,-1)

f:id:koogucc11:20161227005614p:plain

 再度下記のクエリを SQL Server Management Studio で実行してみましょう。結果を得ることができました。

SELECT
    er.*,
    eqsx.*
FROM 
    sys.dm_exec_requests er
    CROSS APPLY sys.dm_exec_query_statistics_xml(er.session_id) eqsx

f:id:koogucc11:20161227005919p:plain

 若干のオーバーヘッドはあるようですが、気にするほどでは無さそうです。

In TPC-C like workload tests, enabling the lightweight statistics profiling infrastructure adds a 1.5 to 2 percent overhead. In contrast, the legacy statistics profiling infrastructure can add up to 90 percent overhead for the same workload scenario.

インフルエンザ流行してきたと思ったら、ノロウィルスも来てますね。最近の餅つきイベントはその場でついた餅は破棄して、事前に衛生面が確保された場所で作られた餅を配ることが多いようです。こちらも対策が必要ですね。

サラヤ シャボネット ユ・ム P-5泡 1kg ポンプ付

サラヤ シャボネット ユ・ム P-5泡 1kg ポンプ付

SQL Server 2012 と SQL Server v.Next CTP1.1 の DMV と DMF の違いをチェックしてみる

 過去に 2012 と 2016 の dmv、dmf の違いを抽出しました。同じように 2012 と v.Next の違いもチェックしてみましょう。
ryuchan.hatenablog.com

 リンクサーバ名を VNEXTto2012 と定義します。下記のクエリを v.Next 側のインスタンスから実行します。

SELECT
    [SQLServerVNEXTのDMVとDMF] = sqlserverVNEXT.name,
    [SQLServer2012のDMVとDMF] = sqlserver2012.name,
    [種別] = sqlserverVNEXT.type,
    [備考] = sqlserverVNEXT.type_desc
FROM
    master.sys.system_objects sqlserverVNEXT
    FULL OUTER JOIN( SELECT
                         so.name,
                         so.type,
                         so.type_desc
                     FROM
                         VNEXTto2012.master.sys.system_objects so
                   ) sqlserver2012 ON
    sqlserverVNEXT.name = sqlserver2012.name
WHERE 
    sqlserverVNEXT.name LIKE 'dm_%'
ORDER BY 
    sqlserverVNEXT.name

f:id:koogucc11:20161225230443p:plain

 結果をざっと見てみると、見慣れない dmf がいました。赤枠の dm_db_stats_histogram です。object_id と stat_id を引数で渡せばいいようです。
f:id:koogucc11:20161225230726p:plain

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

SELECT
    s.*,
    sh.*
FROM 
    sys.stats s
    CROSS APPLY sys.dm_db_stats_histogram(s.object_id,s.stats_id) sh

f:id:koogucc11:20161225232130p:plain

 エラーになってしまいますね。しかし、単体で実行すると結果が出力されます。

SELECT
    *
FROM 
    sys.dm_db_stats_histogram(418100530,1)

f:id:koogucc11:20161225232903p:plain

 どうしてなんでしょう? CTP だから仕方ないんでしょうか。このあたり、統計の詳細情報を一覧で出せると結構便利そうですね。もう少し色々試してみよう....

YOGABOOK 用に買ってみたんですが、中々いい感じでした。

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

 冬至も過ぎ、今年も終わりを告げようとしています。この三連休、春を感じさせるような暖かさで、冬とは思えない陽気でした。インフルエンザ治癒にはよかったかもしれません。寝たきりのインフルエンザ生活から少しでも体調を回復すべく、近所でコーヒー飲みながらくつろいだり、運動のため散歩しました。
f:id:koogucc11:20161225141723j:plain

f:id:koogucc11:20161225144851j:plain

 SQL Server v.Next CTP 1.1 の機能を調査している時に、STRING_ESCAPE 関数を見つけました。SQL Server 2026 から追加された禁即文字列の変換を行う関数のようです。それでは早速試してみましょう。下記のクエリを SQL Server Management Studio で実行してみましょう。

SELECT STRING_ESCAPE('\   /  \\    "     ', 'json') AS escapedText

f:id:koogucc11:20161225181832p:plain

 ただ今のところ JSON に限定されているようです。そのうち XML や他のフォーマットにも対応していくのでしょう。

nvarchar(max) text with escaped special and control characters. Currently STRING_ESCAPE can only escape JSON special characters shown in the following tables.

 
インフルエンザには気を付けないといけませんね。予防大事です。

前から気になっていたので、以下の二つの違いを調べてみました。
tourokuhanbaisha.com

【第2類医薬品】ヒビスコールS 500mL

【第2類医薬品】ヒビスコールS 500mL

ヒビスコールSH 500ml/42309

ヒビスコールSH 500ml/42309

なるほど。

ビスコールS(第2類医薬品)
有効成分:クロルヘキシジングルコン酸塩0.2w/v%
ビスコールAと基本的に同じものですが、第2類医薬品扱いなので、ドラックストア等の店舗販売業でも取り扱うことができます。
また、第2類ということもあり、アマゾン、ケンコーコム等でネット通販が行われています。

ビスコールSH(指定医薬部外品
有効成分:クロルヘキシジングルコン酸塩0.1w/v%
クロルヘキシンジングルコン酸塩の濃度が、A,Sの半分になっています。区分も「指定医薬部外品」扱いなので、流通面での幅が広くなります。例えばホームセンター等でも販売可能になります。
もちろんネット通販も可能です。

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

 v.Next CTP1.1 では便利な関数がいくつか追加されています。前回はその内3つを紹介しました。
ryuchan.hatenablog.com

 集約関数である STRING_AGG が追加されています。SQL Server 2016 までの SQL Server では FOR XML PATH('') を駆使して実現する必要がありました。サンプルは下記の通りです。各テーブルのインデックスの列および付加列の情報を出力するクエリです。

SELECT 
    [データベース名] = DB_NAME(),
    [インデックス名] = i.name,
    [インデックスタイプ] = i.type_desc,
    [スキーマ名] = s.name,
    [テーブル名] = t.name,
    [インデックスな列達] = SUBSTRING(indnm,1,LEN(indnm) - 1),
    [付加な列達] = SUBSTRING(incnm,1,LEN(incnm) - 1)
FROM 
    sys.indexes i
    INNER JOIN sys.tables t ON 
    i.object_id = t.object_id
    INNER JOIN sys.schemas s ON 
    t.schema_id = s.schema_id
    INNER JOIN sys.objects o ON 
    i.object_id = o.object_id
CROSS APPLY 
(
    SELECT 
        c.name + ','
    FROM 
        sys.index_columns ic
        INNER JOIN sys.columns c ON 
        ic.object_id = c.object_id AND 
        ic.column_id = c.column_id
    WHERE 
        i.object_id = ic.object_id AND 
        i.index_id = ic.index_id AND 
        ic.is_included_column = 0
    ORDER BY 
        ic.key_ordinal ASC
    FOR XML PATH('')
) AS cra1(indnm)
CROSS APPLY 
(
    SELECT 
        c.name + ','
    FROM 
        sys.index_columns ic
        INNER JOIN sys.columns c ON 
        ic.[object_id] = c.object_id AND 
        ic.column_id = c.column_id
    WHERE 
        i.object_id = ic.object_id AND 
        i.index_id = ic.index_id AND 
        ic.is_included_column = 1
    ORDER BY 
        ic.key_ordinal ASC
    FOR XML PATH('')
) AS cra2 (incnm)

f:id:koogucc11:20161225095158p:plain
※上記のクエリ内容について説明している記事は下記の通りです。
ryuchan.hatenablog.com
ryuchan.hatenablog.com

 STRING_AGG を使用すると下記のように記述することができます。スッキリとした感じですね。

SELECT 
    [データベース名] = DB_NAME(),
    [インデックス名] = i.name,
    [インデックスタイプ] = i.type_desc,
    [スキーマ名] = s.name,
    [テーブル名] = t.name,
    [インデックスな列達] = (SELECT 
                                STRING_AGG(c.name,',') WITHIN GROUP (ORDER BY ic.key_ordinal ASC)
                            FROM 
                                sys.index_columns ic
                                INNER JOIN sys.columns c ON 
                                ic.object_id = c.object_id AND 
                                ic.column_id = c.column_id
                            WHERE
                                i.object_id = ic.object_id AND 
                                i.index_id = ic.index_id AND
                                ic.is_included_column = 0),
       [付加な列達] = (SELECT 
                           STRING_AGG(c.name,',')  WITHIN GROUP (ORDER BY ic.key_ordinal ASC)
                       FROM 
                           sys.index_columns ic
                           INNER JOIN sys.columns c ON 
                           ic.[object_id] = c.object_id AND 
                           ic.column_id = c.column_id
                       WHERE 
                           i.object_id = ic.object_id AND 
                           i.index_id = ic.index_id AND 
                           ic.is_included_column = 1)
    FROM 
        sys.indexes i
        INNER JOIN sys.tables t ON 
        i.object_id = t.object_id
        INNER JOIN sys.schemas s ON 
        t.schema_id = s.schema_id
        INNER JOIN sys.objects o ON 
        i.object_id = o.object_id

f:id:koogucc11:20161225095307p:plain

 v.Next いい感じです。

最近欲しくなってきた。

インフルエンザの症状もほぼなくなり、熱も36度台に下がったので SQL Server v.Next CTP1.1 の情報を見てみる

 世の中はすっかり Xmas ムードの真っ只中、自分にはインフルエンザをプレゼントされましたwww ようやく体調が回復したのは、クリスマスイブ。今年の Xmas はまったくついていません。しかし、そんなことには少しもめげず、クリスマスといえども記事を書きます。

 今回は、SQL Server v.Next で新しく追加された三つの関数を試してみます。まず一つ目は、TRIM です。これは長らく対応が待たれていたものではないでしょうか? RTRIM と LTRIM の組み合わせで何回も記述するのが面倒なので、関数を作成した方も多かったかと思います。(私もその一人。)
ryuchan.hatenablog.com

 二つ目は、CONCAT_WS です。これも個人的には欲しかった関数です。v.Next 以前のバージョンでは、各列をカンマで連結するのも下記のようにクエリを書く必要がありました。列数が多いと見た目も非常に悪いですね。

SELECT
    CONCAT(BusinessEntityID, ',', PersonType, ',', NameStyle, ',', Title, ',', FirstName, ',', MiddleName, ',', LastName, ',', Suffix, ',', EmailPromotion)
FROM
    Person.Person
WHERE
    BusinessEntityID = 1

 CONCAT_WS を使用すると、下記の通りスッキリ記述することができます。

SELECT
    CONCAT_WS(',', BusinessEntityID, PersonType, NameStyle, Title, FirstName,  MiddleName, LastName, Suffix, EmailPromotion)
FROM
    Person.Person
WHERE
    BusinessEntityID = 1

 三つ目は、TRANSLATE です。例えば、2*[3+4]/{7-2} という式を 2*(3+4)/(7-2) に変更する場合、どのようなクエリを記述するでしょうか?おそらく下記のようになるかと思います。(このような記述意外としてる方多いと思います。自分のまわりにも...)

SELECT REPLACE(REPLACE(REPLACE(REPLACE('2*[3+4]/{7-2}','[','('), ']', ')'), '{', '('), '}', ')')

 上記のクエリを TRANSLATE を使用すると、下記のように記述できます。こちらも同様スッキリ記述できます。

SELECT TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()')

 v.Next でいい関数が追加されていますね。クエリが美しくなる機能追加は良いことです。

インフルエンザで体の節々に痛みがあったけど、今回はバファリンが結構効いた。

【指定第2類医薬品】バファリンA 80錠

【指定第2類医薬品】バファリンA 80錠

プレミアムとかあるのか。

【指定第2類医薬品】バファリンプレミアム 40錠

【指定第2類医薬品】バファリンプレミアム 40錠