Ускорьте запрос, простое внутреннее объединение с одной большой таблицей и одной маленькой таблицей

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

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

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

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 является временной таблицей, составленной ранее на сессии.

6
задан Claudiu 9 June 2010 в 15:13
поделиться

3 ответа

Это не займет много времени :)

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

CREATE INDEX idx_t2_id2 ON t2 (id2);
13
ответ дан 8 December 2019 в 18:32
поделиться

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

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

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

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

0
ответ дан 8 December 2019 в 18:32
поделиться

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

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
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: