ヘッダーイメージ 本文へジャンプ
日記

2012年06月28日 11時24分
SQLServer のチューニング
先日、取引先のシステムのチューニングを依頼されました
使ってるDBがSQLSerevr2005 なんですが分散DBを使ってシステムを構築しており
結構ややこしいシステム

5000件ぐらいのデータのチェック&取込で30分ぐらいかかります

それをテスト用のローカルマシンに関連データをコピーして実行すると、15分ほどで終わります
(本番はEnterpriceで分散有り、テストはExpressで分散無し)

「分散やめれば速いんちゃう?」

と思いましたが、色々社内的に問題があるようでそれは簡単にはできないので別の方法を・・・

DBの設定だとかいろいろ調べたのですが、インデックスの断片化が98%ぐらいになっていることがわかりました


SELECT
dm.index_id,name,object_name(dm.object_id) as tblname,
fragment_count,avg_fragmentation_in_percent
FROM
sys.dm_db_index_physical_stats (DB_ID(), null,null, null, null) AS dm
JOIN sys.indexes AS ind
ON dm.object_id = ind.object_id
AND dm.index_id = ind.index_id
ORDER BY name 

それで、テストDBを調べたところ、こちらも結構使い込んだ状態にデータをコピーしたので同じように90%は超えていたので試に、インデックスの再構築を行って実行したところ3分ぐらいで終わるようになりました!

・再構築(だいたい断片化が30%以上の時らしい)
ALTER INDEX ALL ON テーブル名 REBUILD
WITH (
FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON)
※FILLFACTORはどれだけ詰め込むかを指定するオプション、なんとなく80%にしてみた
※たぶん作業中インデックスが使えないとかロックされるとかあると思います

ALTER INDEX ALL ON テーブル名 REBUILD
WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON, ONLINE=ON)
※ONLINE=ONのオプションはEnterpriseのみで運用中も実行可能らしいです

・再構成(断片化が5%~30%ぐらいの時はこちらでいいらしい)
ALTER INDEX ALL ON テーブル名 REORGANIZE
※運用中も可能

それで本番DBでも実行したのですが・・・
結果的に効果なしでした
思うに本番DBってメモリー24Gぐらい割り当てられていて、データ件数も数十万件ぐらいなので、SQLServerが結構キャッシュしてるんじゃないかと思います

メモリーが十分あると、インデックスが最適で無くてもそこそこ速く動くみたいでインデックスを作成してもダメ・・・

結局アプリケーションのロジックを確認し無駄なDBアクセスをなくしたり、複雑な検索を行っている部分を単純な検索数個に分けて実行するように修正して何とか3倍速ぐらいで動くようにしました

そのうちSQLを実行する場合に、パラメータクエリを使っていなかったのですが、これを使うように修正すると大体2割ぐらい速くなりました
まぁこれもメモリーが十分にあるのでクエリーキャッシュが効くようになったのではないかと思われます

DBの設定1つで速くできるかと思ったのですが
結局アプリケーションのロジックなどを修正してのチューニングになっちゃいました・・・




・リモートPCからSQLServerに繋ぐ
・SqlServer壊してしもた・・・
・SqlServerの不思議
・SQLServer のチューニング
・SQLSERVER のリストア
・NetFx3 ってなんだ?
・RDゲートウェイを入れてみました
・Windows上のApcheでASP.NETを動かす
・SQLServer に、大量データのインサート
・Windwos で mono
・Windows10 のシステムイメージの作成
・SQL Server 2017 RC2 評価期限切れ

カテゴリー:日記
目次へ戻る


フッターイメージ