2017-06-24 10 views
0

2つのクエリに時間がかかりすぎて、紺碧のWebサイトで実行しているときにタイムアウトしてしまいます。SQLデータベースのインデクシングが遅すぎる

1st。

SELECT Value FROM SEN.ValueTable WHERE OptId = @optId 

2D

INSERT INTO SEN.ValueTable (Value, OptId) 
SELECT Value, OptId FROM REF.ValueTable WHERE OptId = @optId 

両SELECTSは常に7860個の値を返します。問題は、さまざまな@optIdを使用してこれらのクエリの約10を実行することです。最初にインデックスなしで実行した場合、1回目のクエリは毎回タイムアウトします。次に、非クラスタ化インデックスをSEN.ValueTableに追加し、2dクエリがタイムアウトし始めました。

第一クエリ私はの.configファイルを介し-タイムアウト時間を増加しようとしたが、彼らはまだ(30秒以内にタイムアウトAzureの-WebAppの

から2Dクエリ

AzureのVMから顧客からの時間制限はないので、SQLデータベースからのデータの取得は、アプリケーションの遅いものではありません)。

これをスピードアップする/タイムアウトを取り除くためにとにかくありますか? REF.ValueTableをインデックス化すると、挿入物の速度が上がりますか?それは次のようになるため

SELECT Value, OptId 
FROM REF.ValueTable 
WHERE OptId = @optId; 

最適なインデックス:

+0

あなたが実行計画を掲示しなければ、それは遅いですなぜ評価するのは難しいです。 2番目のクエリ挿入用の神は、インデックス付きテーブルにいくつの値があるのか​​を知っていますが、神だけがいくつの値を知っているので遅いかもしれません。 テーブルとインデックスの分割を検討するか、部分クエリを実行するだけです(代理キー%4 = 0、次に1、次に2、そして3つで3つのクエリとタイムアウトの問題があります)。 – AlexanderMP

+1

'両方のSELECTSは常に7860の値を返します。問題は、さまざまな@ optIdを使ってこれらのクエリの約10回を実行することです。あなたはどうしていますか? –

+0

両方のテーブルで 'OptId'のクラスタ化されたインデックスを考えてください。特に、2つのカラムが' OptId'と 'Value'だけです。 –

答えて

2

あなたは本当に、このようなクエリを実行する場合

CREATE INDEX idx_ValueTable_OptId_Value 
    ON REF.ValueTable (OptId) 
    INCLUDE (Value); 

どれインデックスは挿入が遅くなりますが、クエリを読んで恩恵を受ける。より詳細な回答が必要な場合は、詳細な表DDLと実行計画を投稿してください。

+0

これは私が作成したインデックスのようなものですが、UNCLUSTERED(CLUSTERED/UNCLUSTEREDを指定しないと何が作成されているのかわかりません)。問題は、そのインデックスを作成したときにインサートが遅すぎるということでした。インサートの問題は、これらのインサートを同時に10回実行することで、非同期で処理しようとしていたことです。これは後天的には馬鹿馬鹿しいものです。 'Dapper.QueryAsync'から' Dapper.Query'に移動すると、問題が解決しました(それぞれの 'QueryAsync'の前に' await'があります)。 – user2687506

+0

既定では、非クラスタ化インデックスが作成されています。 :)とインデックスが挿入を遅くしますが、利益を読むことはよく知られています。それは公正なトレードオフです。 –

2

まず、明白な解決策は、SEN.ValueTable(OptId, Value)にインデックスを追加し、REF.ValueTable(OptId, Value)にインデックスを持たないことです。私はこれがあなたのパフォーマンス上の問題を解決すると思います。

もっと重要なのは、7,860行をフェッチまたは挿入するのに30秒かかりません。そのようなものは何もありません。それでは、もう何が起こっているのですか? REF.ValueTable()にトリガーがありますが、これは遅くなる可能性がありますか?他の制約はありますか?列は特に広いですか?つまり、ValueVARCHAR(MAX)で、通常は100Mバイトの場合は、値を挿入することが問題になる可能性があります。

+0

値は浮動小数点だったので、OKだったはずです。私はAzure(5 DTU's)からの最も遅いMsSqlを実行しています。これはおそらくSELECTの速度が遅い理由です。インデックス作成では遅いSELECTの問題が修正されましたが、INSERTのSEN.ValueTableへの挿入が遅すぎました。これは、私がDapperとINSERTの非同期処理をしようとしているためです。これらの挿入を行うときに非同期呼び出しを削除することで問題は解決しました。 – user2687506