Re: "Входная очередь" средствами Ораскла

From
Denis Zaitsev (2:5033/33.4)
To
Grigoriy Shpakov (2:5054/37.63)
Date
2005-04-13T15:31:54Z
Area
RU.RDBMS.ORACLE
Приветствую тебя, Grigoriy!

В ответ на твое письмо от 11 Apr 05:

 GS>    SELECT MIN(номер_события) FROM входная_очередь
 GS>     WHERE номер_события > номер_последнего_обработанного_события.

А что показал трейс - индекс-то используется? Или фулсканом пашет?
Оно конечно при 2-х десятках записей лучше фулсканом, а вот при 20 тысячах и не очень (особенно при сканировании в цикле 8) - тут у вас лаги наверное и проявляются. К тому же фулскан в любом случае идет до метки заполненности таблицы, поэтому если даже в настоящий момент в ней только 20 строк, то
сканирование будет идти до "отметки" 20 000 строк, поднятой предыдущим запуском "генератора".
Да и индекс при таком подходе (вставка-чтение-обработка-удаление) наверняка уже перекошен и нуждается в перестройке. Может вам его реверсивным сделать?

Тут можно поступить двояко - или, как подсказали, подправлять
статистику (много методов, от ручной правки статистики после определения кол-ва строк, нуждающихся в обработке, до alter table monitoring и регулярного сбора статистики) и довериться стоимостному оптимизатору (imho лучший путь), или можно самим определить кол-во строк и динамически изменять запрос (например хинтами отключать или включать использование индекса).

Ну и наконец, зачем в цикле каждый раз выполнять запрос если можно один раз сделать что-то вроде:
for c in (select * from  входная_очередь
            where номер_события > номер_последнего_обработанного_события
              order by номер_события)
loop ..

???

Искренне ваш.

--- GolDEAD+/W32 * Jagular Team *
 * Origin: Fast, good, cheap: pick two.. (2:5033/33.4)
SEEN-BY: 452/25 461/33 74 106 640 464/34 465/204 469/125 550/5068 4623/56
SEEN-BY: 4625/9 4626/100 4641/444 4653/10 4657/50 5002/76 5002 5003/34 5004/58
SEEN-BY: 5010/53 5011/13 5015/4 28 5020/20 52 104 115 128 150 175 401 600 642
SEEN-BY: 5020/794 921 968 982 1100 1169 1212 1234 1356 1626 1642 1873 1930
SEEN-BY: 5020/2200 4400 4441 5021/3 44 5023/11 5025/19 151 5026/78 5030/69 195
SEEN-BY: 5030/382 920 1016 5032/11 16 5033/1 4 14 16 21 26 33 35 36 5034/8
SEEN-BY: 5035/10 5036/13 5037/21 5040/33 47 5041/4 5045/7 42 5049/157 5050/9
SEEN-BY: 5050/41 5051/35 5053/16 5054/1 8 9 28 35 37 45 50 5056/16 5058/77
SEEN-BY: 5059/20 5060/90 5063/5 41 51 5064/7 35 36 5070/26 66 5071/22 5079/49
SEEN-BY: 5082/6 5083/13 5090/23 5093/27 5100/113
PATH: 5033/33 1 5020/52 5054/1 37