2017-02-09 3 views
0

同僚とのSQLパフォーマンスについて議論し、運用データストアテーブルを維持するという話題が登場しました。私の同僚(私よりもはるかに経験が豊富です)は、データの更新が行われたときにテーブルで標準のDML操作を実行するよりも、テーブルを削除して再作成し、すべてのレコードを挿入する方が速いことを示しています。私は懐疑的であり、以前のプログラミングの背景(R)では、私にとっては直感に反しているようです。バニラDML操作対DROP、RECREATE、(RE)INSERT - これはより効果的ですか?

単一のレコードは約です。 1.6キロバイト。 50列。レコード数はビジネスプロセスごとに異なりますが、テーブルのサイズは25000レコード程度で、最小値は25000000程度です。一般的なデータはODSテーブルにロードされます.0〜500のレコードが1日あたりテーブルごとに作成または変更されます。よりパフォーマンスのあるオプション

、よくインデックス付きテーブルを維持し、単一INSERT操作で2つのDML操作(DROP TABLECREATE TABLE)対バニラDML操作(INSERTUPDATEDELETE)を使用して?

+1

'...約拡散します。 50列....それはデータベーステーブルではありません。それはスプレッドシートです! – joop

+0

@joop本当に。私はあなたに聞きましたが、これらのODS表の範囲を制御することはできません。私たちのソースシステムには、EAVデータモデルの運用レポートを作成しようとすると自殺してしまうため、ODSのようなテーブルを作成するために、特定のデータモデル(EAV)が用意されています。クライアントが100個の属性を持つようにデータセットを構成している場合、* k * + 100列があります。* k *は定数です(正しく覚えていれば5です)。 – Marley

答えて

-1

テーブルレコードを必要としない場合や、テーブルレコードを復元する必要がある場合は、テーブルを切り捨てるのが最適です。それはあなたのスキーマとテーブル定義を再作成する必要がないように保ちます。あなたのすべてのレコードは(回復できませんが)削除され、新しいレコードをすべて挿入することができます。挿入すると、テーブルに新しいインデックスが作成されます。 Truncateは変更を記録しないので、より効率的になります。

+0

truncateステートメントは最小限に記録されます。共通の信念は誤解であり、再現されないことが最善です。ここでのTRUNCATEステートメントの詳細:http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-1930-truncate-table-is-non-logged/ –

+0

はい、あなたは正しいです。私はロギングに言及したとき、より具体的であったはずです。特に大テーブルでdelete文よりも大幅に節約できる個々の行はログに記録されず、一度コミットされると回復できません。 – kubasnack

関連する問題