私は2つのテーブル - Things
とHistory
を持っています。 Things
がプライマリキーとして列Id
を持ち、何らかの種類のタイムスタンプ値である別の列LastUpdated
を持っているとしましょう。 LastUpdated
列には索引があります。他の欄もありますが、それはあまり関連性がないはずです。SQL Serverのパフォーマンスの問題を解決する
前回以降に変更されたものを取得します。形式:
SELECT [Columns] FROM Things WHERE LastUpdated > @LastUpdated
のクエリを実行します。このクエリは、トランザクションまたはトランザクションスコープなしの接続で発生します。特に更新します。これは、2つのデータベーストランザクションで発生します。最初のトランザクションは
Things
にId
、その後にUPDATE Things
にId
を使用してSELECT
があります。 2番目のトランザクションは、行をHistory
テーブルに挿入します。両方のトランザクションはTransactionScope
とRead Committed
分離レベルを使用して制御されます。
Iは、Things
テーブルで
- 5000行毎秒
- 25クエリ(上記#1)
- 200の更新(#ようなシナリオでパフォーマンスをマークベンチしようとしてい2秒)
環境:Sql Server 2016 LocalDBエンジン搭載My devマシン(Core i7、8GB) 。
私が観察しているところでは、History
テーブルで行数が増えると、#1と#2の両方でパフォーマンスが低下します。 #2は実際に履歴テーブルを更新するので理解できる。しかし、なぜ#1が劇的に悪化するのか、私は困惑しています。たとえば、#2時間は空のデータベースで約10msからhistory
テーブルの250K行で約65msに低下し、#1時間は約10msから200msに低下します。 Things
テーブルには、一定の行数(5000)があることに注意してください。私が考えることができるのはディスクIOの競合によるものです。
私はここですか? SQLプロファイラを使用してこれを確認する方法はありますか?
'History'テーブルのみが挿入されているか、履歴テーブルも更新していますか?履歴テーブルから 'SELECT'を実行しましたか? "Thing"で更新される列のデータ型は何ですか?どのようなインデックスがありますか? – Alex
LastUpdated列にはどのような種類のインデックスがありますか? – Jaques
SQLプロファイラを使用してクエリと期間を取得することができます。https://docs.microsoft.com/en-us/sql/relational-databases/performance/display-an-actual-execution-planを使用することもできます。どのような計画が使われているかを見てください – Alex