最小限のダウンタイムで大量のデータを再インポートする最良の方法


11

週に1回(3つのint / bigint列のみ)のIPルックアップ(読み取り専用参照)データを含む約500,000件のレコードをインポートする必要があります。

データを既存のテーブルとマージすることについて心配したくないので、古いものをクリアして再インポートしたいと思います。

理想的には、データに対して実行されるクエリは引き続き実行されます(これらのクエリの多くは取得されず、インポートの実行中は少し遅く実行することは許容されますが、24時間年中無休で実行する必要があるため、これを実行します)時間外」はオプションではありません)。

これまでに試したこと

SSIS:テーブルを切り捨ててインポートするSSISパッケージを作成しました-実行に約30秒かかります(実際には長すぎます)。

一時テーブル:一時テーブルへのインポート、切り捨て、および全体のコピーにも、約30秒かかります。

BCP:一括インポートもかなり遅い(何らかの理由で、SSISよりも遅い(インデックスを維持する必要がない場合でも))-char-> int / bigintトランザクションと関係があると思います:/

ミラーテーブル?したがって、現時点では、ビューを介してテーブルを読み取り、ミラーテーブルにデータをインポートし、このテーブルを指すようにビューを変更することについて疑問に思っています。ちょっとハッキー。

これは一般的な問題のように思われますが、推奨される方法を見つけることができません。

ありがとう

回答:


13

私が過去に使用した(そしてここと以前にStackOverflowで推奨した)ソリューションは、2つの追加スキーマを作成することです。

CREATE SCHEMA shadow AUTHORIZATION dbo;
CREATE SCHEMA cache  AUTHORIZATION dbo;

次に、cacheスキーマにテーブルの模倣を作成します。

CREATE TABLE cache.IPLookup(...columns...);

次に、スイッチ操作を行っているとき:

TRUNCATE TABLE cache.IPLookup;
BULK INSERT cache.IPLookup FROM ...;

-- the nice thing about the above is that it doesn't really
-- matter if it takes one minute or ten - you're not messing
-- with a table that anyone is using, so you aren't going to
-- interfere with active users.


-- this is a metadata operation so extremely fast - it will wait
-- for existing locks to be released, but won't block new locks
-- for very long at all:

BEGIN TRANSACTION;
  ALTER SCHEMA shadow TRANSFER    dbo.IPLookup;
  ALTER SCHEMA dbo    TRANSFER  cache.IPLookup;
COMMIT TRANSACTION;


-- now let's move the shadow table back over to
-- the cache schema so it's ready for next load:

ALTER SCHEMA cache TRANSFER shadow.IPLookup;
TRUNCATE TABLE cache.IPLookup; 

-- truncate is optional - I usually keep the data
-- around for debugging, but that's probably not
-- necessary in this case.

これは、外部キーやその他の依存関係がある場合(それらを削除して再作成する必要がある場合があるため)より厄介であり、もちろん、統計などを完全に無効にします。これは、次に、計画に影響を与える可能性がありますが、最も重要なことは、最小限の中断でユーザーの前に正確なデータを取得することです。これは考慮すべきアプローチです。


おかげで、別の興味深い代替案-最後の2つのステートメントは正しくないと思います。シャドウをキャッシュに移動し、キャッシュを切り捨てる必要があります。シノニムも使用できるだろうか?
マーク

あなたは正しい、私はそれらを混乱させた。シノニムがどのように改善されるかは正確にはわかりませんが、それもアプローチだと思います。シノニムを指すビューを用意し、他のバージョンを入力したときにトランザクションの基になるシノニムを変更します。個人的に私はこれが少し良いと思います-dbo.IPLookupをクエリしているとき、ビューとシノニムを追跡する必要がない「現在の」テーブルであることを知っています。
アーロンベルトラン

FYI私は今週、より詳細に本についてブログ:sqlperformance.com/2012/08/t-sql-queries/...
アーロン・ベルトラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.