如何在PostgreSQL 8.3中重写查询

如何在PostgreSQL 8.3中重写查询,sql,postgresql,Sql,Postgresql,我对SQL非常陌生,在某项任务上需要一些帮助。我有一个查询,由我们的Flex/Java代码调用,它连接多个表以获取信息。在运行解释分析时,我发现查询需要15分钟以上,如果站点流量很大,有时甚至会超时。我试图做的是创建一个规则或触发器,查看是否调用了查询并从物化视图表中选择数据。我尝试为此实现一个规则,但在尝试连接规则中的多个表时收到错误时,我遇到了困难。基本上,有没有一种方法,无论是规则、触发器,还是我没有研究过的任何东西,让我看看是否执行了某个查询,我可以用另一个表中的查询替换该查询?提前谢谢

我对SQL非常陌生,在某项任务上需要一些帮助。我有一个查询,由我们的Flex/Java代码调用,它连接多个表以获取信息。在运行解释分析时,我发现查询需要15分钟以上,如果站点流量很大,有时甚至会超时。我试图做的是创建一个规则或触发器,查看是否调用了查询并从物化视图表中选择数据。我尝试为此实现一个规则,但在尝试连接规则中的多个表时收到错误时,我遇到了困难。基本上,有没有一种方法,无论是规则、触发器,还是我没有研究过的任何东西,让我看看是否执行了某个查询,我可以用另一个表中的查询替换该查询?提前谢谢

查询示例:

select
   player_id,
   player_names,
   player_level,
   current_location
from
   server_info
   join players using (player_id)
   join locations using (location_id)
where
   current_location = 'Central Hub'

如果这是您想要的,为什么不直接更改应用程序以获取物化视图?据我所知,没有办法重写一个复杂的连接来生成一个不相关的表。如果可以,你真的想在你的查询计划器/规则系统中有这样深刻的巫毒吗?SQL视图是使用选择规则实现的,但这并不能使您从复杂查询过渡到具体化视图。它把你从表1带到表2


更好的问题是玩家id和位置id上的类型是什么,它们都是int吗?它们都有btree索引吗?当前位置是否已编制索引,是否用于等式、正则表达式或类似条件?您使用的是什么版本的Postgresql?您能否附上导致大量等待时间的查询的解释分析?

。。。您想检测是否运行了特定的查询,停止它,而是在apblication程序没有注意到的情况下将不同的查询注入到同一会话中?那不是查询重写,那是。。。我不知道该怎么称呼它,但我很肯定这不是解决问题的正确方法。您不能更好地表述查询,然后在应用程序中更改发出查询的点吗?这似乎不是一个非常复杂的查询。您确定这不仅仅是表上的索引问题吗?假设连接在FKs上,可能是当前位置上的索引,那么查询速度应该相当快。我们的数据库确实非常庞大,我们目前正在将所有内容转移到新服务器上,并且可能会重做大部分数据库。问题是,我们有两个独立的应用程序,一个用于客户端,一个用于管理员,只有管理员应用程序才能获取服务器信息。我们试图在Flex代码本身中实现这一点,但项目已经损坏,我们不必花费时间或资源来开发新的Flex应用程序。所以我们认为规则可以很快替代。这不是正确的答案,而是一个临时答案。玩家id和位置id都是int,它们没有btree索引,位置id是索引的。查询确实使用了相等条件。服务器使用版本8.3,我刚刚尝试运行解释分析,但超时了。我们正试图找到一种从复杂查询到物化视图的方法,但我们正试图从数据库本身进行此操作,因为我们无法重建应用程序,因为文件已损坏。必须在两个表中的player_id和location_id中都有btree索引,否则查询速度会非常慢。进入psql并附加\d server\u info、\d players和\d locations的输出,在单词Indexes上面剪切出表描述:,也使用是一种质量测试速记,当前位置='Central Hub'也是如此,请重新回答,当前位置是否已索引,是否用于相等,regex,或者像条件句一样?肯定需要索引。我打赌这解决了99%的问题。@Evan:我们昨晚在添加索引并将查询改为指向ID而不是实际标题后运行了真空分析,我必须说我们看到速度有了很大的提高。我们仍然要重做大部分数据库,因为我们要转移到更新的服务器上。谢谢您的帮助。@Seb,好的,从这个角度来看,db模式和查询看起来非常好。我建议您提出问题,直到更有经验的DB用户激发更改。如果由于对索引或DB调优的误解而转移到另一个更糟糕的模式,那将不会有任何好处。就我个人而言,如果你不把速度提高20倍,我会感到震惊。