Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поиск блоками по rowid / 6 сообщений из 6, страница 1 из 1
19.11.2017, 22:44
    #39555841
gvitalik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск блоками по rowid
Добрый день,

Некоторое время назад возникла задача обрабатывать определенные партиции по специальному алгоритму для построения своей структуры-индекса, которая будет использоваться потом.
Работа с базой ORACLE реализована из C++ и построение своего индекса выполняется средствами С++. Задача раз в месяц шерстить некоторые партиции для ограниченного, но большого набора табличек.
Поэтому обработка записей выполняется следующим образом:
1. Вначале каждая партиция каждой таблички разбивается на небольшие блоки
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
 /*+ PARALLEL({ iv_tabnm }, 36) */
TRUNC(rownum / 200000) as pack_num,
MIN(rowid), MAX(rowid)
FROM { iv_tabnm } PARTITION ({ iv_partition_name })
WHERE
AND { ls_condition }
GROUP BY TRUNC(rownum / 200000)



2. Каждый блок c min_rowid и max_rowid в зависимости от загрузки оборудования обрабатывается
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
 /*+ PARALLEL({ iv_tabnm }, 36) */
field1, field2,...,fieldn
FROM { iv_tabnm } PARTITION ({ iv_partition_name })
WHERE rownum <= 200000
AND { ls_condition }
AND rowid >= iv_min_rowid
AND rowid <= iv_max_rowid



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT
 /*+ PARALLEL({ iv_tabnm }, 36) */
field1, field2,...,fieldn
FROM { iv_tabnm } PARTITION ({ iv_partition_name })
WHERE rownum <= 200000
AND { ls_condition }
AND rowid >= '{ iv_min_rowid }'
AND rowid <= '{ iv_max_rowid }'.
...
UPDATE
	/*+ PARALLEL({ iv_tabnm }, 36)*/
   { iv_tabnm } PARTITION ({ lv_partition_name })
   SET status = 'C'
	   stmp_calc = iv_now
  WHERE { ls_condition }
    AND ROWID  >= '{ iv_min_rowid }'
    AND ROWID  <= '{ iv_max_rowid }'.



Почему-то шаг 2. выполняется очень быстро и после его выполнения в таблицах можно видеть, что не все записи попали в обработку (Это видно по полям status и stmp_calc). Почему такое может происходить?

Заранее спасибо, за конструктивные комментарии!
...
Рейтинг: 0 / 0
19.11.2017, 22:57
    #39555842
анонимник
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск блоками по rowid
gvitalik,

Кто-то еще в таблицу пишет.
Пахнет костьілестроением.
...
Рейтинг: 0 / 0
20.11.2017, 01:00
    #39555867
DВА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск блоками по rowid
какой свежий взгляд на использование ROWID ))
...
Рейтинг: 0 / 0
20.11.2017, 01:11
    #39555869
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск блоками по rowid
gvitalik
Код: sql
1.
/*+ PARALLEL({ iv_tabnm }, 36) */... GROUP BY TRUNC(rownum / 200000)


gvitalikПочему-топотому что группировка у вас случайная... да сама методика у вас крайне кривая...
...
Рейтинг: 0 / 0
20.11.2017, 01:19
    #39555871
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск блоками по rowid
gvitalik,

получить диапазоны rowid можно проще
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
  e.*,
  dbms_rowid.rowid_create(1, t.data_object_id, relative_fno, block_id, 0) lo_val,
  dbms_rowid.rowid_create(1, t.data_object_id, relative_fno, block_id + blocks - 1, 9999) hi_val
FROM user_objects t, dba_extents e
WHERE t.object_name='&tabname'
and e.segment_name = t.object_name
and e.owner=user
/
...
Рейтинг: 0 / 0
20.11.2017, 01:29
    #39555872
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск блоками по rowid
ну и сравнивать потому нужно с приведением к типу rowid: https://jonathanlewis.wordpress.com/2013/12/01/rowids/
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поиск блоками по rowid / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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