需要帮助优化数据库查询。指数非常缺乏经验

时间:2011-05-04 21:26:40

标签: database optimization indexing postgresql

我需要优化此查询。教授建议使用指数,但我对如何使用非常困惑。如果我能得到一个好的索引是什么以及为什么以及所需的实际代码的一个例子,我自己肯定可以做其余的事情。任何帮助都是极好的。 (PSQL btw)

    SELECT 
      x.enteredBy
      , x.id
      , count(DISTINCT xr.id)
      , count(DISTINCT c.id)
      , 'l'
 FROM 
      ((locationsV x left outer join locationReviews xr on x.id = xr.lid)
       left outer join reviews r on r.id = xr.id) 
       left outer join comments c on xr.id = c.reviewId
 WHERE 
      x.vNo = 0  
      AND (r.enteredBy IS NULL OR 
            (r.enteredBy <> x.enteredBy 
             AND c.enteredBy <> x.enteredBy
             AND r.enteredBY NOT IN 
                       (SELECT requested FROM friends WHERE requester = x.enteredBY)
             AND r.enteredBY NOT IN 
                       (SELECT requester FROM friends WHERE requested = x.enteredBY)))
     AND (c.enteredBy IS NULL OR 
             (c.enteredBY NOT IN 
                       (SELECT requested FROM friends WHERE requester = x.enteredBY)
             AND c.enteredBY NOT IN 
                       (SELECT requester FROM friends WHERE requested = x.enteredBY)))
 GROUP BY 
     x.enteredBy
     , x.id

我尝试在开头添加这样的东西,但它花费的总时间没有改变。

CREATE INDEX friends1_idx ON friends(requested);
CREATE INDEX friends2_idx ON friends(requester);

1 个答案:

答案 0 :(得分:1)

我认为除了查看索引之外,我还可以对SQL本身进行优化以提高性能。在WHERE子句中包含这些IN子句可能会导致优化器执行全表扫描。因此,如果您可以将这些表移到FROM部分,那么您的表现会更好。此外,在COUNT(DISTINCT ...)语句中包含SELECT条款似乎也存在问题。如果您可以进行更改,那么您可能会感觉更好,因此DISTINCT子句在那里是必要的,只需使用COUNT聚合函数。

在进行左连接之前,请考虑在FROM子句中使用SQL语句 - 这样的结构:

SELECT ... 
FROM Table1 LEFT JOIN 
     (SELECT ... FROM Table2 INNER JOIN Table3 ON ...) AS Table4 ON
        Table1.somecolumn = Table4.somecolumn
...

我知道这并没有为您提供解决方案,但希望它能帮助您思考问题的其他方面,并探索解决性能的其他方法。