加速2个数据库的插入查询

时间:2011-09-21 23:01:52

标签: sql sql-server tsql insert query-optimization

我在下面有这个查询,我从1个数据库中获取某些列,然后我将它们插入到另一个数据库中的另一个表中。然后我将删除我正在复制的表。目前,复制5300条记录需要5分36秒。有什么方法可以提高速度吗?

Declare @cursor cursor, @Firstname nchar(50), @MiddleInitial nchar(5), 
@Surname nchar(50), @EmailAddress nchar(100), @DOB nchar(8), @Sex char(1), @altEmail nchar(100)

set @cursor = cursor for select Firstname, MiddleInitial, Surname, HomeEmailAddress, 
DateOfBirth, Sex, WorkEmailAddress from cs_clients

open @cursor

fetch next from @cursor into @FirstName, @MiddleInitial, @Surname, @EmailAddress, @DOB, @Sex, @altEmail
while @@fetch_status = 0

begin
    set nocount on
    use hrwb_3_0
    declare @Password nvarchar(100), @EncryptedText nvarchar(100)
    exec L_Password_GetRandomPassword @Password output, @EncryptedText output

    declare @userID nvarchar(100)
    exec L_Password_GetRandomPassword @userID output, @EncryptedText output

    set nocount off

        set @EmailAddress = isnull(@EmailAddress, @altEmail)        

        insert into A_User values
        ('CS', 'CLUBSAIL', rtrim(@userID), rtrim(@Password), rtrim(@Surname), rtrim(@FirstName), rtrim(@MiddleInitial), 15, 'NA', 'NA', '', rtrim(@EmailAddress), rtrim(@DOB), 1, 0, 1, 0, '', rtrim(@Sex), '')

    fetch next from @cursor into @FirstName, @MiddleInitial, @Surname, @EmailAddress, @DOB, @Sex, @altEmail
end

3 个答案:

答案 0 :(得分:3)

这很慢,因为你一次只做一个。

请参阅此处了解一次执行多行的一些方法:http://blog.sqlauthority.com/2008/07/02/sql-server-2008-insert-multiple-records-using-one-insert-statement-use-of-row-constructor/

或者在本地数据库上创建一个临时表,然后使用它来一次插入所有内容(即在一个语句中)。

答案 1 :(得分:1)

如果您经常执行此类数据库进行数据库传输,则应该查看DTS或SSIS(具体取决于您使用的SQL Server版本)。这两种技术都专门用于在不同的源和目的地之间提取,转换和加载数据。

答案 2 :(得分:1)

如果你只需要在具有相同结构的表之间复制数据,这应该有效:

INSERT INTO Database2.dbo.Table2 SELECT * FROM Database1.dbo.Table1

如果您还需要转换数据(如您的示例所示),您可能会也可能无法在单个语句中执行此操作,具体取决于转换的复杂程度。