2016-09-26 12 views
0

大規模なテーブル(13億レコード)で非常に簡単なUPDATE操作を試行している間、DBの処理時間は1時間以上です。 Execution Plan show賢いスプーリング。だから、変更に影響する前に、大部分または全体を一時DBにコピーしていると仮定します。大きなテーブルの簡単な更新でTSQL Eagerスプール

私の目的のために、私は一連の候補更新をループしています。この大規模なテーブルの各パスで0〜10のレコードを素早く変更する必要があり、小秒の方法で移行する必要があります。これを実現させる方法に関するアイデアはありますか?私はヒントや索引構造の変更を試みましたが、ほとんどのアイデアは公開されています。

表レイアウト:

CREATE TABLE [dbo].[its_financial_suppl_jnl] 
(
    [financial_suppl_jnl_key] [bigint] NOT NULL IDENTITY(1000000, 1), 
    -- ... { Omitting several column definitions } 
    [location_key] [int] NULL, 
    -- ... { Omitting several column definitions } 
) ON [TA2] 
GO 
ALTER TABLE [dbo].[its_financial_suppl_jnl] ADD CONSTRAINT [PK_its_financial_suppl_jnl] PRIMARY KEY CLUSTERED ([financial_suppl_jnl_key]) 
GO 
-- ... { Omitting 3 Non-clustered index definitions } 
CREATE NONCLUSTERED INDEX [tmp1] ON [dbo].[its_financial_suppl_jnl] ([location_key], [financial_suppl_jnl_key]) ON [TA2] 
-- ... { Omitting 12 FK definitions } 

サンプルUPDATE文:

UPDATE its_financial_suppl_jnl 
SET location_key = 964672 
WHERE location_key = 507289 

(それはLocation_Key 507289はテーブルに存在しないとして上記のクエリは、0レコードを更新してしまうことに注意することは興味深い。)

+0

xmlとして実行プランを投稿することができます – TheGameiswar

+2

あなたはあなたのループをどのようにしているかについての詳細情報も投稿できますか?熱心なスプールは一般的に問題ではありませんので、完全な排泄物の遊びは面白いでしょう。熱心なスプールは、ハロウィーンの問題を避けるために非常に重要です。 – Zi0n1

答えて

0

ルーピングの仕組みや使用しているシステムの種類を知るにはコードが十分ではありませんが、プリンシパルで

大規模なテーブルをループして更新する場合、各更新ステートメントが適切なレコードをすばやく見つけることが重要です。この場合、あなたはそうしているようです...インデックスtmp1は、更新ステートメントのlocation_keyのフィルタに適しています。このサイトでは、SET columnA = columnB WHERE columnA != columnBのような何かを行うための更新ステートメントを提案していますが、最初のループではうまくいくと思われますが、ループが進行するにつれてますますひどいパフォーマンスになるという多くのソリューションを見てきました。

すべてのループが同じトランザクションの一部である場合、一度に管理可能な数のレコードを実行するためのレコードをループするポイントは、敗北します。これを行う最も簡単な方法は、ループごとにCHECKPOINTを発行することです。または、より多くの制御や情報を必要とする場合は、TRY/CATCHを実行してトランザクションを手動で処理できます。それを何か(1つの大きなトランザクション)する必要がある場合は、確かにそれを行うことができますが、ループはあなたを何もしません...トランザクションがコミットまたはロールバックされるまで、テーブル全体がロックされますまた、ルーピングによるパフォーマンスの低下も最小限に抑えられます。

これらのことを考慮に入れても、バッチ全体にはしばらく時間がかかりますが、個々の更新はすばやく操作できます。これらすべてのことを行い、問題がまだ解決していない場合は、実行プランを見ていることを少し具体的にしてください。

13億レコードを更新するのにかかる時間は、システムとI/Oパフォーマンスに大きく依存します。また、クラスタ化されたデータを更新するだけでなく、影響を受けるインデックスも更新することを忘れないでください。あなたのデータに関する詳細を知らなくても、システムとそれが実際に取っている時間は、あなたが見ているものがライン外にあるかどうかは言えません。

関連する問題