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

Некоторое время назад возникла задача обрабатывать определенные партиции по специальному алгоритму для построения своей структуры-индекса, которая будет использоваться потом.
Работа с базой 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
Поиск блоками по rowid
    #39555842
анонимник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gvitalik,

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


gvitalikПочему-топотому что группировка у вас случайная... да сама методика у вас крайне кривая...
...
Рейтинг: 0 / 0
Поиск блоками по rowid
    #39555871
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
Поиск блоками по rowid
    #39555872
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ну и сравнивать потому нужно с приведением к типу rowid: https://jonathanlewis.wordpress.com/2013/12/01/rowids/
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поиск блоками по rowid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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