spa*_*boy 29 sql-server-2005 sql-server etl
题:
我有一个脚本,其中包含来自 select 语句的大约 45,000 个插入。当我尝试运行它时,我收到一条错误消息,指出我的内存不足。我怎样才能运行这个脚本?
语境:
如果有不同的方式我应该加载这些数据,请随时批评我并让我知道。
Dar*_*ait 18
SQL Server 2005 的最大批处理大小为 65,536 * 网络数据包大小 (NPS),其中 NPS 通常为 4KB。结果是 256 MB。这意味着每个插入语句的平均大小为 5.8 KB。这似乎不对,但也许那里有多余的空间或不寻常的东西。
我的第一个建议是在每个 INSERT 语句之后放置一个“GO”语句。这会将您的单批 45,000 个 INSERT 语句分成 45,000 个单独的批次。这应该更容易消化。小心,如果其中一个插入失败,您可能很难找到罪魁祸首。您可能希望通过交易来保护自己。如果您的编辑器具有良好的搜索和替换功能(可以让您搜索和替换诸如 \r\n 之类的返回字符)或宏功能,则您可以快速添加这些语句。
第二个建议是使用向导直接从 Excel 导入数据。该向导会在幕后为您构建一个小的 SSIS 包,然后运行它。不会有这个问题。
Aar*_*and 14
BULK INSERT或者bcp看起来比 45,000 个插入语句更合适的选项。
如果您需要坚持使用插入语句,我会考虑几个选项:
A:使用事务,每条语句打包成100或500或1000条语句的批次,以尽量减少对日志和批次的影响。例如
BEGIN TRANSACTION;
INSERT dbo.table(a, ...) SELECT 1, ...
INSERT dbo.table(a, ...) SELECT 2, ...
...
INSERT dbo.table(a, ...) SELECT 500, ...
COMMIT TRANSACTION;
GO
BEGIN TRANSACTION;
INSERT dbo.table(a, ...) SELECT 1, ...
INSERT dbo.table(a, ...) SELECT 2, ...
...
INSERT dbo.table(a, ...) SELECT 500, ...
COMMIT TRANSACTION;
GO
Run Code Online (Sandbox Code Playgroud)
B: 一次使用UNION ALL100 或 500 条语句,而不是单独的插入语句,例如
INSERT dbo.table(a, ...)
SELECT 1, ...
UNION ALL SELECT 2, ...
...
UNION ALL SELECT 500, ...
GO
INSERT dbo.table(a, ...)
SELECT 501, ...
UNION ALL SELECT 502, ...
...
UNION ALL SELECT 1000, ...
GO
Run Code Online (Sandbox Code Playgroud)
为简洁起见,我省略了错误处理,但重点是我永远不会尝试向 SQL Server 发送一批 45,000 个单独的语句。
| 归档时间: |
|
| 查看次数: |
86826 次 |
| 最近记录: |