Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server VBA到SQL链接最佳实践和性能_Sql Server_Vba_Excel - Fatal编程技术网

Sql server VBA到SQL链接最佳实践和性能

Sql server VBA到SQL链接最佳实践和性能,sql-server,vba,excel,Sql Server,Vba,Excel,我有以下问题。通常,当我在VBA中使用SQL命令生成字符串时,检索结果所需的时间不超过几秒钟(一些运行查询相当“繁重”) 然而,在一个“轻”的情况下,从VBA发送到SQL时需要几分钟。但是,当我在SQLServer中单独运行SQL代码时,代码的运行时间不到一秒钟。所以我想,VBA和SQL之间的连接函数有问题吗?我在下面列出了这两个代码: 首先,我有以下代码在VBA脚本和SQL Server之间建立连接(输入:SQL字符串;输出:SQL Server表结果) 我有一个数据库,如下所示: ID

我有以下问题。通常,当我在VBA中使用SQL命令生成字符串时,检索结果所需的时间不超过几秒钟(一些运行查询相当“繁重”)

然而,在一个“轻”的情况下,从VBA发送到SQL时需要几分钟。但是,当我在SQLServer中单独运行SQL代码时,代码的运行时间不到一秒钟。所以我想,VBA和SQL之间的连接函数有问题吗?我在下面列出了这两个代码:

首先,我有以下代码在VBA脚本和SQL Server之间建立连接(输入:SQL字符串;输出:SQL Server表结果)

我有一个数据库,如下所示:

ID   timetag              val
ID01 1990-01-01 00:00:00  20
ID01 1990-01-01 00:01:00  23
[...]
WITH rows AS (
    SELECT *,Row_Number() Over (ORDER BY timetag) as RN FROM [Database.dbo]
where ID = 'ID01' AND timetag between '1990-01-01 00:00:00' AND '1990-01-20 00:00:00')
SELECT DATEDIFF(minute,mc.timetag,mp.timetag) as differ1, mc.timetag as timetag1 ,mp.timetag as timetag2
    FROM rows mc  JOIN rows mp On mc.rn = mp.rn - 1 where   DATEDIFF(minute,mc.timetag,mp.timetag) > 1 order by timetag1
产生问题的代码如下所示:

ID   timetag              val
ID01 1990-01-01 00:00:00  20
ID01 1990-01-01 00:01:00  23
[...]
WITH rows AS (
    SELECT *,Row_Number() Over (ORDER BY timetag) as RN FROM [Database.dbo]
where ID = 'ID01' AND timetag between '1990-01-01 00:00:00' AND '1990-01-20 00:00:00')
SELECT DATEDIFF(minute,mc.timetag,mp.timetag) as differ1, mc.timetag as timetag1 ,mp.timetag as timetag2
    FROM rows mc  JOIN rows mp On mc.rn = mp.rn - 1 where   DATEDIFF(minute,mc.timetag,mp.timetag) > 1 order by timetag1
此查询的输出是一个表,其中后续时间标记之间的差值不等于1(min)。例如:

正如我所说,它在SQL server中运行得很快,但在我尝试从VBA执行查询时运行得非常慢。有什么建议吗?特别是我遵循“最佳/更好实践”选项从VBA连接到SQL server


更新:更奇怪的是,从第7个月开始到第7个月以上的时间都很慢。

如果你只打算读取记录,你可以尝试将LockType更改为adLockReadOnly


您还可以将光标位置从客户端更改为服务器(AdUseServer)

如果您只打算读取记录,可以尝试将LockType更改为adLockReadOnly


您还可以将光标位置从客户端更改为服务器(AdUseServer)

使用参数化查询,或者更好的是使用存储过程。我确信SQL正在做一些ado无法利用的优化/编译/正则化/其他花哨的术语。感谢阅读@MitchWheat@MitchWheat感谢您的链接使用参数化查询,或者更好的是,使用存储过程。我确信SQL正在做一些ado无法利用的优化/编译/正则化/其他花哨的术语。感谢阅读@MitchWheat@MitchWheat感谢您的链接不幸的是,修改一个或两个选项并没有提高执行时间(我还在后面计划修改数据)你有没有试过逐行检查代码?这会告诉你哪一行表现不佳。我怀疑可能是在打开记录集时,也可能是在获取行时。可能是在打开记录集期间,您是否尝试过从MSDASQL切换到SQL本机客户端(SQLNCLI11)?听起来没有任何ADO配置更改可以帮助您。相反,现在是时候看看SQL了。您可以尝试在SSMS中通过VBA对查询运行SQL Profiler。这应该有助于跟踪差异。不幸的是,修改一个或两个选项并没有提高执行时间(我在后面的步骤中也计划修改数据),您是否尝试过单步执行代码?这会告诉你哪一行表现不佳。我怀疑可能是在打开记录集时,也可能是在获取行时。可能是在打开记录集期间,您是否尝试过从MSDASQL切换到SQL本机客户端(SQLNCLI11)?听起来没有任何ADO配置更改可以帮助您。相反,现在是时候看看SQL了。您可以尝试在SSMS中通过VBA对查询运行SQL Profiler。这将帮助您跟踪差异。