标签: bcp

优化 BLOB 数据的 BCP 性能

我正在计划将 2TB 数据库实时迁移到分区表的过程。从广义上讲,该系统是一个文档存储,大部分空间分配给 50kb 到 500kb 之间的 LOB,一小部分在 500kb 到 1MB 范围内。部分迁移将涉及从旧数据库到新数据库的 BCPing 数据。

BCP 是首选方法,因为数据中的当前/历史鸿沟允许在最终切换之前分阶段(在较安静的时期)提取较旧的数据,从而最大限度地减少对实时系统的影响。数据量和存储可用性排除了对分区方案的原位重建

由于 BLOB 内容,我怀疑通过尝试使用 KILOBYTES_PER_BATCH 而不是 ROWS_PER_BATCH 可能会获得一些性能提升。BCP文档中建议SQL可以根据这个值优化操作。

我找不到关于这些优化的性质或从哪里开始测试的任何指导。在没有建议的情况下,我将尝试在 4/8/16/32/64mb 边界处进行短期运行。

可能会从更改数据包大小(BCP -a 参数,而不是服务器级别设置)中获得一些收益,但我倾向于将其提高到最大 65535,除非有人有更公式化的方法。

performance sql-server bcp

14
推荐指数
1
解决办法
5407
查看次数

“无法打开 BCP 主机数据文件”使用来自 SSMS 的 xp_cmdshell 但命令行有效

我有一个存储过程,它每隔一段时间运行一次作业,以 BCP 处理我编写的应用程序留下的一些文件。

我注意到文件堆积如山,而 BCP 没有提取它们,因此我使用以下命令在 Management Studio 中进行了测试:

DECLARE @sql VARCHAR(MAX)
DECLARE @path VARCHAR(512) = 'C:\BCPFiles\'

--Use BCP to copy files in character format from the target directly into the table. 
SET @sql = 'bcp [MyDB].[dbo].[MyTable] in ' + @path + 'bcpFile.dat -c -T'

EXEC master..xp_cmdshell @sql
Run Code Online (Sandbox Code Playgroud)

并收到此错误消息

BCP 错误

使用相同的命令从同一台服务器上的命令行执行没有问题。

以下是其他一些观察结果:

  1. 我可以运行EXEC master..xp_cmdshell 'dir C:\*.*'并且结果按预期返回。
  2. 如果我将文件复制并重命名为不同的名称,BCP 会选择它
  3. 该文件没有被我的应用程序打开:我可以移动它、重命名它、编辑和保存它、删除它等等......没有来自 Windows 的任何抱怨。
  4. 文件的内部格式显然没问题(见2)
  5. NT SERVICE\MSSQLSERVER 对目录具有完全控制权限。
  6. 枫叶队昨天交易了 Dion Phaneuf

任何帮助表示赞赏。

sql-server permissions bcp sql-server-2014 xp-cmdshell

11
推荐指数
1
解决办法
8万
查看次数

bcp 命令 '?' 附近的语法不正确。字符实际上是:“ä”

我 在 Ubuntu (Linux) 上安装了mssql-servermssql-tools。当我尝试使用以下命令行使用bcp命令导出数据时:

bcp DBname.dbo.Täble_Name out Täble_Name -c -k  -S127.0.0.1 -Usa -PpassWord -r ~
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

SQLState = 37000,NativeError = 102
错误 = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]'?' 附近的语法不正确。

?ä

如果我Täble_Name用方括号括起来:

 bcp DBname.dbo.[Täble_Name] out Täble_Name -c -k  -S127.0.0.1 -Usa -PpassWord -r ~
Run Code Online (Sandbox Code Playgroud)

我在对象名称上收到此错误:

SQLState = S0002,NativeError = 208
错误 = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]无效的对象名称“DBname.dbo.Täble_Name”。

我进一步添加了单引号''以及-q选项(启用带引号的标识符):

bcp 'DBname.dbo.[Täble_Name]' out …
Run Code Online (Sandbox Code Playgroud)

sql-server linux ubuntu bcp sql-server-2017

11
推荐指数
1
解决办法
2336
查看次数

无法打开 BCP 主机数据文件错误

通过 xp_cmdshell 使用 BCP 时出现问题。

我将表数据导出为 .dat 文件,但是当我尝试将文件导入新表时,出现以下错误。SQL Server 服务和我使用的帐户对该驱动器具有完全访问权限。我不知道为什么我仍然有问题。

错误 = [Microsoft][SQL Server Native Client 10.0] 无法打开 BCP 主机数据文件。

这是我正在运行的脚本。

exec master..xp_cmdshell 'BCP database.dbo.tabel OUT d:\tabledata.dat -T -c' 
exec master..xp_cmdshell 'BCP database.dbo.tabelnew IN d:\tabledata.dat -T -c' 
Run Code Online (Sandbox Code Playgroud)

sql-server bcp

7
推荐指数
1
解决办法
2万
查看次数

如果 BCP 命令无法将数据转储到文件中,则引发错误

使用 BCP 命令,我正在生成 SQL Server DB 表的文件。当 BCP 命令无法将数据转储到文件中时,它会为每个表创建一个空文件。这可能是由写入的查询错误或传递给 BCP 命令的空变量引起的。

有什么方法可以将这些事件捕获为错误并使其返回一些错误代码?

我正在从存储过程执行此操作。有什么办法可以在 SP 中处理这个问题吗?

sql-server stored-procedures bcp error-handling

7
推荐指数
1
解决办法
1万
查看次数

我可以批量插入空的页面压缩表并获得完全压缩吗?

我有很多大表(大约 1000 万行宽)需要定期加载到 SQL Server 2016 中以进行只读报告。我希望这些表在磁盘上尽可能小,这比加载或查询的性能改进更重要。

这是我对不需要进一步索引的表所做的工作:

  1. 使用DATA_COMPRESSION=PAGE.
  2. 使用 bcp 将平面文件中的数据批量插入到新表中。

表中的列类型是 varchar(不超过 512,不是最大值)、float、tinyint 或日期(不是日期时间)。所有列都创建为可为空的,并且没有定义主键或外键——它们与查询无关,表永远不会直接更新。一切的默认排序规则是SQL_Latin1_General_CP1_CI_AS.

当我这样做时,我可以看到sys.allocation_units该页面数据压缩已应用于堆,并且我可以看到sys.partitions填充因子正确为 0 (100%)。由于表比未压缩的表小得多,我认为压缩已完成。

但是,如果我然后使用相同的选项重建DATA_COMPRESSION=PAGE,则假定已经压缩的表会缩小大约 30%!看起来它从每个数据页大约 17 行到每页 25 行。(虽然只有一次。在那之后再次重建不会使它比第一次重建更小。)

问题

所以我的问题是:(a)这里发生了什么?(b) 有没有办法在加载表时直接获得这个超小的压缩大小,而无需在加载数据后重建?

sql-server bcp compression sql-server-2016

7
推荐指数
2
解决办法
1278
查看次数

在 BCP 输出中插入自定义标题行

长话短说,我们这里有一个数据库,用于管理一些员工数据,例如电子邮件、名字、姓氏等。我们公司购买了这个基于 SAP 的费用报告系统:| 这需要以非常奇怪的格式导出基于员工的数据。在不涉及太多细节的情况下,此数据的导出总共需要 137 列,其中许多列具有空值。

简单 我整理了一个查询,该查询基本上从我们的数据库中提取了这些信息,并设置了一些需要的常量。这个查询在这个问题中是什么并不相关,它只是一个SELECT提取一些数据的语句。

然后,我需要每天使用特定的文件名和管道分隔格式将其导出,效果如下:

--employee export
DECLARE @FileName varchar(500)
SET @FileName = (SELECT '\\someFileServer\Public\someFolder\employee_p06010603ace_305_202105_' + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(19), CONVERT(DATETIME, getdate(), 112), 126), '-', ''), 'T', ''), ':', '') + '.txt')
DECLARE @sql varchar(8000)
DECLARE @header varchar(8000)
SET @sql= 'bcp "exec [MyDBServer].[MyDbName].dbo.ConcurEmployeeExport" queryout ' + @FileName + ' -c -T -t "|"'
Exec master..xp_cmdshell @sql
Run Code Online (Sandbox Code Playgroud)

完美,我得到这样的行:

305|Jon| |Doe|10217487|10217487@t| 
305|Steve| |Smith|10217522|10217522@t|
Run Code Online (Sandbox Code Playgroud)

大约有 130 多列,不想显示所有这些,因为它无关紧要。我以为我已经完成了,直到实现协调员说 yes 看起来不错,但第一行需要从这个奇怪的行开始并带有一些值。

这意味着我拥有的结果查询应该有一个额外的行,其中包含一些值......简单我以为我会联合他们想要的......所以我做到了。

除了UNION ALL我必须输入一些额外的空值来匹配我的查询中的列数。问题是当我运行导出时,我最终得到了一堆用管道分隔的空列,我最终得到了这个:

100|0|SSO|UPDATE|EN|N|N| | | | | | …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server bcp format

6
推荐指数
1
解决办法
1万
查看次数

将非常大的 SQL Server 2016 结果集(超过 75 GB)转换为 CSV 文件?

将非常大的 SQL Server 2016 结果集(超过 75 GB)转换为 CSV 文件的最佳方法是什么?工程师需要这个输出来寻找相关性。

bcp73.5 GB 文件的路由填满了 tempdb 并开始使其他应用程序崩溃,包括 ETL 进程。

我们的用户希望导出最多 500 GB。

哪个进程会使用最少的资源,以便其他应用程序继续运行?

sql-server export bcp csv sql-server-2016

6
推荐指数
1
解决办法
2621
查看次数

批量插入 - 最佳用法

我需要将 1.5 亿行只有 int/bigint 列从一个 SQL 实例导出到另一个。我使用 BCP queryout 导出行和 BULK INSERT 将行导入另一个表。

我将 1.5 亿行拆分为 3 个 BCP 导出文件,每个文件有 5000 万行和 3 个 BULK INSERTS。它有效(15 分钟 BCP 输出/40 分钟批量插入),但我宁愿只导出一个文件并导入一个文件。

这在技术上是可行的,还是我可能会遇到大量行的问题?我从未从 BCP 文件中导入超过 5000 万行,我不确定这如何解决。BCP 导出或导入有限制吗?

谢谢,

sql-server-2008 insert bcp bulk

5
推荐指数
1
解决办法
2592
查看次数

bcp 数据库迁移

我希望一台服务器将数据库迁移到另一台服务器。在另一个服务器上的数据库已经存在,然后是所有的表,但它们是空的,我想填充。对于填充,我想使用 bcp - 数据库迁移。在命令行中,我写了以下内容:

bcp [dbo].[aspnet_Profile] in "c:\SQLAzureMW\BCPData\dbo.aspnet_Profile.dat" -E -n -b 10000 -a 16384 -S servername.database.windows.net -U username@servername -P "password" -d databasename!
Run Code Online (Sandbox Code Playgroud)

用户名和服务器名密码写正确。

当我运行时,我收到此错误: 在此处输入图片说明 错误 = 服务器不支持数据包大小更改,默认使用。

然后我将数据包大小固定为默认大小。我删除了“-a”。

bcp [dbo].[aspnet_Profile] in "c:\SQLAzureMW\BCPData\dbo.aspnet_Profile.dat" -E -n -b 10000 -S servername.database.windows.net -U username@servername -P "password" -d databasename!
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误: 在此处输入图片说明

谁能告诉我应该怎么做,或者有什么好的方法来移动数据库?我还使用了 SQL Azure 迁移向导,但它对我没有帮助。

sql-server migration bcp

5
推荐指数
1
解决办法
549
查看次数