从关系表插入面向对象的表的快速方法

时间:2011-12-16 11:01:50

标签: sql sql-server sql-server-2008 tsql

我有一个包含大量列的关系表。 (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复制到带有额外标识列的临时表中,以获取行ID。然后遍历所有行,使用内部循环迭代每列并执行插入pr。柱。 像这样:

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

这有效,但速度极慢。 关于如何加快速度的任何建议?

2 个答案:

答案 0 :(得分:0)

重新设计数据库。

你有什么属性不好的表类型。这些是已知的权衡设置,并猜测 - 速度是他们不好的项目。哎哟。

您可能可以在C#外部更快地完成任务,然后将插件重新流入。

答案 1 :(得分:0)

加速代码的一种方法是将事务处理中的插入包装起来(可能是外部循环每次迭代一次事务?)。如果有很多插入内容,那么每个代码在单独的事务中,就像现在的代码一样,将会非常慢。