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查询优化的主要内容,如果未能解决你的问题,请参考以下文章

MySql性能优化查询优化

如何做SqlServer 数据查询优化!

数据库 chapter 9 关系查询处理和查询优化

MYSQL性能调优06_分页查询优化JOIN关联查询优化in和exsits优化count(*)查询优化

第九章 关系查询处理和查询优化——关系数据库系统的查询处理

mysql 子查询 优化