2017-11-15 6 views
0

私は2つのテーブル - ThingsHistoryを持っています。 Thingsがプライマリキーとして列Idを持ち、何らかの種類のタイムスタンプ値である別の列LastUpdatedを持っているとしましょう。 LastUpdated列には索引があります。他の欄もありますが、それはあまり関連性がないはずです。SQL Serverのパフォーマンスの問題を解決する

  1. 前回以降に変更されたものを取得します。形式:SELECT [Columns] FROM Things WHERE LastUpdated > @LastUpdatedのクエリを実行します。このクエリは、トランザクションまたはトランザクションスコープなしの接続で発生します。

  2. 特に更新します。これは、2つのデータベーストランザクションで発生します。最初のトランザクションはThingsId、その後にUPDATE ThingsIdを使用してSELECTがあります。 2番目のトランザクションは、行をHistoryテーブルに挿入します。両方のトランザクションはTransactionScopeRead 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プロファイラを使用してこれを確認する方法はありますか?

+0

'History'テーブルのみが挿入されているか、履歴テーブルも更新していますか?履歴テーブルから 'SELECT'を実行しましたか? "Thing"で更新される列のデータ型は何ですか?どのようなインデックスがありますか? – Alex

+0

LastUpdated列にはどのような種類のインデックスがありますか? – Jaques

+0

SQLプロファイラを使用してクエリと期間を取得することができます。https://docs.microsoft.com/en-us/sql/relational-databases/performance/display-an-actual-execution-planを使用することもできます。どのような計画が使われているかを見てください – Alex

答えて

0

私はこのように多くの時間を費やすことはできませんでしたが、疑わしい理由として、ディスクI/Oの競合であることが明らかになっています。私は別のマシン上の別のデータベースに履歴テーブルを移動しました。そして、履歴テーブルの行数が#1のタイミングに影響を与えなくなり、履歴テーブルの行数に関係なく、ほぼ一定(6〜7%の分散)のままです。

関連する問題