sql - 旧数据库格式迁移
问题描述
首先感谢您的光临并伸出援手!
我整天都在想办法让这个迁移概念尽可能快。基本上我有很多这样的行:
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 小时或更长时间!
解决方案
推荐阅读
- python - 这是一个线性搜索代码。我如何返回该值的位置,而不是返回 true?
- python - 在 Python 3 中更改派生类中的成员函数
- varnish - 用于更改 request.url 的 VCL Snippet
- python - 为什么我会收到 Django NoReverseMatch 错误?
- macos - 主机 > 容器 Docker 慢速 HTTP 请求
- python - 条形图中的意外空白和值(matplotlib)
- react-native - TextInput - Android与iOS中的不同高度
- swift - 未使用 Handoff 和 SwiftUI 调用 onContinueUserActivity
- c# - Docker 容器 mcr.microsoft.com/dotnet/sdk 不以 root 用户身份发布
- javascript - 覆盖 SVG 中的文本样式