是否有任何工具集/技术来确定SQL查询在功能上是否相同?

时间:2010-10-11 17:08:20

标签: sql postgresql query-optimization

从客户端我收到的SQL查询包含由MS Access中的构建器生成的各种冗余子SELECT。我将SQL转换为Postgres,它运行 - 但我知道这是无效的低效率。因此,我着手优化查询,并进行迭代改进 - 并确定每个新查询是否在功能上相同,我运行它并确保它生成相同的结果集。

当然,这在确定一个查询是否与另一个查询相同时并非100%有效 - 它依赖于探索每个不同情况的数据。一位同事建议我可以针对每个查询运行解释计划,但承认内部数据库优化器可能采用不同的查询策略,即使新查询在功能上是相同的(这是一件好事 - 新策略可能更有效率)。

我至少具有中级SQL技能,但我不是一个自信的查询优化器。所以,我对Postgres的任何工具集感兴趣,可以100%确定两个查询做同样的事情。如果能够提出优化建议,那就更好了!我相信TOAD可以做到这一点,但我认为它不适用于Postgres。我在Mac OS X上。

5 个答案:

答案 0 :(得分:2)

好问题。高阶。

如您所知,逻辑相同的水平。然后,就需要哪些表访问以及按什么顺序生成相同计划的级别。

最后,将这些基础计划与表中数据的分布进行比较,以确定是否在表上使用给定索引,并且还使用缓存数据页。 (我知道30,000英尺的描述)

如果您的问题仅限于“在同一数据集上执行相同”,那么比较EXPLAIN计划就足够了,并且将包含逻辑相同性和某种级别的I / O相同性。

答案 1 :(得分:1)

您可以尝试在MySQL上使用TOAD来分析查询。一旦改进了查询,就将其移植到PostgreSQL。

答案 2 :(得分:1)

假设您正在改进PostgreSQL查询,当然已经为PostgreSQL编写了使用pgTap(PostgreSQL的单元测试),毫无疑问。您可以测试查询运行的时间以及返回的结果等。 http://pgtap.org/

答案 3 :(得分:1)

升级到PostgreSQL 9.0或更高版本。

来自9.0 release notes

  • 针对特定类型的查询的多项性能增强,包括消除不必要的联接。这有助于优化一些自动生成的查询,例如由对象关系映射器(ORM)生成的查询。

答案 4 :(得分:0)

我会说不。但是,如果给出适当的索引,来自访问的查询在postgres中的表现应该不会更差。

您可能会慢慢查询查询,因为msaccess通常会返回部分结果,并且只有在浏览数据集时才会继续执行查询,其中postgres通常会运行整个查询(当然取决于您使用的客户端)。