Ускорьте запрос, простое внутреннее соединение с одной большой таблицей и одной маленькой таблицей - PullRequest
6 голосов
/ 09 июня 2010

У меня есть таблица T1 с 60 строками и 5 столбцами: ID1, ID2, info1, info2, info3.

У меня есть таблица T2 с 1,2 миллионами строк и еще 5 столбцами: ID3, ID2, info4, info5, info6.

Я хочу получить (ID1, ID2, info4, info5, info6) из всех строк, где ID2 совпадают.В настоящее время мой запрос выглядит так:

SELECT T1.ID1, T2.ID2,
       T2.info4, T2.info5, T2.info6
  FROM T1, T2
 WHERE T1.ID2 = T2.ID2;

Это займет около 15 секунд.У меня вопрос - должно ли это занять много времени, а если нет, как я могу ускорить его?Я полагаю, что не должно, так как T1 такой маленький.

Я попросил PostgreSQL ОБЪЯСНИТЬ запрос, и он говорит, что он хэширует T2, а затем хеш-соединения, которые хэшируют с T1.Кажется, хэширование T2 занимает столько времени.Есть ли способ написать запрос, чтобы он не хэшировал T2?Или есть способ, чтобы он кешировал хэш T2, чтобы он не делал это заново?Таблицы будут обновляться только каждые несколько дней.

Если это имеет значение, T1 - временная таблица, созданная ранее в сеансе.

Ответы [ 3 ]

13 голосов
/ 09 июня 2010

Это не должно занять много времени:)

Создание индекса на T2( ID2 ) должно повысить производительность вашего запроса:

CREATE INDEX idx_t2_id2 ON t2 (id2);
0 голосов
/ 09 июня 2010

Сначала сделайте объединение.

SELECT T1.ID1, T2.ID2,
       T2.info4, T2.info5, T2.info6
  FROM T1
  JOIN T2 ON T1.ID2 = T2.ID2;

Затем попробуйте создать и проиндексировать T2.d2.

Если нет, если возможно, вы можете добавить столбец ID1 в T2.Обновите его соответственно каждые несколько дней, как вы утверждаете.Тогда это простой запрос к T2 без объединений.

SELECT T2.ID1, T2.ID2,
       T2.info4, T2.info5, T2.info6
  FROM T2 
  WHERE T2.ID2 = A_VALUE;

Опять же, будет рекомендован индекс для T2.ID2.

0 голосов
/ 09 июня 2010

Возможно использование JOIN увеличивает скорость запроса:

SELECT T1.ID1, T2.ID2,
    T2.info4, T2.info5, T2.info6
FROM T1
JOIN T2 ON T2.ID2 = T1.ID2;

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

И, конечно, как заметил Питер Лэнг, вы должны создать индекс.

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