OpenRowSet,OpenQuery,OpenDataSource - 在性能方面更好

Los*_*der 6 performance openquery openrowset

这可能是一个值得商榷的答案,但我正在寻找需要将本地Excel文件导出到本地SQL Server 2008表的情况.

有没有人有机会检查执行时间来比较OpenRowSet/OpenQuery/OpenDataSource在SQL Server 2008中进行非常大的文件导入?

我可以使用3个选项中的任何一个,并且可以从任何地方执行查询.但是,数据源(Excel)与SQL Server位于同一服务器中.

任何指针都会有所帮助.

小智 4

这个问题被问到已经有近 12 年了,浏览量达到了 2000 次,这意味着人们有兴趣知道答案……即使在今天,也想知道这个答案……

因此,我创建了一个包含 10 万行的 Excel 电子表格,并将其注册为链接服务器,然后将四种不同类型的打开查询的持续时间的平均结果与该数据进行比较。结果如下:

需要进行一些设置,需要 SQL 服务器上的管理员权限、注册 OLEDB 提供程序并获取文件权限。

此测试在 2016 版 SQL Server Enterprise(64 位)上运行。

每个方程运行 12 个周期并取平均值和四舍五入。

1. 测试 OpenRowset:

SELECT *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
                'Excel 12.0 Xml;Database=C:\temp\sample100k.xlsx;',
                Sample100k$);
Run Code Online (Sandbox Code Playgroud)
CPU Time: 4705 ms
Elapsed Time: 7894 ms
Run Code Online (Sandbox Code Playgroud)

2. 测试开放数据源

CPU Time: 4705 ms
Elapsed Time: 7894 ms
Run Code Online (Sandbox Code Playgroud)
CPU Time: 4794 ms
Elapsed Time: 7918 ms
Run Code Online (Sandbox Code Playgroud)

3. 测试链接服务器上的直接查询

SELECT *
FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0',
                    'Data Source=C:\temp\sample100k.xlsx;Extended Properties=EXCEL 12.0')
                    ...[Sample100k$];
Run Code Online (Sandbox Code Playgroud)
CPU Time: 4794 ms
Elapsed Time: 7918 ms
Run Code Online (Sandbox Code Playgroud)
CPU Time: 4919 ms
Elapsed Time: 7934 ms
Run Code Online (Sandbox Code Playgroud)

4. 在链接服务器上测试 OpenQuery

/* Configuration. Only run once for setting up the linked server */
/* Note that this step needs to take place for the third and fourth tests */

EXEC sys.sp_addlinkedserver @server = N'SAMPLE100K',
                            @srvproduct = N'Excel',
                            @provider = N'Microsoft.ACE.OLEDB.12.0',
                            @datasrc = N'C:\temp\sample100k.xlsx',
                            @provstr = N'Excel 12.0'
Run Code Online (Sandbox Code Playgroud)
CPU Time: 3569 ms
Elapsed Time: 5643 ms
Run Code Online (Sandbox Code Playgroud)

我没想到会有这样的结果;看起来测试 4 ( SELECT * FROM OPENQUERY...) 的执行速度比平均值快 20%,比测试 3 ( SELECT * FROM SAMPLE100K...)中的链接服务器查询快 25% 以上

我将让 OP 和其他读者确定他们是否应该真正使用这些方法中的任何一种,而不是进行表导入、BCP、SSIS ETL 包或其他方法。

我只是为每隔一天访问此页面的堆栈溢出访问者提供问题的答案。