powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Cкан партиционированной таблицы медленнее непарциционированной.
22 сообщений из 47, страница 2 из 2
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322751
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

С таким количеством партитиций (хотя это еще по божески), я бы начал смотреть в ASH (если доступен), на что время уходит, не исключено, что сам запрос может парсится приличное время, а исполняется довольно быстро. Ну в любом случае, можно было бы определить на что уходит время.

Best regards

Maxim
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322758
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Demenkoне исключено, что сам запрос может парсится приличное время, а исполняется довольно быстро.
Запрос к единственной таблице с единственным индексом - и минуту парсится?
Что-то сомневаюсь.
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322763
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фухх :)....
У меня на локальных индексах все нормально ....

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
SQL> explain plan for (select max(time)  from xxxx.xxx);

Explained.

Elapsed: 00:00:00.03
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 727408685
[FIXED]
-------------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |     1 |     8 |  4012   (1)| 00:00:49 |       |       |
|   1 |  SORT AGGREGATE             |               |     1 |     8 |            |          |       |       |
|   2 |   PARTITION RANGE ALL       |               |     1 |     8 |  4012   (1)| 00:00:49 |     1 |  2004 |
|   3 |    INDEX FULL SCAN (MIN/MAX)| IDX_xxx_TIME |     1 |     8 |  4012   (1)| 00:00:49 |     1 |  2004 |
-------------------------------------------------------------------------------------------------------------

[/FIXED]10 rows selected.

Elapsed: 00:00:00.02
SQL> select max(time)  from xxxx.xxx;

MAX(TIME)
---------
07-OCT-16

Elapsed: 00:00:00.02
SQL> select min(time)  from xxxx.xxx;

MIN(TIME)
---------
07-APR-11

Elapsed: 00:00:00.03

SQL> select count(*) from   dba_ind_partitions where  index_owner='xxxx' and  index_name='IDX_xxx_TIME' ;

  COUNT(*)
----------
      2004

Elapsed: 00:00:00.10
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322767
AlexFF__|,

Ещё раз. Мы ищем не просто максимальное значение поля-ключа секционирования во всей таблице. Мы ищем максимум этого поля для строк, удовлетворяющих доп.условию acc = '014654567 ' and currcode = '000' ;по полям, не входящим в ключ секционирования. Лично я даже не могу дать гарантии, что строки лежат в одной секции. Откуда есть уверенность, что они будут именно в последней секции? Может оказаться, что строки со значениями acc = '014654567 ' and currcode = '000'; есть вообще только в первой секции. Какой профит я получу, сканируя секции в обратном порядке?
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322774
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхКакой профит я получу, сканируя секции в обратном порядке?Что как только они появятся в данной секции, именно там будет максимальная дата. Нет?
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322775
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

При очень большом количестве партиций (в таблице и в индехе) - хотя конечно понятие "очень большое" зависит от конкретной системы - возможны довольно серьезные проблемы с library cache / rowcache, особенно если система довольно нагружена.

Best regards

Maxim
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322832
yon_brover
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл указать версию:

Код: plsql
1.
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi.



Спасибо, Ханч.

Вариант

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select prodate
  from (select /*+ index_desc(lim IX_L_LIM_ACC_CURR_UQ) */
         prodate
          from dwh.lim
         where acc = '014654567 '
           and currcode = '000'
         order by prodate desc)
 where rownum <= 1;



отрабатывает мгновенно.

План у него такой:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
| Id  | Operation                      | Name                 | Rows  | Bytes |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                      |     1 |     9 |
|*  1 |  COUNT STOPKEY                 |                      |       |       |
|   2 |   PARTITION RANGE ALL          |                      |    64 |   576 |
|   3 |    VIEW                        |                      |    64 |   576 |
|*  4 |     INDEX RANGE SCAN DESCENDING| IX_L_LIM_ACC_CURR_UQ |    64 |  1472 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(ROWNUM<=1)
   4 - access("ACC"='014654568 ' AND "CURRCODE"='000')
Note
-----
   - 'PLAN_TABLE' is old version
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322841
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
партицировали-партицировали, да не выпартицировали.
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322847
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх Какой профит я получу, сканируя секции в обратном порядке?
Ну тут все просто - условие останова. Если результат max() найден в секции n, то в секцию n-1 можно не заглячдывать.

Правда имеет смысл только для min/max, для других функций, например avg, конечно нет.
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322859
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
д0kФухх :)....
У меня на локальных индексах все нормально ....


Но по праймари ключу - жопа....


Код: 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.
25.
26.
27.
28.
29.
30.
SQL> explain plan for (select count(*)   from xxxx.xxx);

Explained.

Elapsed: 00:00:00.04
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2893698907

----------------------------------------------------------------------------------------------
| Id  | Operation              | Name        | Rows  | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |             |     1 |  2594K  (2)| 08:38:56 |       |       |
|   1 |  SORT AGGREGATE        |             |     1 |            |          |       |       |
|   2 |   PARTITION RANGE ALL  |             |  2929M|  2594K  (2)| 08:38:56 |     1 |  2004 |
|   3 |    INDEX FAST FULL SCAN| IDX_xxx_ID |  2929M|  2594K  (2)| 08:38:56 |     1 |  2004 |
----------------------------------------------------------------------------------------------

10 rows selected.

Elapsed: 00:00:00.02
SQL> select count(*) from  xxxx.xxx ;

  COUNT(*)
----------
1.6203E+10

Elapsed: 01:05:13.12



индекс по 16 млрд записям сканировался больше часа.
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322892
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kиндекс по 16 млрд записям сканировался больше часа.
Parallel не?
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322911
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousд0kиндекс по 16 млрд записям сканировался больше часа.
Parallel не?

Не, паралелью я бы уложил пользователей по ВВ.

вот интересно , план тот же
а резульат кардинально другой ...
Код: 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.
25.
26.
27.
28.
29.
30.
SQL> explain plan for (select max(id)   from xxx.xxx);

Explained.

Elapsed: 00:00:00.05
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2769239955

-----------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |             |     1 |     7 |     3   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ALL        |             |     1 |     7 |            |          |  2004 |     1 |
|   2 |   SORT AGGREGATE            |             |     1 |     7 |            |          |       |       |
|   3 |    INDEX FULL SCAN (MIN/MAX)| IDX_xxx_ID |     1 |     7 |     3   (0)| 00:00:01 |  2004 |     1 |
-----------------------------------------------------------------------------------------------------------

10 rows selected.

Elapsed: 00:00:00.33
SQL> select max(id) from  xxx.xxx ;

   MAX(ID)
----------
2.0801E+10

Elapsed: 00:00:00.00
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322917
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kвот интересно , план тот же
Не, не тот же план - см. внимательнее :)
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322919
Desert_Nomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М-даа, знакомо, знакомо.

Сразу ведь предложили - или глобальный индекс, или dynamic-ом перебирать партиции, генерируя имя на основании искомой даты ;-)
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322928
krokodaktil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если без глобального индекса, то можно сделать некий гибридный вариант:
Все это дело обернуть в функцию, которая генерирует и выполняет дайнамик запросы в количестве N штук начиная с последней партиции. Каждый такой запрос будет выполняться милисекунды по локальному индексу. Ну а если за N итераций искомого не нашли - запускать запрос по всем партициям.
Но все равно основу механизма вам уже описывали...
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322931
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Desert_Nomaddynamic-ом перебирать партиции, генерируя имя на основании искомой даты ;-)krokodaktilгенерирует и выполняет дайнамик запросы в количестве N штук начиная с последней партиции. 19497465
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322941
krokodaktil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic 19497465
ИИИИ????
Спасибо за пруф на синтаксис селекта с указание партиции как в явном виде, так и по значению ключа партицирования. Сам знал, но повторить никогда не помешает. :)
А теперь можно пруф на то, где в постановке задачи написано, что известно, в какой партиции(или на какую дату) есть значение отвечающее WHERE?
Не в каждой партиции есть искомое значение.
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322946
Desert_Nomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, спасибо, конечно, за пруф, но тут нет задачи узнать имя партиции.

От чего исходим:
"На втором сервере имеется такая же таблица-копия изменений остатков по счетам за последние 20 лет, но партиционированная по датам.
Один день - одна партиция...".

Тут люди хотят организовать поиск с последних партиций принудительно.
Решение в лоб - брать предположительные дни, начиная с последнего, и опрашивать соответствующие партиции на предмет нашли/не нашли.
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39322951
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krokodaktilА теперь можно пруф на то, где в постановке задачи написано, что известно, в какой партиции(или на какую дату) есть значение отвечающее WHERE?
Не в каждой партиции есть искомое значение.Это ты у себя спрашиваешь? Я лишь про то, что незачем нетривиально динамить при наличии статического синтаксиса.
yon_broverОдин день - одна партиция
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39323003
A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A.
Гость
Ну как, разобрались, что партиции сканируются в нужном порядке как минимум с 10g?

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0      Production
TNS for Linux: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production

select /*+ index(t) */ max(prodate) from lim t where acc = '014654567 ' and currcode = '000'

Plan hash value: 4241235387

------------------------------------------------------------------------------
| Id  | Operation                     | Name                 | Pstart| Pstop |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                      |       |       |
|   1 |  SORT AGGREGATE               |                      |       |       |
|   2 |   FIRST ROW                   |                      |       |       |
|   3 |    PARTITION RANGE ALL        |                      |     4 |     1 |
|   4 |     INDEX RANGE SCAN (MIN/MAX)| IX_L_LIM_ACC_CURR_UQ |     4 |     1 |
------------------------------------------------------------------------------



select /*+ index(t) */ min(prodate) from lim t where acc = '014654567 ' and currcode = '000'

Plan hash value: 4241235387

------------------------------------------------------------------------------
| Id  | Operation                     | Name                 | Pstart| Pstop |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                      |       |       |
|   1 |  SORT AGGREGATE               |                      |       |       |
|   2 |   FIRST ROW                   |                      |       |       |
|   3 |    PARTITION RANGE ALL        |                      |     1 |     4 |
|   4 |     INDEX RANGE SCAN (MIN/MAX)| IX_L_LIM_ACC_CURR_UQ |     1 |     4 |
------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39323127
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
yon_brover,

трассу 10053 приложи и экспортни всю статистику по таблице

зы. и дропни таблицу PLAN_TABLE
...
Рейтинг: 0 / 0
Cкан партиционированной таблицы медленнее непарциционированной.
    #39323606
krokodaktil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

А я про то, что нечего пытаться на 10g пытаться руководствоваться синтаксисом для 11-го оракла
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Cкан партиционированной таблицы медленнее непарциционированной.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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