LoginSignup
12
15

More than 3 years have passed since last update.

SQLServerパフォーマンス関連情報

Last updated at Posted at 2020-01-13

サーバー構築時の確認事項

基本確認項目

大規模システム向け

パーティション分割(シャーディング)

レプリケーション

テーブル設計時の確認事項

テーブル設計

データベースの種類に問わず、気をつけること。

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'
      );

BULK INSERT (Transact-SQL)

BCPコマンド

BCPユーティリティコマンドであれば、インポートおよびエクスポート両方とも一括で行うことが出来る。

:: インポート
bcp データベース名.所有者.テーブル名 in "入力パス" -c -S サーバ名(インスタンス名) -U ユーザID -P パスワード

:: エクスポート
bcp データベース名.所有者.テーブル名 out "出力パス" -c -S サーバ名(インスタンス名) -U ユーザID -P パスワード

bcp を使用した一括データのインポートおよびエクスポート (SQL Server)
【SQL Server】BCPコマンドを利用したデータのインポート/エクスポート

サーバー運用中の確認事項

稼働中のSQLが重くなっていた時の確認事項

問題の調査分析

インデックスの再構築・再構成

インデックスの再構成、再構築を行うことでインデックスの断片化を解消することが出来る。
オンラインで実行する必要がある場合は、再構成(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'プロシージャ名'; 
12
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
15