MSSQL

SET STATISTICS PROFILE

実行計画をグリッド(テキスト)で出力する際のオプション。 SSMSでグラフィカルに見るとは別に値を保存しておきたい場合に使用する。 使用例 SET STATISTICS PROFILE ON select *From tbl_hoge2 where columns_k1 = 'aaaa' 同様にXML形式とするSET STATISTICS…

統計情報の取得履歴

統計情報がいつ更新されたかはSTATS_DATE関数で取得できる 使用例 SELECT so.name, ss.name as 統計情報名, ss.auto_created as 統計情報の自動生成, ss.user_created as 統計情報のユーザー生成, ss.no_recompute as NO_RECOMPUTEオプションの使用, STATS_D…

パーティションテーブル

SQL Serverでパーティションテーブルを作成するには事前にパーティション関数、パーティション構成を作成する必要がある。 作成例のSQL /* パーティション関数を作成 */CREATE PARTITION FUNCTION PT_HOGE(char(8)) AS RANGE LEFT FOR VALUES('20200101','20…

一時テーブルにBULKINSERT

テキストをそのまま取り込むのではなく関数等で加工したものを取り込みたかったので 一度、一時テーブルに取り込んだSQLサンプル /* 一時テーブルの作成 */ CREATE TABLE #tbl_hoge( [colums_a] [nchar](10) NOT NULL, [colums_b] [nchar](10) NULL, [colums…

OracleとSQLServerのロック2

Oracle →別トランザクションの更新中データに対して、変更前のデータを読み取ることができる。optimistic(楽観的同時実行制御) MVCCと呼ばれる同時実行性向上の仕組みのため SQL Server →デフォルトでは更新中のデータはロックがかかるためアクセスできない …

NOLOCKロックヒント

SQL SERVERでダーティリードがしたい場合のヒント。NOLOCKをつけると他のトランザクションで実行途中の値が参照できる。※処理時間の長いバッチなどの実行経過の確認などで活躍するのでは select * from テーブル名 WITH(NOLOCK) 普段の処理ではその後ロール…

OracleとSQLServerのロック

どちらも「READ COMMITTED」がデフォルトとなっている。ただ、SQL Serverには「READ_COMMITTED_SNAPSHOT」のオプションがあり、その値によってOracleと挙動が違う。※READ COMMITTED・・・コミットされてないデータは読み取れない 「READ_COMMITTED_SNAPSHOT…

複数レコードの文字列を結合

FOR MXL PATHを使用すると複数レコードを1レコードに結合して取得できる。 カンマ区切りで取得すSQL例 select hoge_name + ',' from hoge_tbl for xml path('') 取得イメージ hoge_name --------------------- aaa bbb ccc ↓ aaa,bbb,ccc,

SQL プロファイラの成形

プロファイラのtrcファイルやxml形式へのエクスポートはみずらいので 以下のようにSQL Management Stadioからファイルを指定してグリッド形式で確認するとよい SELECT * FROM FN_TRACE_GETTABLE(N'C:\USERS\XXXXXXX\DESKTOP\無題 - 1.TRC',DEFAULT);「Durati…

クライアント統計

MS Management Stadioにクライアント統計という機能がある。 この統計をオンにしてSQLを実行するとそのSQLで要したコストを確認することができる。なお、出力結果の秒数の単位は10ミリ秒 使い方は以下の通り 1.「メニュー」→「クエリ」→「クライアント統計を…

TOP 句 PERCENT

TOPにPERCENT句を付けると上位N%のデータを取得することができる select TOP 50 PERCENT * from t_hoge order by hoge_id なお、以前はビューにTOP 100 PERCENTを付けるとOrder byが記述できることで並び替えができたビューが作成できていたが、 SQL Server …

バイナリデータのInsert

テーブル例 CREATE TABLE [dbo].[tblHoge]( [ID] [int] NOT NULL, [excel_data] [varbinary](max) NOT NULL, CONSTRAINT [PK_tblHoge] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLO…

saのパスワードのリセット

saのパスワードを忘れてしまったときのリセットする手順は以下の通り。 1.「セキュリティ」→「ログイン」→sa→「プロパティ」 2.「全般」タブでパスワードを入力する ※Windows統合認証ではログインできることが前提 動作確認環境:SQLServer 2014 Express

mdfファイルのみのアタッチ

mdfファイルのみ存在する場合、通常にアタッチしようとするとエラー9003が発生しアタッチできない。 もし、アタッチしたい場合は、一旦SQLServerはオフラインにし、 アタッチしたいmdfファイル名を既存のmdfファイル名にリネームしてSQL Server を起動すると…

tempDBのファイル数をCPU数に合わせる

sys.dm_exec_requestのWaitTypeでページラッチ(PAGELATCH)に関する待機イベントが 多発している場合、tempdbに対する競合がおこっている可能性があるので プロセッサ(コア)の数と同じ数にtempdbのファイル数を増やしてやるとよい。 (特に一時テーブルなど…

現在実行中のSQLを調べる

sys.dm_exec_requestsビューで現在要求されている内容を確認することができる。 sys.dm_exec_requestsより現在実行中のSQLの情報を調べるのは以下の通り。 select sql.text as SQLテキスト, req.session_id, req.status, req.command, (req.total_elapsed_ti…

ロックエスカレーション

行単位のロックを多数を行うより1つのテーブルロックを行ったほうが性能が向上することがある。 そのかわり、同時実行の競合が行われる可能性が向上する。 SQLServerではこのロックエスカレーションがデフォルト有効になっているが 以下の方法でロックエス…

トランザクション中のデータを確認する

トランザクションレベルを指定するとコミットされていない状態の更新データを読み込むことができる。 処理時間が長いバッチの進行状況を確認するときなどに便利。 以下、使用例 --コミットされていないデータも読み込むように指定 SET TRANSACTION ISOLATION…

ロックの種類

ロックの種類(request_mode)の意味は以下の通り。 S (共有ロック) ・・・他のトランザクションからの読込は可能。更新は不可となる。 X (排他ロック) ・・・他のトランザクションからの読込・更新が共に不可となる。 INSERT、UPDATE、DELETEを実行するとこの…

統計情報の自動取得

SQLServer2008の統計情報はデフォルトでは自動で取得される。 統計情報の自動取得の設定はデータベースの「プロパティ」→「オプション」→「統計情報の自動更新」で確認することができる。 なお、テーブルごとに参照、設定したい場合はsp_autostatsを使用する…

ロックの状態を調べる

ロックの状態を調べるSQLは以下の通り SELECT resource_type as オブジェクトの種類, resource_associated_entity_id as エンティティID, (CASE when resource_type = 'OBJECT' then OBJECT_NAME(resource_associated_entity_id) else (SELECT OBJECT_NAME(O…

テーブルの結合順序を指定する

OPTION(FORCE ORDER)をSQLの最後につけるとテーブルの結合順序をオプティマイザに任せるのではなく、 From句に記述した順序にすることができる。Oracleの/*+ ORDERED */ヒントと同じもの。 以下使用例 SELECT * FROM HogeA INNER JOIN HogeB on A_ID = B_ID …

インデックスの断片化

インデックスの断片化の情報を調べるのは以下の通り。 SELECT name as インデックス名, object_name(dm.object_id) as テーブル名, avg_fragmentation_in_percent as フラグメンテーション率 FROM sys.dm_db_index_physical_stats (DB_ID(), NULL,NULL, NULL…

データベースバッファキャッシュ

SQLServerはデフォルトで物理メモリのある限り、データベースバッファキャッシュとしてメモリを使用する。 なので、タスクマネージャでメモリを目一杯使用していてもメモリリークしているとは限らない。 サーバ上で動作しているのがSQLServerのみであれば上…

インデックスの不足を調べる

sys.dm_db_missing動的ビューを用いると不足していると思われるインデックスがわかる。 そのデータベース上で特にインデックスが不足していると推測されるものを探すSQLは以下の通り。 SELECT TOP 10 [Total Cost] = ROUND(avg_total_user_cost * avg_user_i…

テーブルの容量取得

テーブルごとの領域一覧を取得するSQLは以下の通り --テーブル変数の定義 DECLARE @TEMP_TABLE table( row_id int IDENTITY(1,1) NOT NULL ,T_NAME varchar(128) NULL ,T_CNT bigint ,T_DATA bigint -- KBytes ,T_INDEX bigint -- KBytes PRIMARY KEY (row_i…

テーブルの領域見積

テーブルの領域を見積るSQL(少し正確でない部分もあるが・・・) テーブル名、行数を指定するとテーブルの構造を元に使用領域を返す。 --レコード数を指定 Declare @Line Numeric(19) Set @Line = 999 --テーブル名を指定 Declare @tblname varchar(50) Set @…

依存関係を取得

SQL Serverでストアドプロシージャ、ファンクション等が依存するオブジェクトを 取得するには.sql_expression_dependenciesを使用するとよい SELECT OBJECT_NAME( referencing_id ) AS オブジェクト ,referenced_entity_name AS 依存するオブジェクト ,* FRO…

プロセスの強制終了

Management Stadioを利用したプロセスを強制終了する手順は以下の通り 1.「サーバ」→「管理」→「利用状況モニタ」をダブルクリック 2.現在のプロセス情報が出力されるのでプロセスを選んで右クリック→「強制終了」 なお、プロセスを選んでダブルクリックをす…

IDENTITYの初期化について

DBCC CHECKIDENTでIDENTITYを再設定した場合、 テーブルをTRUNCATEした直後とそれ以外では値が異なってしまう。 TRUNCATEした直後だとRessedで指定した値が採番されるが、 DELETE等でクリアした場合はRessedで指定した値+1が採番される。 以下、再現するた…