powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / опять про это
9 сообщений из 9, страница 1 из 1
опять про это
    #32157786
Artfil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ я совсем запутался.\r
У меня есть две больших таблицы 1 и 2.\r
Когда идет запрос select * from 1,2 where условие для 1 and поле 1=поле 2(+)\r
то где-то минута (приемлемо) а если \r
select * from 1,2 where условие для 1 and условие для 2 and поле1=поле2(+), то не смог дождаться окончания выполнения\r
Читал ветку\r
/topic/16778\r
попробовал select * from 1,(select * from 2 where условие для 2),2 where условие для 1 and поле1=поле2(+) тоже не дождался.\r
Отдельно (select * from 2 where условие для 2) выполняется за 12 сек.
...
Рейтинг: 0 / 0
опять про это
    #32158075
Виктор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по нормальному нельзя написать вопрос? Фактически ты написал вот что:
У меня есть разные (А они у тебя разные) запросы, один из них работает быстро, а второй нет. Что делать?
Нужны реальные запросы и планы их выполнения. А иначе ты не дождешься ответа :-)
...
Рейтинг: 0 / 0
опять про это
    #32158132
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Artfil:
То что ты запутался - это понятно. А вопрос-то какой?
Давай версии Oracle, планы выполнения запросов.
...
Рейтинг: 0 / 0
опять про это
    #32159869
Artfil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Долго молчал - готовился.
Версия Оракла - 8.1.6
таблица t1 - 340 тыс.
таблица t2 - 880 тыс.
Запрос который делается быстро

SQL> select count(*) from t1,t2 where t2.num2=t1.num1(+) and t2.val2 like '4402%' a
nd t1.val1='40';

COUNT(*)
----------
32


Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 FILTER
3 2 NESTED LOOPS (OUTER)
4 3 TABLE ACCESS (BY INDEX ROWID) OF 'T2'
5 4 INDEX (RANGE SCAN) OF 'D23' (NON-UNIQUE)
6 3 TABLE ACCESS (BY INDEX ROWID) OF 'T1'
7 6 INDEX (RANGE SCAN) OF 'D1' (NON-UNIQUE)


добавляем 1 условие

select count(*) from t1,t2 where t2.num2=t1.num1(+) and t2.val2 like '440%' and t1.val1='40';

Не могу дождаться даже выполнения плана....
...
Рейтинг: 0 / 0
опять про это
    #32159887
Artfil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дополнение к последнему топику (выполнялся минут 20)

SQL> select count(*) from t1,t2 where t2.num2=t1.num1(+) and t2.val2 like '440%' and t1.val1='40';

COUNT(*)
----------
2420


Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 FILTER
3 2 NESTED LOOPS (OUTER)
4 3 TABLE ACCESS (BY INDEX ROWID) OF 'T2'
5 4 INDEX (RANGE SCAN) OF 'D23' (NON-UNIQUE)
6 3 TABLE ACCESS (BY INDEX ROWID) OF 'T1'
7 6 INDEX (RANGE SCAN) OF 'D1' (NON-UNIQUE)
...
Рейтинг: 0 / 0
опять про это
    #32159898
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и что тут удивительного - просто в первом случае значение было более уточнено и index range scan выполнялся гораздо быстрее.

P.S. Для того чтоб получить план запроса ненужно его выполнять. Например, в sql*plus надо сделать set autot trace exp
...
Рейтинг: 0 / 0
опять про это
    #32159922
Artfil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного некорректные запросы привел, еще раз два запроса с разницей на одно условие
SQL> select * from t1,t2 where t2.num2=t1.num1(+) and t2.val2 like '440%';

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 NESTED LOOPS (OUTER)
3 2 TABLE ACCESS (BY INDEX ROWID) OF 'T2'
4 3 INDEX (RANGE SCAN) OF 'D23' (NON-UNIQUE)
5 2 INDEX (RANGE SCAN) OF 'D1' (NON-UNIQUE)

Выполняется быстро

а запрос с добавлением дополнительного условия по t1 вводит сервер в глубокий ступор
select count(*) from t1,t2 where t2.num2=t1.num1(+) and t2.val2 like '440%' and t1.val1='40';

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 FILTER
3 2 NESTED LOOPS (OUTER)
4 3 TABLE ACCESS (BY INDEX ROWID) OF 'T2'
5 4 INDEX (RANGE SCAN) OF 'D23' (NON-UNIQUE)
6 3 TABLE ACCESS (BY INDEX ROWID) OF 'T1'
7 6 INDEX (RANGE SCAN) OF 'D1' (NON-UNIQUE)
...
Рейтинг: 0 / 0
опять про это
    #32159926
Artfil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В последнем запросе тоже select * - для чистоты эксперимента...
...
Рейтинг: 0 / 0
опять про это
    #32160836
Artfil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос снялся построением статистика для обоих таблиц
ANALYZE TABLE my_table ESTIMATE STATISTICS
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / опять про это
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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