2011-12-16 6 views
0

私は多くの列を持つリレーショナルテーブルを持っています。 (import_table) このデータをすべてオブジェクト指向データベースに挿入しようとしています。リレーショナルテーブルからオブジェクト指向テーブルへの高速挿入

オブジェクト指向データベースは、テーブルを持っています

#table (tableId, name) 
#row (rowId, table_fk) 
#column(colId, table_fk, col_name) 
#value(valueId, col_fk, row_fk) 

これまでのところ私はimport_table INFORMATION_SCHEMAを読み、オブジェクト指向構造に正しく表や列を挿入する手順を作成しました。 次に、import-dataを余分なidentity-columnを持つtempテーブルにコピーして、row-idsを取得します。次に、すべての行を繰り返し、内部ループを使用して各列を反復処理し、インサートを実行します。カラム。このよう :

SELECT ROWID=IDENTITY(INT, 1, 1), * INTO #TEST 
FROM import_table 

DECLARE @COUNTER INT = 1 
WHILE @COUNTER <= (SELECT COUNT(*) FROM #TEST) 
BEGIN 
    INSERT INTO #ROW (ROWID, TABLE_FK) VALUES(@COUNTER, 1) 
    DECLARE @COLUMNCOUNTER INT = 1 
    WHILE @COLUMNCOUNTER <= (SELECT COUNT(*) FROM #COLUMN WHERE TABLE_FK = 1) 
    BEGIN 
     DECLARE @COLNAME NVARCHAR(254) = select col_name from #column where table_fk = 1 and rowid = @columnCounter 
     DECLARE @INSERTSQL NVARCHAR(1000) = 'insert into #value (column_fk, row_fk, value) select '+cast(@columnCounter as nvarchar(20))', '+cast(@counter as nvarchar(20))+', ' + @colName+' from #test where rowId = '+cast(@counter as nvarchar20)) 
     exec (@insertSQL) 
     set @columncounter = @columncounter +1 
    end 
    set @counter = @counter +1 
end 

これは動作しますが、それは非常に遅いです。 物事をスピードアップする方法に関する提案はありますか?

+0

が追加されました。助けてくれるといいですか? – user829237

+2

「リレーショナル」と「オブジェクト指向」の用語を悪用していると思われます。 – onedaywhen

答えて

0

データベースを再設計します。

あなたが持っているものは、特性の悪いタイプのテーブルです。これらは知られているトレードオフの設定であり、何がスピードが悪いのかを推測します。

あなたはおそらく外にC#で速く物事を行うことができ、その後、バックで挿入をストリーミングする。

+0

申し訳ありません。しかし、何もできません。これらのテーブルは、パイプの下にある他の要件のためにそのまま使用しなければなりません。しかし、あなたの入力に感謝します。 – user829237

+0

まあ、とにかくやってしまった。 :) – user829237

0

をあなたのコードをスピードアップするための一つの方法は、外側のループの反復ごとに(取引で多分1つのトランザクションをあなたの挿入をラップするのですか? )。コードが今のように、それぞれのトランザクションを別々のトランザクションに持つことは、挿入がたくさんある場合は非常に遅くなります。

+0

私のためにdidntの仕事。速度の向上はありません。実際にこれを行うことによってわずかなスピード・ロス – user829237

+0

非常に奇妙な。 SQLプロファイラの出力を見るのは面白かったでしょうが、少なくともあなたは別の方法で問題を解決しました。 – RickNZ

関連する問題