从客户端我收到的SQL查询包含由MS Access中的构建器生成的各种冗余子SELECT。我将SQL转换为Postgres,它运行 - 但我知道这是无效的低效率。因此,我着手优化查询,并进行迭代改进 - 并确定每个新查询是否在功能上相同,我运行它并确保它生成相同的结果集。
当然,这在确定一个查询是否与另一个查询相同时并非100%有效 - 它依赖于探索每个不同情况的数据。一位同事建议我可以针对每个查询运行解释计划,但承认内部数据库优化器可能采用不同的查询策略,即使新查询在功能上是相同的(这是一件好事 - 新策略可能更有效率)。
我至少具有中级SQL技能,但我不是一个自信的查询优化器。所以,我对Postgres的任何工具集感兴趣,可以100%确定两个查询做同样的事情。如果能够提出优化建议,那就更好了!我相信TOAD可以做到这一点,但我认为它不适用于Postgres。我在Mac OS X上。
答案 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或更高版本。
- 针对特定类型的查询的多项性能增强,包括消除不必要的联接。这有助于优化一些自动生成的查询,例如由对象关系映射器(ORM)生成的查询。
答案 4 :(得分:0)
我会说不。但是,如果给出适当的索引,来自访问的查询在postgres中的表现应该不会更差。
您可能会慢慢查询查询,因为msaccess通常会返回部分结果,并且只有在浏览数据集时才会继续执行查询,其中postgres通常会运行整个查询(当然取决于您使用的客户端)。