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

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

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錠

インフルエンザなってしまい、なんとか熱も37度台に下がったのでリハビリがてら最近何も見てなかった SQL Server 関連の情報を見てみる

 忘年会シーズンの真っ只中、インフルエンザになってしまいました。熱もやっとで 37度台になりましたので、SQL Server 関連の情報を3週間ぶりに見てみます。SQL Server next version Community Technology Preview 1.1 とかリリースされていたんですねーww
blogs.technet.microsoft.com

  • Language and performance enhancements to natively compiled T-SQL modules, including support for OPENJSON, FOR JSON, JSON built ins as well as memory-optimized tables support for computed columns.
  • Improved the performance of updates to non-clustered columnstore indexes in the case when the row is in the delta store.
  • Batch mode queries now support “memory grant feedback loops,” which learn from memory used during query execution and adjusts on subsequent query executions; this can allow more queries to run on -systems that are otherwise blocking on memory.
  • New T-SQL language features:
    • Introducing three new string functions: TRIM, CONCAT_WS, and TRANSLATE
    • BULK IMPORT supports CSV format and Azure Blob Storage as file source
    • STRING_AGG supports WITHIN GROUP (ORDER BY)s

 よし、三連休でやってみよう。(やっぱり怠い。)

最近、出張にはこいつばかり持っていきます。Halo キーボードにも慣れました。

YOGABOOK の開封の儀とノマドワークをしてみた

 12月、毎週恒例の怒涛の一週間が終わりましたww 今週は福岡と大阪に出張です。
ryuchan.hatenablog.com

 とうとう来ました、YOGABOOK!あまりの人気に10月に届く予定が12月初旬まで遅れました。早速、開封の議を行います。YOGA 900S と同じようなデザインの箱です。
f:id:koogucc11:20161210003454j:plain
※900S の開封の儀はこちら↓
ryuchan.hatenablog.com

 付属品は、USB ケーブル、電源、お絵かきのペン、メモパッド。
f:id:koogucc11:20161210004029j:plain

 軽さを実感するため、晴天の日曜日 YOGABOOK でノマドワークしてみました。900S と比較すると一回り小さいですね。
f:id:koogucc11:20161211201810j:plain

 900S も 990g と非常に軽量なのですが、YOGABOOK は 690g !! 同じような大きさのもので、iPad Pro ( 9.7 インチ ) が約 440g です。Halo キーボード、ワコムペンタブレットがついてこの軽さは脅威的です。まわりが明るいと Halo キーボードは明るさを最高にしても少し見えにくいですね。窓際の明るい座席では若干使いづらく感じるかもしれません。
f:id:koogucc11:20161211103354j:plain

 900S では若干作業の難しい狭いテーブルでも余裕でお仕事ができます。マウスを置いてもまだ少し余裕がありますね。
f:id:koogucc11:20161211134337j:plain

 普段携帯の充電で使用しているモバイルバッテリーで充電できました。ノマドワーカーにとってはうれしいですね。
f:id:koogucc11:20161211144640j:plain

 ポート類は、左側に Micro USB と Micro HDMI があります。
f:id:koogucc11:20161211144603j:plain

 Micro USB と Micro HDMI じゃなくて、USB Type-C にしてほしかった... 先週、充電ポートが Type-C の XPERIA XZ 購入したから... 900S も Type-C あるし... Micro USB、Micro HDMI とかなんとなく今時な感じじゃない...
f:id:koogucc11:20161211195016j:plain

 右側にはマイクロフォン/ヘッドフォン・コンボ・ジャック、音量調整ボタン、電源ボタンがあります。
f:id:koogucc11:20161211145550j:plain

 店内が少し暗めだと、Halo キーボードは非常に見易いです。
f:id:koogucc11:20161211162442j:plain

 Lenovo YOGA シリーズの最大の特徴ともいえる、ウォッチバンドヒンジが艶やか。
f:id:koogucc11:20161211162541j:plain

 キーボードのタッチトーンと振動音は『 C:\Program Files\Lenovo 』 配下にインストールされている設定アプリで調整できます。
f:id:koogucc11:20161211204518p:plain
 
 ON と OFF しかないので、ON にするとタッチトーンと振動が気になるし、OFF にするとキーボードを押している感じがしません。タッチトーンと振動を微調整できると非常に助かるんですが...ちょっと静かなカフェで ON のままで作業すると隣の人に迷惑かかりそうです。ファーム、ソフトの改善でなんとかならないですかね?

 価格も元に戻りましたね。