Delphi查询优化
Posted
技术标签:
【中文标题】Delphi查询优化【英文标题】:Delphi Query optimize 【发布时间】:2016-12-04 10:58:09 【问题描述】:在我的应用程序中,我使用查询来选择记录。 TTable 目前包含 100,000 条记录。
这里是查询的 SQL (TABSQuery : Query of Absolute Database):
SELECT Field1, Field2, Field3, Field4
FROM MyTable
WHERE Field1 = Field1
Order BY Field1
以及按钮代码:
Query1.Filtered:=false;
Query1.DisableControls;
if not Query1.Prepared then
Query1.Prepare;
Query1.Open;
Query1.EnableControls
对于 100,000 条记录,需要 10 秒。这个执行时间好吗?
我的表可以包含几千万条记录,所以可能需要几十分钟... 请问如何优化和减少执行时间?还是有其他方法可以遵循? 字段已编入索引。 谢谢你的帮助
【问题讨论】:
对于这类问题,要求更快地进行查询,您确实需要提供表定义和索引定义,如果您也提供真实查询会有所帮助,因为如果您的真实查询选择80与只选择四个的列非常不同(如果必须,仍然可以取消标识,但这会更难)。 我的表有 28 个字段。查询使用字符串字段,它们被索引 您使用的是哪个 DBMS?查询的执行计划是什么?表的完整定义是什么?您在哪些列上有索引? 在表中,我有 28 列查询的字段是字符串: -Field 1:String,100 -Field 2:String,100 -Field 3:String,100 -Field 4:String , 100 此表是表大师的详细信息 【参考方案1】:首先,我认为您所说的执行时间并不是那么好,并且可能会有所改善。
由于您要选择表中的每一行,因此索引(在这种情况下)的唯一用途是排序,但不会使用 Field1
上的单字段索引,因为它不包含其他字段在你的SELECT
。
加快执行此查询
的一些选项 除非绝对必要,否则不要对结果进行排序 除非您真的要使用它们,否则不要返回所有行(根据我的经验,您需要所有行并且需要它们按顺序排列的情况并不多) 将Field1
上的索引更改为也包括Field2, Field3, Field4
(具体语法取决于您的RDBMS)
如果以上都不可能,请查看您的排序是在内存中完成还是溢出到磁盘,如果要进入磁盘可能会增加系统 RAM
请记住,更改索引可能会影响工作负载的其他方面,因此请先进行测试以确保没有不利影响。
【讨论】:
以上是关于Delphi查询优化的主要内容,如果未能解决你的问题,请参考以下文章