【发布时间】:2017-08-31 14:35:58
【问题描述】:
我正在使用 Delphi-7 和 zeos 6.6.4(刚刚升级到 zeos 7.1.4) 在表的较大行上,查询变得非常缓慢。也没有那么多行(在 salesdetail 上,我的表大约有 200k 行)。在我备份并清理桌子后,它非常快。
我很确定问题出在 ZQuery1.Open 中。 我复制粘贴“搜索/选择查询”并在mysql上运行它只花了1秒左右。 -> 所以我确定这不是我的查询的错。 但是如果我在 Delphi7 上执行它,大约需要 15 秒。
我做了一些跟踪,发现问题出在ZQuery1.Open上,通过这段代码后,一切运行正常。
尝试将 zeos 升级到最新版本,但问题仍然存在。
有什么解决办法吗?
谢谢。
编辑: 我读过类似的案例:
"guyvdb 写道: 你好, 我们也做了一些测试,得出了同样的结论。 ZEOS 的“qry.open”非常慢。 使用“ADO”和“SQLDirect”速度显着提高 禁用 zeos.inc 中的调试定义不会改变任何东西。”
http://zeoslib.sourceforge.net/viewtopic.php?t=120
我更喜欢继续使用 zeos,而不是更改为 ADOquery 等,因为应用程序已经完成,问题在使用几个月后发现,在 table 上更大的数据之后。更改所有 zquery 将是很多工作变成别的东西。谢谢
【问题讨论】:
-
您的查询是否绑定到任何数据感知控件?如果是这样,这些可能会对数据事件做出反应。因此,您为
Open测量的 15 秒可能包括例如加载 200000 条记录的网格,而不仅仅是查询数据。 -
应该不是,因为这种情况下我的zquery1私下创建只是为了执行这个查询,zquery创建后,zquery.sql填充,然后zquery.open。没有其他用途/网格加载等相同的查询在 mysql 上的 1 秒内运行速度很快。我发现了类似的情况,请参考我编辑的 OP
-
你真的需要获取那么多行吗?表中是否有任何可能与其他数据一起被感染的 blob 字段?您是否在组件中定义了任何索引?差异很可能来自这样一个事实,即 ADO 仅获取实时窗口(1 秒内 200k 行非常快),而不是所有元组(因为它们可能稍后在滚动数据集时被获取),而 Zeos 全部获取它们(15 秒听起来不过很多)。
-
嗨 Victoria,No.. 200k 是 salesdetail 表上的总行数,但我在每个查询中只获取 2-10 行。我的查询很简单:选择销售额并与 id=xxx 的 salesdetail 联合。 salesdetail 表上的总行数不到 100k,zeos 的速度没有问题,但是一旦我的表变大(大约 200k++),它也会变慢。
-
“更大的行” 是什么意思?你可以在没有加入的情况下重现相同的内容(如果你运行
WHERE ID IN (...))?你在本地机器上运行你的服务器吗?到目前为止无法重现(Zeos 7.1.4)..
标签: mysql delphi delphi-7 zeos