Таблица с 36 записями объединяется с таблицей с 2 ​​151 316 записями

avatar
Imran Qadir Baksh - Baloch
8 апреля 2018 в 10:23
61
2
1

Я использую Oracle. Мой запрос выполняется быстро, если я не присоединяюсь к таблице всего с 36 записями. Если я присоединяюсь, то это занимает почти 2 секунды. Теперь я хочу улучшить запрос. Вот пример запроса,

SELECT BT.Col1, Count('t') 
FROM BigTable BT
INNER JOIN  SmallTable ST ON ST.SomeCol = BT.SomeCol
GROUP BY BT.Col1

Я также тестировал EXISTS, но время осталось прежним.

Большая таблица содержит 2 151 300 записей, а малая — 36 записей.

Источник
Littlefoot
8 апреля 2018 в 10:25
2

Индексируется ли BT.SomeCol? Вы собрали статистику?

Imran Qadir Baksh - Baloch
8 апреля 2018 в 10:31
0

Да, но все равно медленно.

Imran Qadir Baksh - Baloch
8 апреля 2018 в 10:38
0

@Tomalak Я просто хочу убедиться, что BT.Col1 существует в SmallTable

dnoeth
8 апреля 2018 в 10:46
1

@Tomalak: ваши запросы не вернут тот же результат.

Ответы (2)

avatar
krokodilko
8 апреля 2018 в 11:36
1

Создайте этот индекс в BigTable:

CREATE INDEX big_covering_ix ON BigTable( SomeCol, Col1 );

Я не уверен, какова цель константы t здесь:

SELECT  ..... Count('t') 

Было бы проще: Count(*). Во всяком случае, на скорость запроса это не влияет.

avatar
Gordon Linoff
8 апреля 2018 в 11:43
1

Я бы предложил записать это как exists, а затем добавить индексы. Запрос:

SELECT BT.Col1, Count(*) 
FROM BigTable BT
WHERE EXISTS (SELECT 1 FROM SmallTable ST WHERE ST.SomeCol = BT.SomeCol)
GROUP BY BT.Col1;

Это предполагает, что SmallTable не имеет дубликатов.

Для этого запроса попробуйте индексировать BigTable(col1, somecol).