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