首页 > 解决方案 > 旧数据库格式迁移

问题描述

首先感谢您的光临并伸出援手!

我整天都在想办法让这个迁移概念尽可能快。基本上我有很多这样的行:

WO-ID|Line Number|Note Tran Number|Note
1    |1          |1               |... 50 char
1    |1          |2               |... 30 char
1    |1          |3               |5 char

在所有这一切结束时,我需要将它们放在一起,在它们之间插入一个回车,然后将它们分解成 60 个字符的文本,即:

WO-ID|Line Number|Note Tran Number|Note
1    |1          |1               |...50 char from line 1 and 10 char from line 2
1    |1          |2               |...20 char from tran 2 and 5 char from tran 3

现在,我确实有多种可行的方法,但我正在努力寻找最快的方法来实现这一点。将字符串连接在一起并添加回车既快速又简单,但是拆分它们的过程需要很长时间,字符串最终被拆分成的“事务”越多。目前,包含 107K 记录的数据集上所有笔记的总长度为 4,244,809 个字符。

最多(包括)300 个字符的所有记录为 3,829,351。这在大约 50 秒内完成。剩下的 415,458 个需要 1 分 45 秒。

这是我正在使用的查询(我想不出比我现在做的更好的“页面”方法,如果有更好的方法我很想听!显然有一种更快的方法插入多个值,但我不太在意):

Declare @SplitSize int;

declare @numbersTable table (number int);
insert into @numbersTable values(1);
insert into @numbersTable values(2);
insert into @numbersTable values(3);
insert into @numbersTable values(4);
insert into @numbersTable values(5);
insert into @numbersTable values(6);
insert into @numbersTable values(7);
insert into @numbersTable values(8);
insert into @numbersTable values(9);
insert into @numbersTable values(10);
insert into @numbersTable values(11);
insert into @numbersTable values(12);
insert into @numbersTable values(13);
insert into @numbersTable values(14);
insert into @numbersTable values(15);
insert into @numbersTable values(16);
insert into @numbersTable values(17);
insert into @numbersTable values(18);
insert into @numbersTable values(19);
insert into @numbersTable values(20);
insert into @numbersTable values(21);
insert into @numbersTable values(22);
insert into @numbersTable values(23);
insert into @numbersTable values(24);
insert into @numbersTable values(25);
insert into @numbersTable values(26);
insert into @numbersTable values(27);

Set @SplitSize = 60;

Select Main.wo_note_fac, main.wo_note_ro_num, main.wo_note_line_num,
        n.Number,SubString(main.note, @SplitSize*(n.Number -1) + 1, @SplitSize)
From (

        SELECT DISTINCT note2.wo_note_fac,  note2.wo_note_ro_num, note2.wo_note_line_num,
            (
                SELECT rtrim(note1.wo_note) + char(10)  AS [text()]
                FROM dbo.wonotes note1
                WHERE note1.wo_note_fac = note2.wo_note_fac and note1.wo_note_ro_num = note2.wo_note_ro_num and note1.wo_note_line_num != 0 and note2.wo_note_line_num = note1.wo_note_line_num
                ORDER BY note1.A4GLIdentity
                FOR XML PATH ('') ,TYPE).value('.','NVARCHAR(MAX)') --need this .value thing to make sure xml characters aren't escaped
             [note]
        FROM dbo.wonotes note2

)main
Inner Join @numbersTable n On @SplitSize*n.Number < Len(main.note) + @SplitSize

我们的客户在该表中有超过 1000 万条记录,我希望他们不要停机 2.5 小时或更长时间!

标签: sqlsql-server

解决方案


推荐阅读