powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / в плане сделать hash_unique вместо sort_unique
9 сообщений из 9, страница 1 из 1
в плане сделать hash_unique вместо sort_unique
    #39763188
Pavel_PV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Вот задался вопросом, как в план вкорячить HASH_UNIQUE вместо sort_unique для определенного вида запросов. Лучше используя хинты, но можно и параметры сессии.
Кратко зачем. В случае если у вас есть большая таблица и она хранится в IM, то в случае с hash unique идёт скан словаря IM и данные возвращаются быстро, в случае же sort_unique нужно будет подождать несколько секунд т.к. выполняется именно сканирование всего столбца. Это из личных наблюдений и тестов, если у кого-то есть другая информация буду признателен.
Заранее скажу, что количество различных значений в колоноке изначально меньше чем 65001. Но убрать это условие нельзя на данный момент :).
По итогу в первом запросе в плане хочется получить строчку HASH UNIQUE.

Для примера:
Код: plsql
1.
2.
3.
 create table test123(
t varchar2(100),
i number);




Код: plsql
1.
2.
3.
4.
explain plan for
select/*+ no_parallel*/ D1.c1 as c1 from ( select distinct I as c1 from  test123 order by c1) D1 where rownum <= 65001;
select *
from table(dbms_xplan.display);


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Plan hash value: 3587845766
 
---------------------------------------------------------------------------------
| Id  | Operation             | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |         |    82 |  1066 |     4  (50)| 00:00:01 |
|*  1 |  COUNT STOPKEY        |         |       |       |            |          |
|   2 |   VIEW                |         |    82 |  1066 |     4  (50)| 00:00:01 |
|*  3 |    SORT UNIQUE STOPKEY|         |    82 |  1066 |     3  (34)| 00:00:01 |
|   4 |     TABLE ACCESS FULL | TEST123 |    82 |  1066 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter(ROWNUM<=65001)
   3 - filter(ROWNUM<=65001)
 
Note
-----
   - Degree of Parallelism is 1 because of hint



Код: plsql
1.
2.
3.
4.
explain plan for
select/*+ no_parallel*/ distinct I from  test123;
select *
from table(dbms_xplan.display);


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Plan hash value: 3105238763
 
------------------------------------------------------------------------------
| Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |         |    82 |  1066 |     3  (34)| 00:00:01 |
|   1 |  HASH UNIQUE       |         |    82 |  1066 |     3  (34)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| TEST123 |    82 |  1066 |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------
 
Note
-----
   - Degree of Parallelism is 1 because of hint
...
Рейтинг: 0 / 0
в плане сделать hash_unique вместо sort_unique
    #39763197
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_PVколичество различных значений в колоноке изначально меньше чем 65001Слетает на sort, потому что с hash нельзя по stop key прервать дальнейшее формирование строк. Попробуй вместо distinct использовать group by и убрать сортировку, но вряд ли это перебьет rownum.
...
Рейтинг: 0 / 0
в плане сделать hash_unique вместо sort_unique
    #39763200
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

Хотя есть вариант перебить stop key. Написать подзапрос в подзапрос с where rownum > 0
...
Рейтинг: 0 / 0
в плане сделать hash_unique вместо sort_unique
    #39763215
Pavel_PV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понимаю о чем речь. Вариантов править запрос нет, только хинты или параметры сессии.

Я не хочу сделать только hash unique, я хочу заменить sort unique на Hash Unique + что-то ещё. Этого уже хватит, чтобы запрос отстреливал ибо hash unique позволяет сканировать только словарь IM.
...
Рейтинг: 0 / 0
в плане сделать hash_unique вместо sort_unique
    #39763226
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_PVВариантов править запрос нетsql translator
...
Рейтинг: 0 / 0
в плане сделать hash_unique вместо sort_unique
    #39763244
Pavel_PV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запросы генерятся автоматически и их количество весьма велико. Но перед выполнением во внутренний select можно пробросить хинт на всю пачку или выставить параметр сессии.
...
Рейтинг: 0 / 0
в плане сделать hash_unique вместо sort_unique
    #39763835
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_PV,

Pavel_PVВариантов править запрос нет, только хинты или параметры сессии.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
explain plan for 
select /*+ no_parallel 
use_hash_aggregation(@sel$2)
*/ D1.c1 as c1 from ( select distinct I as c1 from  test123 order by c1) D1 where rownum <= 65001;

@?/rdbms/admin/utlxpls

-----------------------------------------------------------------------------------------
| Id  | Operation                     | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |         |     1 |    13 |     4  (50)| 00:00:01 |
|*  1 |  COUNT STOPKEY                |         |       |       |            |          |
|   2 |   VIEW                        |         |     1 |    13 |     4  (50)| 00:00:01 |
|*  3 |    SORT ORDER BY STOPKEY      |         |     1 |    13 |     4  (50)| 00:00:01 |
|   4 |     HASH UNIQUE               |         |     1 |    13 |     3  (34)| 00:00:01 |
|   5 |      TABLE ACCESS STORAGE FULL| TEST123 |     1 |    13 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
в плане сделать hash_unique вместо sort_unique
    #39763904
Pavel_PV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeaGate, как всё просто оказалось. Спасибо!
...
Рейтинг: 0 / 0
в плане сделать hash_unique вместо sort_unique
    #39763957
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Pavel_PVибо hash unique позволяет сканировать только словарь IMникогда не слышал про такое. есть пруф?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / в плане сделать hash_unique вместо sort_unique
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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