使用 ODBC 的 SQL 查询时间不一致

Posted

技术标签:

【中文标题】使用 ODBC 的 SQL 查询时间不一致【英文标题】:Inconsistent SQL query times with ODBC 【发布时间】:2014-07-11 12:58:35 【问题描述】:

在任何人开始之前,我就知道 ODBC 不是最好的做事方式,但我受到公司软件以前版本的限制。 我注意到查询速度存在一些非常严重的不一致,我试图弄清楚发生了什么,看看是否有什么可以改进的。例如:

var strConnect = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=ODBC_DATA_MDB";
var db = new ActiveXObject("adodb.Connection");
var cmd = new ActiveXObject("adodb.Command");
db.Open(strConnect); 
var strSQL = "INSERT INTO tblHeatsetDay SELECT * FROM tblHeatsetRecord WHERE DateTime >= fn CURDATE();";
cmd.CommandText = strSQL;
cmd.ActiveConnection = db;
cmd.Execute();

有时这会在瞬间运行,有时需要长达 15 秒左右。我的 ODBC 连接引用的文件是本地 .mdb,我知道没有其他任何东西可以打开、更改或以任何方式查询它。

有什么关于 ODBC 的东西使它这样做吗?我能做些什么来提高一致性?或者至少,有没有办法在需要这么长时间的情况下准确找出发生了什么?

【问题讨论】:

Microsoft 已切换回 ODBC,不推荐使用 OleDB (msdn.microsoft.com/en-us/library/hh967418.aspx) 我了解您受到限制,但是否可以使用 DAO + 链接表进行测试,只是为了仔细检查您的本地硬件是否可能发生其他问题?可能毫无意义的测试,但可能会提供见解 我只是要求通用知识,但是您见过多少次这种不一致?滞后时间与快速执行时间之间有什么区别(程序运行、计算机检查更新、更新在后台下载)?这里有很多事情需要考虑。 @OverMind,我在每台运行程序的计算机上都看到过它(到目前为止,有 5 或 6 台不同的计算机),每台计算机都有不同的硬件和 Windows 版本(有些是 7,有些是仍然使用 XP)。我在 32 位系统和 64 位系统上运行过它,我在 LAN 上运行过它并且完全与任何网络断开连接。这让我觉得这是代码中的一些东西(因为这几乎是唯一剩下的共同点),但是在注释掉除了上面的 sn-p 之外的所有内容之后(我可以做到的尽可能简单)我仍然发现问题。 我很困惑。代码看起来像 C#,但您使用的是 COM (ADODB.Connection) 而不是 System.Data.Odbc。您的连接字符串指定了一个Provider=,它暗示OLEDB(MSDASQL.1 看起来像SQL Server,而不是Access),但您的Data Source= 看起来像一个ODBC DSN。也许有问题的计算机和我一样困惑。 :) 【参考方案1】:

在 ODBC 中,它应该只解析为对 SQLExecDirect 的一次调用或对 SQLPrepare 和 SQLExecute 的两次调用。如果您的程序重复执行此操作,那么每次要执行 SQL 时 SQLPrepare 和 SQLExecute 更有意义 - 我无法告诉您如何在 javascript 中执行此操作。这取决于您如何编写 javascript 库以使用 ODBC,但我最多期望:

SQLPrepare(the sql)
SQLExecute
SQLNumResultCols
SQLRowCount

我无法相信这是造成不一致的原因,无论如何您甚至都没有返回任何行。更有可能的是,您的 select 语句每次调用它时都会返回不同数量的行。除此之外,无论您是在事务中还是使用 AutoCommit 都可能会有所不同,但它本身并不能解释您所看到的内容。

【讨论】:

以上是关于使用 ODBC 的 SQL 查询时间不一致的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中的地理位置查询结果不一致

记一次伪*sql查询结果不一致的

Oracle: 两个SQL语句查询数量不一致。

排查系统执行SQL与数据库直接执行结果不一致的问题

plsql 与 sqlplus 查询结果不一致

sql server查询数据不一致