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

是否有任何工具集/技术来确定SQL查询在功能上是否相同?,sql,postgresql,query-optimization,Sql,Postgresql,Query Optimization,我从客户端接收SQL查询,其中包含由MS Access中的构建器生成的各种冗余子选择。我把SQL转换成Postgres,它就可以运行了——但我知道它的效率太低了。因此,我开始优化查询,并进行迭代改进——为了确定每个新查询在功能上是否相同,我运行它并确保它生成相同的结果集 当然,这并不能100%有效地确定一个查询是否与另一个查询相同——它依赖于探索每个不同情况的数据。一位同事建议我可以对每个查询运行一个解释计划,但承认内部db Optimizer可能会采用不同的查询策略,即使新的查询在功能上是相同

我从客户端接收SQL查询,其中包含由MS Access中的构建器生成的各种冗余子选择。我把SQL转换成Postgres,它就可以运行了——但我知道它的效率太低了。因此,我开始优化查询,并进行迭代改进——为了确定每个新查询在功能上是否相同,我运行它并确保它生成相同的结果集

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


我至少有中级SQL技能,但不是一个自信的查询优化者。因此,我对Postgres的任何工具集都感兴趣,这些工具集可以100%确定两个查询做相同的事情。如果它本身能建议优化,那就更好了!我相信蟾蜍可以做到这一点,但我不相信它对博士后有用。我在Mac OS X上。

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

我会说不。但是,如果索引正确,access查询在postgres中的性能不应该更差


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

假设您正在改进一个当然已经为PostgreSQL编写的PostgreSQL查询,请使用pgTap(PostgreSQL单元测试),这是毫无疑问的。您可以测试查询的运行时间和返回的结果。
升级到PostgreSQL 9.0或更高版本

发件人:

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

好问题。要求很高

正如你所知,在逻辑上是一致的。然后是生成相同计划的级别,即需要哪些表访问以及访问顺序

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


如果您的问题仅限于“在同一数据集上相同地执行”,那么比较解释计划就足够了,并且将包括逻辑一致性和某种程度的I/O一致性

这是一个好主意-谢谢-我很高兴它看起来是免费的(软件)。然而,它似乎是唯一的赢家——所以我在OS X上就不适合了。除非你在Mac上的VMware或Parallels下运行Windows。这是一个很好的观点。但这需要许可证。。。我想我确实有一些备用的XP许可证,但对于一个简单的工具来说,这是一个很大的工作量!谢谢你的回复。然而,问题不在于Access中的查询是否比Postgres中的查询快/慢。问题是,一旦我将一个查询转换为Postgres,我就知道这是低效的。我的任务是改进它,同时确保我没有改变查询的含义。最后一条评论的附录:换句话说,我在比较Postgres上的两个查询,而不是每个平台上的一个。谢谢你的提示。但是,如果我以“在已知数据库Y上选择X来生成结果Z”的形式设置单元测试,那么我需要考虑所有的边缘情况并相应地添加数据。因此,对于一组测试,我无法确定两个查询在功能上是否相同。我想我想要的是一个软件,它将检查PK/FK连接并执行必要的关系数学,以证明无论数据集如何,两个查询都做相同的事情。尽管如此,我仍将阅读该链接!出于兴趣,目前我的策略是确保所有查询以相同的方式排序,并生成大量结果。然后,我在psql中对每个查询进行管道传输,然后将其传输到shasum中,并假设如果校验和保持静态,则查询的含义将保持不变。是的,我认为不将问题限制在特定的数据集是有趣的,因为不需要数据集。然而,即使对于静态数据集,我认为解释计划也可能如此不同,以至于难以进行比较。考虑(a)解释来自用户的选择*,其中WorkGrp=“123”联合选择*来自用户,其中WorkGrp=“321”与(b)解释用户从哪里选择(123’,‘321’中的Workp)。查询在功能上是相同的,但计划却大不相同。也就是说,我是在8.4.4版本上-也许托梅茨基关于版本9的观点可以解决这个问题?:-)我会让老板知道的!我们使用的是8.4.4,但我对PostgreSQL来说太陌生了,不知道新版本是否会消除手动优化的需要(我的普遍现实主义/愤世嫉俗表明这是一厢情愿;-)。