2016-09-16 8 views
0

私は通知表(非常に大きなテーブル)を持って、私は最適なSQLソリューションですか?

1- 3-これらすべての通知を削除
2 - notification_logの表に、これらの通知を挿入するユーザーIDのすべての通知を選択し、以下のシナリオにあなたの助けが必要通知表

私の考え:

1-通知テーブルにフラグ列を作成し、上記のシナリオでは、ステップ2と3を行うには、それに更新トリガーに作成します。

ドローバックス:それは、パフォーマンスのための素晴らしいではないだろうので、私はいつも通知の大部分を選択しています(n)とOトリガ共犯

2 - 上記のシナリオ

に行う簡単なSQLプロシージャを作成しますドローバック:シナリオのステップがコミットに失敗した場合、すべてのプロシージャがロールバックされます

これを最適化する手助けをしてください。事前

+0

ログに記録されていないすべての通知を選択し、ログに記録されているすべての通知を削除します。少なくともこの方法では、パフォーマンスのためにインデックスを使用しています。また、すでに持っているものは決して削除されません。 –

答えて

1

おかげINSERT ... SELECT ...; DELETE ...;に失敗する可能性がありますので、私は間違いなく、ストアドプロシージャとなるだろうそれほどありません。

はまた、(一時的になど、インデックスと制約を削除)より速く、全体のプロセスを作るためにいくつかのオプションがありますが、それはあなたが私はあなたが簡単な手順で行くべきだと思います:-)

+0

私は、パフォーマンスを向上させることを目指していますが、インデックスなしでプロセスがどのように高速になるのでしょうか? –

+1

INSERTとDELETEはインデックスを再構築する必要があるためです。一度に大量のデータを移動する場合は、索引を削除し、データを移動して索引を再作成する方がよい場合があります。データ操作自体ははるかに高速になります。 –

+1

'INSERT'と' DELETE'はインデックスを '更新 'する必要があります。数千のフィールドのインデックスを更新するよりも大きなテーブルのインデックスを再構築する際に、さらに多くのオーバーヘッドが発生する可能性があります。 – deroby

0

について尋ねたものではないのです。

以下は、実行する必要がある手順です。

1)通知テーブルのuser_idにインデックスを作成します。 2)カーソルを使用してプロシージャを書き込みます。 3)カーソル内のすべてのuser_idを収集して繰り返します。 4)カーソルからuser_idで通知のすべての行を選択します。 5)これらの行をnotification_logテーブルに挿入します。 6)通知列から挿入された列を削除します。

注:プロシージャを正常に実行してから、必要な外部キーとインデックスを追加すると、notification_logテーブルに外部キーまたはインデックスを追加しないでください。

関連する問題