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

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

SQL Server を起動してから、まったく使用されていないストアドプロシージャを探しみる

 ふと、思いついたので投稿します。使ってない無駄な資源を探すのって、結構やること多いですよね。使用してない(と思われる)ストアドプロシージャを抽出してみたいと思います。下記のクエリを SQL Server Management Studio で実行してみましょう。

SELECT 
    [ストアド名] = s.name + '.' + p.name
FROM 
    sys.procedures p
    LEFT JOIN 
        sys.dm_exec_procedure_stats ps ON
        p.object_id = ps.object_id AND 
        ps.database_id = DB_ID()
    LEFT JOIN 
        sys.schemas s ON
        p.schema_id = p.schema_id
WHERE  
	ps.cached_time IS NULL

f:id:koogucc11:20160528225417p:plain
 
 出力された一覧が SQL Server を起動してから一度も実行されていないストアドプロシージャとなります。

来週は久々の新潟出張。何か美味しいもの食べたいなぁ。

新潟本 (エイムック 3228)

新潟本 (エイムック 3228)

SQL Server OS スケジューラーの前に、必要なものあったなと思って記事かいてみる

 SQL OS スケジューラーと NUMA、スケジューラーで動作するワーカーの数などが一目で判断できます。
ryuchan.hatenablog.com

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

SELECT
    [ノードID] = ons.node_id,
    [ノードの状態] = ons.node_state_desc,
    [メモリーノードID] = ons.memory_node_id,
    [プロセッサグループ] = ons.processor_group,
    [オンラインのスケジューラー数] = ons.online_scheduler_count,
    [アイドル状態のスケジューラー数] = ons.idle_scheduler_count,
    [ノード上のアクティブワーカー数] = ons.active_worker_count,
    [ノード上の平均タスク数] = ons.avg_load_balance,
    [メモリオブジェクトのアドレス] = ons.memory_object_address,
    [メモリークラークのアドレス] = ons.memory_clerk_address,
    [IOに関連しているワーカーのアドレス] = ons.io_completion_worker_address,
    [メモリーノードID] = ons.memory_node_id
FROM
    sys.dm_os_nodes ons

f:id:koogucc11:20160528113800p:plain

sys.dm_os_nodes と合わせて sys.dm_os_memory_objects、sys.dm_os_memory_clerks、sys.dm_os_workers、sys.dm_os_memory_nodes を使用することによってより詳細な情報を得ることができます。

最近、Lenovo 調子悪い。もうすぐ 4年か。
f:id:koogucc11:20160528115252p:plain

次期 PC をただいま絶賛選定中!

こんなサイトあるんだと思って記事書いてみた

 SQL ServerTLS 1.2 対応されてましたね。素早い対応ですね。
blogs.technet.microsoft.com

 KB3135244 です。
https://support.microsoft.com/en-us/kb/3135244

 そんでもって、接続文字列も何かしら変わるのかなと思って調べていたら、下記のようなサイトを見つけました。connectionstrings.com 、そう接続文字列に関するサイトですwwwなんとマニアックなサイトwww
connectionstrings.com

 もちろん SQL Server もあります。
connectionstrings.com

 HTML テーブル??
connectionstrings.com

 SQL Server のデータ型のまとめ。
connectionstrings.com
 
 基本的な記事もあります。
connectionstrings.com

 WebConfig などの記事もありますね。
connectionstrings.com

洋書は今年にでちゃうのね。いいなぁ。

Professional Microsoft SQL Server 2016 Reporting Services and Mobile Dashboards

Professional Microsoft SQL Server 2016 Reporting Services and Mobile Dashboards

SQL Server 2016 In-Memory Database: In-Memory OLTP and Real Time Analystics (English Edition)

SQL Server 2016 In-Memory Database: In-Memory OLTP and Real Time Analystics (English Edition)

SQL Server 2016 High Availability Unleashed  (includes Content Update Program)

SQL Server 2016 High Availability Unleashed (includes Content Update Program)

SQL Server のメモリの状態を簡単に確認してみる

 SQL Server のメモリ状態のチェック方法に関して質問受けてた気がするので、記事にしちゃいます。眠いので、少し手抜きになってますがお許しください(=_=)
 メモリの状態を知る必要があるので、物理メモリ、SQL Server のメモリとか一度にチェックできるようにしたいと思います。OS 自体のメモリ状態の把握には、sys.dm_os_sys_memory を使用し、SQL Server のメモリ状態の把握には、sys.dm_os_sys_info を使用します。それでは、早速 SQL Server Management Studio で下記のクエリを実行してみましょう。

SELECT
    [総物理メモリサイズ(Kbyte) ] = osm.total_physical_memory_kb,
    [使用できる物理メモリサイズ(Kbyte) ] = osm.available_physical_memory_kb,
    [SQL Server がコミット済みにしてるメモリサイズ(Kbyte)] = osi.committed_kb,
    [SQL Server が使用可能だと思っているメモリサイズ(Kbyte)] = osi.committed_target_kb,
    [SQL Server が使用可能だと思っているメモリサイズ(Kbyte, committed_target_kbと同じだよ)] = osi.visible_target_kb,
    [メモリまだ余裕状態] = osm.system_high_memory_signal_state,
    [メモリもう余裕ない状態] = osm.system_low_memory_signal_state,
    [メモリの状態の説明] = osm.system_memory_state_desc
FROM
    sys.dm_os_sys_info osi CROSS APPLY sys.dm_os_sys_memory osm

f:id:koogucc11:20150901015654p:plain
f:id:koogucc11:20150901015757p:plain

 ざっくり説明すると、下記の通りです。

  • [総物理メモリサイズ(Kbyte)] と [使用できる物理メモリサイズ(Kbyte)]はみなさまご存じの通り( My Lenovo の場合 )。
    f:id:koogucc11:20150901014935p:plain
  • [SQL Server が使用可能だと思っているメモリサイズ(Kbyte)] は、OS の状況や、下図の MaxServerMemory の状態により変動します。
    f:id:koogucc11:20150901014253p:plain
  • [SQL Server がコミット済みにしてるメモリサイズ(Kbyte)] < [SQL Server が使用可能だと思っているメモリサイズ(Kbyte)] の場合は、SQL Server はどんどんメモリを獲得しようと活発に動き始めます。
  • [メモリまだ余裕状態]:1の場合は、メモリにまだ余裕がある状態です。[メモリもう余裕ない状態]:1の場合は、メモリに余裕のない状態です。

※夏には行けなかったので、秋になったらキャンプ行きたい♪今年は、ファイアグリル買わないとなぁ。どれがいいかなぁ。週末お店に見に行ってみよう♪

ユニフレーム(UNIFLAME) ファイアグリル 683040

ユニフレーム(UNIFLAME) ファイアグリル 683040

キャプテンスタッグ(CAPTAIN STAG) ヘキサステンレスファイアグリルM M-6498

キャプテンスタッグ(CAPTAIN STAG) ヘキサステンレスファイアグリルM M-6498

尾上製作所(ONOE) フォールディングファイアスタンド FF-35

尾上製作所(ONOE) フォールディングファイアスタンド FF-35

発行する SQL の列とか、その長さとか、もろもろのメタデータを取得してみる

 dmv とかで調査クエリを実行しているときに、『他にどんな列あったっけ?』ということがよくあります。(いつも使用している dmv でさえ、すぐ忘れますww) その時に便利なのが、sys.dm_exec_describe_first_result_set (Transact-SQL) です。この動的管理関数は、ステートメントの最初の結果セットのメタデータを返却してくれます。早速実行してみましょう。

SELECT 
    * 
FROM 
    sys.dm_exec_describe_first_result_set(
        N'SELECT * FROM sys.dm_os_memory_objects', 
        NULL, 0)

f:id:koogucc11:20150831122734p:plain

※新しいマシンほしいなぁ。Lenovo yoga 4 が出たら買おうかな。

新しいチェックポイント ( 間接チェックポイント ) について調べてみた

 去年の終わりに下記のような記事を投稿しました。

データベース チェックポイント (SQL Server) を参考にしています。
 
 SQL Server 2012 以前のチェックポイントの仕様は下記の通りです。

name Transact-SQL インターフェイス 説明
自動 EXEC sp_configure 'recovery interval','seconds' recovery interval サーバー構成オプションに指定された期限に合わせて、バックグラウンドで自動的に発行されます。 自動チェックポイントは、最後まで実行されます。 自動チェックポイントは、未処理の書き込み数と、20 ミリ秒を超える書き込み待機時間の上昇をデータベース エンジンが検出したかどうかに応じて調整されます。詳細については、「recovery interval サーバー構成オプションの構成」を参照してください。
手動 CHECKPOINT [ checkpoint_duration ] Transact-SQL CHECKPOINT コマンドを実行すると発行されます。 接続している現在のデータベースで手動チェックポイントが作成されます。 既定では、手動のチェックポイントは最後まで実行されます。 調整は自動チェックポイントの場合と同様に行われます。 必要に応じて、checkpoint_duration パラメーターを使用し、チェックポイントを完了するのに必要な時間を秒単位で指定します。詳細については、「CHECKPOINT (Transact-SQL)」を参照してください。
内部 なし ディスク イメージがログの現在の状態と一致することを保証するために、バックアップやデータベース スナップショット作成など、さまざまなサーバー操作によって発行されます。

 SQL Server 2012 以降では、『間接』が追加されました。

name Transact-SQL インターフェイス 説明
自動 EXEC sp_configure 'recovery interval','seconds' recovery interval サーバー構成オプションに指定された期限に合わせて、バックグラウンドで自動的に発行されます。 自動チェックポイントは、最後まで実行されます。 自動チェックポイントは、未処理の書き込み数と、20 ミリ秒を超える書き込み待機時間の上昇をデータベース エンジンが検出したかどうかに応じて調整されます。詳細については、「recovery interval サーバー構成オプションの構成」を参照してください。
間接 ALTER DATABASE … SET TARGET_RECOVERY_TIME =target_recovery_time { SECONDS , MINUTES } 所定のデータベースのユーザーが指定したターゲット復旧時間に合わせて、バック グラウンドで発行されます。 既定のターゲット復旧時間は 0 です。この場合、自動チェックポイント ヒューリスティックがデータベースで使用されます。 ALTER DATABASE を使用して TARGET_RECOVERY_TIME を >0 に設定した場合、サーバー インスタンスに指定された復旧間隔ではなく、この値が使用されます。詳細については、「データベースのターゲットの復旧時間の変更 (SQL Server)」を参照してください。
手動 CHECKPOINT [ checkpoint_duration ] Transact-SQL CHECKPOINT コマンドを実行すると発行されます。 接続している現在のデータベースで手動チェックポイントが作成されます。 既定では、手動のチェックポイントは最後まで実行されます。 調整は自動チェックポイントの場合と同様に行われます。 必要に応じて、checkpoint_duration パラメーターを使用し、チェックポイントを完了するのに必要な時間を秒単位で指定します。詳細については、「CHECKPOINT (Transact-SQL)」を参照してください。
内部 なし ディスク イメージがログの現在の状態と一致することを保証するために、バックアップやデータベース スナップショット作成など、さまざまなサーバー操作によって発行されます。

 下記の記事に設定方法等が記載されています。

 上記のブログにも、以下の通り利点・欠点が記載されています。

  • Advantages of Indirect Checkpoints
    They can reduce the overall recovery time for a specific database.You can control the database recovery time by factoring in the I/O cost during the REDO phase.They also reduce potential I/O spiking issues during the checkpoint process by continually writing to disk.
  • Disadvantages of Indirect Checkpoints
    One thing to be aware of is that there could be a performance hit if you enable indirect checkpoints on a very busy OLTP database, because of the increased IO load by the background writer operation. So make sure you test this in a Test environment before enabling in Production.

 リカバリ時間をある程度制御できるのは、運用面からして非常に大きな利点でしょう。欠点は、設定する値や使用環境によってはIOが現状より悪化してしまうことがあるということです。実際に使用する場合には、実際のIOなど加味した上で十分なテストが必要ですね。