powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / оптимизация запроса
14 сообщений из 14, страница 1 из 1
оптимизация запроса
    #39735636
Фотография Anton_Demin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Имеем большую таблицу BIG_TABLE около 2млрд строк, из которых актуальны только несколько тысяч.
Надо найти актуальные записи.
Использую такую конструкцию:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT *
  FROM BIG_TABLE t
 WHERE t.id IN (SELECT t1.id
                  FROM BIG_TABLE t1, ANOTHER_BIG_TABLE1 a1
                 WHERE t1.id = a1.id
                UNION
                SELECT t2.id
                  FROM BIG_TABLE t2, ANOTHER_BIG_TABLE2 a2
                 WHERE t2.id = a2.id
                UNION
                SELECT t3.id
                  FROM BIG_TABLE t3, ANOTHER_BIG_TABLE3 a3
                 WHERE t3.id = a3.id
                UNION
                SELECT t4.id
                  FROM BIG_TABLE t4, ANOTHER_BIG_TABLE4 a4
                 WHERE t4.id = a4.id
                UNION
                SELECT t5.id
                  FROM BIG_TABLE t5, ANOTHER_BIG_TABLE5 a5
                 WHERE t5.id = a5.id)


Подскажите способы оптимизации данного запроса, сейчас работает очень медленно.
В таблицах ANOTHER_BIG_TABLE_N нет ни ключа ни индекса по искомому id(((
Всё это добро вертится на Exadata.

Спасибо
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735642
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_Demin,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
                  
                 SELECT t1.id
                  FROM BIG_TABLE t1, ANOTHER_BIG_TABLE1 a1
                 WHERE t1.id = a1.id
                UNION
                SELECT t2.id
                  FROM BIG_TABLE t2, ANOTHER_BIG_TABLE2 a2
                 WHERE t2.id = a2.id
                UNION
                SELECT t3.id
                  FROM BIG_TABLE t3, ANOTHER_BIG_TABLE3 a3
                 WHERE t3.id = a3.id
                UNION
                SELECT t4.id
                  FROM BIG_TABLE t4, ANOTHER_BIG_TABLE4 a4
                 WHERE t4.id = a4.id
                UNION
                SELECT t5.id
                  FROM BIG_TABLE t5, ANOTHER_BIG_TABLE5 a5
                 WHERE t5.id = a5.id


"Выбрать одно и то же 5 раз"?
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735645
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooAnton_Demin,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
                  
                 SELECT t1.id
                  FROM BIG_TABLE t1, ANOTHER_BIG_TABLE1 a1
                 WHERE t1.id = a1.id
                UNION
                SELECT t2.id
                  FROM BIG_TABLE t2, ANOTHER_BIG_TABLE2 a2
                 WHERE t2.id = a2.id
                UNION
                SELECT t3.id
                  FROM BIG_TABLE t3, ANOTHER_BIG_TABLE3 a3
                 WHERE t3.id = a3.id
                UNION
                SELECT t4.id
                  FROM BIG_TABLE t4, ANOTHER_BIG_TABLE4 a4
                 WHERE t4.id = a4.id
                UNION
                SELECT t5.id
                  FROM BIG_TABLE t5, ANOTHER_BIG_TABLE5 a5
                 WHERE t5.id = a5.id


"Выбрать одно и то же 5 раз"?
Ты не видишь, что ли, что ANOTHER_BIG_TABLE разные?
Это BIG_TABLE одна и та же.
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735651
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooDshedooAnton_Demin,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
                  
                 SELECT t1.id
                  FROM BIG_TABLE t1, ANOTHER_BIG_TABLE1 a1
                 WHERE t1.id = a1.id
                UNION
                SELECT t2.id
                  FROM BIG_TABLE t2, ANOTHER_BIG_TABLE2 a2
                 WHERE t2.id = a2.id
                UNION
                SELECT t3.id
                  FROM BIG_TABLE t3, ANOTHER_BIG_TABLE3 a3
                 WHERE t3.id = a3.id
                UNION
                SELECT t4.id
                  FROM BIG_TABLE t4, ANOTHER_BIG_TABLE4 a4
                 WHERE t4.id = a4.id
                UNION
                SELECT t5.id
                  FROM BIG_TABLE t5, ANOTHER_BIG_TABLE5 a5
                 WHERE t5.id = a5.id


"Выбрать одно и то же 5 раз"?
Ты не видишь, что ли, что ANOTHER_BIG_TABLE разные?
Это BIG_TABLE одна и та же.
Ты бы лучше посоветовал что-нибудь, а не тыкал в названия таблиц.

Можно для начала на экзист переписать:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT *
  FROM BIG_TABLE t
 WHERE EXISTS (SELECT 1
                  FROM ANOTHER_BIG_TABLE1 a1
                 WHERE t.id = a1.id)
OR EXISTS (
                SELECT 2
                  FROM ANOTHER_BIG_TABLE2 a2
                 WHERE t.id = a2.id)
OR EXISTS (
                SELECT 3
                  FROM ANOTHER_BIG_TABLE3 a3
                 WHERE t.id = a3.id)
OR EXISTS (
                SELECT 4
                  FROM ANOTHER_BIG_TABLE4 a4
                 WHERE t.id = a4.id)
OR EXISTS (
                SELECT 5
                  FROM ANOTHER_BIG_TABLE5 a5
                 WHERE t.id = a5.id)
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735668
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo"Выбрать одно и то же 5 раз"?
6 раз, смотри внимательней )
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735670
efendi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anton_Demin,

Зачем повторно выбирать из BIG_TABLE? Можно ограничится запросом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
               SELECT t1.*
                 FROM BIG_TABLE t1, ANOTHER_BIG_TABLE1 a1
                WHERE t1.id = a1.id
                UNION
               SELECT t2.*
                 FROM BIG_TABLE t2, ANOTHER_BIG_TABLE2 a2
                WHERE t2.id = a2.id
                UNION
               SELECT t3.*
                 FROM BIG_TABLE t3, ANOTHER_BIG_TABLE3 a3
                WHERE t3.id = a3.id
                UNION
               SELECT t4.*
                 FROM BIG_TABLE t4, ANOTHER_BIG_TABLE4 a4
                WHERE t4.id = a4.id
                UNION
               SELECT t5.*
                 FROM BIG_TABLE t5, ANOTHER_BIG_TABLE5 a5
                WHERE t5.id = a5.id)
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735673
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_DeminИмеем большую таблицу BIG_TABLE около 2млрд строк
В таблицах ANOTHER_BIG_TABLE_N нет ни ключа ни индекса по искомому id(((

Он там и даром не нужен, или ты планировал 2млрд IRS на каждую таблицу?
Ну а так, приложи статистику по таблицам, планы запросов.
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735674
EvgeniaMakarova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anton_Demin,


select * from big_table t
left join (select id from ANOTHER_BIG_TABLE_1
union
select id from ANOTHER_BIG_TABLE_2
....
union
select id from ANOTHER_BIG_TABLE_5) all_another_big_tables
on (t.id =all_another_big_tables.id )
where nvl(all_another_big_tables,'xXx')!='xXx'

И вопрос -почему Вы не делает индекс на id в ANOTHER_BIG_TABLE_N ?
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735685
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgeniaMakarova left joinЭто не то же самое, что IN, хотя, если убрать left и не добавлять all, где тот напрашивается, то сойдет.

EvgeniaMakarovaпочему Вы не делает индекс на id в ANOTHER_BIG_TABLE_N ?XMLerОн там и даром не нужен
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735701
EvgeniaMakarova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,
надо поэкспериментировать что быстрее будет работать -левое соединение с фильтрацией на наллы или просто джойн.
У меня обычно левое быстрее работает, если правильно помню.
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735718
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_DeminВ таблицах ANOTHER_BIG_TABLE_N нет ни ключа ни индекса по искомому id(((
Всё это добро вертится на Exadata.
Storage indexes не помогают?
Ну и union лучше заменить на union all, это позволит попробовать https://docs.oracle.com/database/121/VLDBG/GUID-1F4C90F9-3EF5-423A-B55B-2593FB3F1433.htm

Дубли при необходимости убрать группировкой (в параллели)
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735722
Фотография Anton_Demin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо.
пока нашли 2 быстрых варианта:
вариант от EvgeniaMakarova
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT /*+ PARALLEL(4) */ *
  FROM big_table t
 WHERE t.id IN (SELECT id
                  FROM ANOTHER_BIG_TABLE_1
                UNION ALL
                SELECT id
                  FROM ANOTHER_BIG_TABLE_2 ...)


и
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
WITH B_TBL AS
 (SELECT /*+ index */ id
    FROM BIG_TABLE pc)
SELECT  /*+ PARALLEL(4) */ *
  FROM BIG_TABLE t
 WHERE t.id IN (SELECT t1.id
                  FROM B_TBL t1, ANOTHER_BIG_TABLE1 a1
                 WHERE t1.id = a1.id
                UNION ALL
                SELECT t2.id
                  FROM B_TBL t2, ANOTHER_BIG_TABLE2 a2
                 WHERE t2.id = a2.id
                UNION ALL
                SELECT t3.id
                  FROM B_TBL t3, ANOTHER_BIG_TABLE3 a3
                 WHERE t3.id = a3.id
                UNION ALL
                SELECT t4.id
                  FROM B_TBL t4, ANOTHER_BIG_TABLE4 a4
                 WHERE t4.id = a4.id
                UNION ALL
                SELECT t5.id
                  FROM B_TBL t5, ANOTHER_BIG_TABLE5 a5
                 WHERE t5.id = a5.id)
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735732
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_Demin,

Неужели экзист отработал хуже?о_О
...
Рейтинг: 0 / 0
оптимизация запроса
    #39735753
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_Deminпока нашли 2 быстрых варианта:

Стук в подвале стал реже?
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / оптимизация запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]