使用OR

时间:2016-06-19 22:53:36

标签: sql postgresql recursive-query postgresql-performance

如果删除“OR”子句,以下查询会快10倍。

WITH RECURSIVE toeng(lang1, english, syn, enid) AS
(SELECT lang1.word, english.word, english.synonym, english.id  
FROM lang1 INNER JOIN english ON lang1.english_id=english.id
UNION
SELECT CAST('' as VARCHAR(255)), english.word, english.synonym, english.id
FROM english JOIN toeng ON toeng.syn=english.id OR toeng.enid=english.synonym)
....

查询的目标是递归地检索初始节点集的所有父/子。 有没有办法让它更快?我试图将它分成多个连接,但我找不到完全相同的东西。我正在使用PostgreSQL。

2 个答案:

答案 0 :(得分:0)

  如果我删除" OR"

查询速度提高了10倍条款

在这种情况下,请确保在toeng.enid(表示english.id)和english.synonym上创建了正确的索引。通常,您应该在JOIN ON子句,WHERE子句,HAVINGORDER BY子句中使用您要使用的列的索引。

答案 1 :(得分:0)

您在评论中提到english.id已被编入索引。这很好。

查询速度慢的原因是因为FROM english JOIN toeng ON toeng.enid = english.synonym会很慢。如果没有english.synonym上的索引,该子句会强制进行全表扫描 完整子句toeng.syn = english.id OR toeng.enid = english.synonym可以使用english.id索引匹配某些记录,但仍需要全表扫描才能获取不匹配的匹配english.synonym记录由索引覆盖。如果需要全表扫描,优化器知道使用索引是没有意义的,因此它会完全跳过索引。

解决方案:您需要在english.synonym上添加索引,作为独立索引或multi-column index的一部分(将其添加到english.id } index)。