Нужна помощь в оптимизации запросов к базе данных.Очень неопытный с индексами - PullRequest
0 голосов
/ 05 мая 2011

Мне нужно оптимизировать этот запрос. Профессор рекомендует использовать индексы, но я очень смущен тем, как. Если бы я мог получить только один пример того, что такое хороший индекс и почему, и какой код нужен, я бы определенно сделал все остальное сам. Любая помощь будет потрясающей. (PSQL кстати)

    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 Ответ

1 голос
/ 05 мая 2011

Я думаю, что сам SQL можно оптимизировать для повышения производительности в дополнение к просмотру индексов. Наличие этих IN предложений в предложении WHERE может привести к тому, что оптимизатор выполнит полное сканирование таблицы. Так что, если бы вы могли переместить эти таблицы в раздел FROM, вы бы имели лучшую производительность. Кроме того, наличие предложений COUNT(DISTINCT ...) в операторе SELECT представляется проблематичным. Скорее всего, было бы лучше, если бы вы могли вносить изменения, чтобы в них были необходимы предложения DISTINCT, и просто использовали агрегатную функцию COUNT.

Рассмотрите возможность использования оператора SQL в предложении FROM перед выполнением левого соединения - структура примерно такая:

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

Я знаю, что это не дает вам решения, но, надеюсь, оно поможет вам подумать о других аспектах проблемы и изучить другие способы снижения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...