自有应用程序内部的查询调用与高级数据库架构师之间的优化差异
Posted
技术标签:
【中文标题】自有应用程序内部的查询调用与高级数据库架构师之间的优化差异【英文标题】:Difference in optimization between query call inside own application and the advances database architect 【发布时间】:2011-11-21 09:18:50 【问题描述】:我目前正在使用 sybase 的优势数据库服务器。我在 delphi 编程,我使用的是本地服务器。我的问题是,如果我在自己的源代码中进行 sql 查询,查询速度会慢 3 倍(尤其是对于嵌套的 Select 查询),就好像我也会在 sybase 提供的 Advantage Database Architect 中使用完全相同的查询一样。 数据库也是一样的。有没有我遗漏的优化步骤?
我的源代码如下所示:
//Initializing Connection and Query
FADSConnection.LoginPrompt := false;
FADSConnection.ConnectPath := Filename;
FADSConnection.AdsServerTypes := [stADS_LOCAL];
FADSConnection.Name := 'ADB';
FADSConnection.EncryptionOptions.DataEncryptionType := etAdsAES256;
FADSConnection.IsConnected := true;
FADSQuery.DatabaseName := FADSConnection.Name;
FADSQuery.SourceTableType := ttAdsADT;
FADSQuery.AdsTableOptions.AdsCharType := GERMAN_VFP_CI_AS_437;
s := 'SELECT *'
+ 'FROM ADB_Table1 WHERE No IN'
+'(SELECT No'
+ 'FROM ADB_Table2 WHERE V=0.4 AND N=26 AND No IN'
+ '(SELECT No FROM ADB_Table2 WHERE V=0.6 AND N=8)) AND Count=2'
FADSQuery.sql.Text := s;
FADSQuery.Open;
FADSQuery.first;
在我的程序中查询需要 600 毫秒。在优势数据库架构师中,它需要 200 毫秒。该数据库有大约 18000 个条目。
提前谢谢你!
【问题讨论】:
您是如何测量程序中的运行时间的?差异可能是由于测量的不同。 看来您正在使用数据字典。您是否尝试将查询放入视图并从 ARC 和您的程序运行? @Jens Mühlenhoff 我认为这不是测量的问题。因为感觉也更长,如果我稍微更改搜索条件,在架构师中查询需要 2 秒,而在我的程序中需要 10 秒。还没有尝试过这个视图,但我会这样做并报告。 ARC 仅测量填充显示网格所需的时间。如果您衡量在应用程序中处理整个结果集的时间,那么这可能是造成差异的原因。 我同意亚历克斯的观点。另外,请记住,使用本地服务器(特别是如果 DB 在不同的机器上),多个用户会减慢访问速度。当您运行程序时,ARC 仍然连接,反之亦然,使用 ARC 时应用程序仍然连接吗?请参阅 devzone.advantagedatabase.com 上的 KB 980901-0452 【参考方案1】:所以,我发现了我的错误:
问题是查询实例的初始化。 不知何故,源表类型和 AdsCharType 的过度处理是不必要的。
FADSQuery.SourceTableType := ttAdsAdt;
FADSQuery.Tableoptions.AdsCharType := GERMAN_VFP_CI_AS_437;
我刚刚删除了以上几行,我的查询几乎与 Advantage Data Architect 一样快。
【讨论】:
以上是关于自有应用程序内部的查询调用与高级数据库架构师之间的优化差异的主要内容,如果未能解决你的问题,请参考以下文章
不知名大佬分享的Alibaba内部Java高级架构师380道面试题,直接3杀斩获阿里腾讯网易offer