サーバー構築時の確認事項
基本確認項目
-
tempdbの数をCPUコア数にあわせる。
-
x64環境なら「メモリ内のページロック指定」を変え
OLTP環境では、並列処理の最大限度(Max DOP)はCPUコア数の「4分の1」に設定せよ
大規模システム向け
パーティション分割(シャーディング)
レプリケーション
テーブル設計時の確認事項
テーブル設計
データベースの種類に問わず、気をつけること。
4ステップで作成する、DB論理設計の手順とチェックポイントまとめ
SQLアンチパターン勉強会
インデックス
SQL Server のインデックス設計
SQLServerのインデックスについてざっくりとまとめてみた
SQL Server のインデックス
付加列インデックス
テーブルへのアクセスを無くすため、必要なデータを全てインデックスに含めることをカバリングインデックス
と呼ぶ。
SQLServerの場合、カバリングインデックス
のインデックスのサイズが肥大化する問題を解決する手段として付加列インデックス
がある。
インデックスのみのスキャン: テーブルアクセスを 避ける
付加列インデックスの作成
フルテキスト検索
SQL実行時の確認事項
一括処理
複数レコードを一括挿入
1000件までなら以下の方法で一度にINSERT出来る。
INSERT INTO test_table VALUES
( 1, 'NAME1', 10 )
,( 2, 'NAME2', 20 )
,( 3, 'NAME3', 30 )
,( 4, 'NAME4', 40 )
,( 5, 'NAME5', 50 )
1000件以上の場合は、派生テーブルとしてテーブル値コンストラクターを使用する。
INSERT INTO dbo.Test ([Value])
SELECT drvd.[NewVal]
FROM (VALUES (0), (1), (2), (3), ..., (5000)) drvd([NewVal]);
1行のINSERT文で複数のデータを挿入する方法
テーブル値コンストラクター (Transact-SQL)
Bulk Insert
Bulk Insertを使って大量のデータファイルから一括でインポートすることが出来る。
BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR =' |'
, ROWTERMINATOR =' |\n'
);
BCPコマンド
BCPユーティリティコマンドであれば、インポートおよびエクスポート両方とも一括で行うことが出来る。
:: インポート
bcp データベース名.所有者.テーブル名 in "入力パス" -c -S サーバ名(インスタンス名) -U ユーザID -P パスワード
:: エクスポート
bcp データベース名.所有者.テーブル名 out "出力パス" -c -S サーバ名(インスタンス名) -U ユーザID -P パスワード
bcp を使用した一括データのインポートおよびエクスポート (SQL Server)
【SQL Server】BCPコマンドを利用したデータのインポート/エクスポート
サーバー運用中の確認事項
稼働中のSQLが重くなっていた時の確認事項
問題の調査分析
- SQL Serverのパフォーマンストラブル調査手段集
- サーバーのパフォーマンスと利用状況の監視
- SQLServer: CPU負荷をかけている機能を見つけ出す
- 【SQL server】利用状況モニターの情報取得について
インデックスの再構築・再構成
インデックスの再構成、再構築を行うことでインデックスの断片化を解消することが出来る。
オンラインで実行する必要がある場合は、再構成(REORGANIZE)を使用する。
オフラインで実行する時間を確保できる場合は、再構築(REBUILD)を使用する。
例えば、処理に割り当てられる時間が限られていて、処理を途中でキャンセルしなければならない可能性があるのであれば、再構築よりも再編成の方が、キャンセルした場合にもすべてが無駄にならず、毎日時間の許される範囲で実行するという方法を取ることがきます。反対に、再構築に必要となる時間は確保できるので、実行時間にばらつきが出るよりもある程度一定の時間で完了することが優先されるのであれば、再構成よりも再構築の方が有利でしょう
-- 断片化されたインデックスを再構成
ALTER INDEX インデックス名 ON テーブル名 REORGANIZE;
-- テーブルのすべてのインデックスを再構成
ALTER INDEX ALL ON テーブル名 REORGANIZE;
-- 断片化されたインデックスを再構築
ALTER INDEX インデックス名 ON テーブル名 REBUILD;
-- テーブルのすべてのインデックスを再構築
ALTER INDEX ALL ON テーブル名 REBUILD;
統計情報の更新
-- 1 つのインデックスの統計を更新
UPDATE STATISTICS テーブル名 インデックス名;
-- テーブルのすべての統計を更新
UPDATE STATISTICS テーブル名;
-- データベースのすべての統計を更新
EXEC sp_updatestats;
実行プランの見直し
--テーブルを指定して次回実行時に再コンパイルを指定する
EXEC sp_recompile N'テーブル名';
--プロシージャを指定して次回実行時に再コンパイルを指定する
EXEC sp_recompile N'プロシージャ名';
- 実行プランを作成しなおしてクエリのパフォーマンスを改善する
- [「パラメータースニッフィング」によって、あるタイミングから処理が遅くなった(パフォーマンストラブル)]
(https://www.atmarkit.co.jp/ait/articles/1706/19/news007.html)