2016-11-09 7 views
0

複雑なクエリがあり、700,000以上の行から選択しています。クエリはvarchardateを返します。T-SQLの更新が選択または挿入よりもかなり遅い

結果がselectの場合、結果は2分以内で実行されます。私がinsertを新しいテーブルに入れると、これにはほぼ同じ時間がかかります。もし私がupdateをしたら、これは1時間以上かかる。

更新クエリは次のようである:

UPDATE 
    BD 
SET 
    datetext = V1.datetextvalue, 
    datedate = V1.datevalue 
FROM 
    datatable AS BD 
    LEFT JOIN 
    aview1 AS V1 
    ON BD.indexa = V1.indexa 

データテーブルは、次のとおり

primaryKey int 
indexa int 
datetext varchar(max) NULL 
datedate datetime NULL 

と、primaryKeyにインデックスがない以外。 inedxaは一意の値です。

これをスピードアップするにはどうすればよいですか?

UPDATE

上記は、実際のクエリの総単純化及び支持図です。実行計画は非常に複雑で、ほとんど判読できません。私にとって重要な問題は、selectが非常に速いことです。遅いアップデートです。

私は一時テーブルを作成するためにクエリを使用しています - これは迅速です。しかし、私が一時テーブルからメインテーブルを更新する場合、これはちょうど遅いです。

+2

'aview1'の実行計画と定義を追加できますか? –

+0

@ destination-data申し訳ありませんが、質問に追加することを目的としています。上記は、実際のクエリとサポートビューの単純化です。実行計画は非常に複雑で、ほとんど判読できませんでした。私にとって重要な問題は、 'select'が非常に速いことです。遅いアップデートです。 –

+1

そうかもしれないと思われます。表定義がなければ、問題の根本原因を修正するのは難しいです。しかし、@ Vicky_Thinkingが提案した答えは、この問題を回避するのに役立つかもしれません。 –

答えて

1

あなたが試すことができるのは、トランザクションログのエントリを最小限に抑えて、更新が高速になるようにすることです。以下のようにバッチ更新をお試しください。

UPDATE TOP(1000) BD 
SET 
    datetext = V1.datetextvalue, 
    datedate = V1.datevalue 
FROM datatable AS BD 
    LEFT JOIN 
    aview1 AS V1 
    ON BD.indexa = V1.indexa 
WHILE @@rowcount > 0 
BEGIN 
    UPDATE TOP(1000) BD 
SET 
    datetext = V1.datetextvalue, 
    datedate = V1.datevalue 
FROM datatable AS BD 
    LEFT JOIN 
    aview1 AS V1 
    ON BD.indexa = V1.indexa 
END; 
GO 
+0

あなたは私に頼む気にならないとどうしたらうまくいくのですか?なぜそれはいつも更新中止になりますか? – Cato

+0

ありがとうございます。これにより、プロセス全体がはるかに管理しやすくなります –

関連する問題