BULK COLLECTIONS - чего это такое ?

romutis

Guest
Если 100000 < count(*) - то все равно выгодно.
Только в большинстве запросов всё-таки нужен order by - поэтому вариант с rownum пролетает.
 

ABORIGEN

Guest
Парни, спасибо за внимание к моей проблеме. Но она все еще открыта. Что же такое эти BULK COLLECTIONS ? Как использовать ? Где найти пример ? Интересует именно вариант применения для разбивки запроса по страницам. Пока у меня ничего путного не вышло, но смысл примерно в следующем (как я это понял): коллекции нечто вроде массива записей, которые потом можно отсортировать или выбрать от и до. Причем выборка сама непосредственно, осуществляется именно ОТ и ДО - выбирается ИМЕННО кусок, интервал. Поэтому как бы ни была велика база, задержка может быть только в поиске в индексе ROWID номер такой-то .... ;-)

Вот и меня это привлекает, потому что совершенно явно видно, что вложенные SELECT да еще с сортировками, да по ROWNUM - не есть то, что придумано ORACLE CORP. для решения этой, в общем-то, тривиальной проблемы !
 

Rezec

По пиву? (socket80)
Если б было придумано, то в доках где-нибудь обязательно нашлось бы, а пока - кто как умеет :)
 

Koc

Guest
Автор оригинала: Vladimir
Подобный вариант я пользую давно:
select <список полей> from (select <список полей>, rownum num_row from
(select <список полей> from table <условие> order by <поле для сортировки>)) where num_row >= $<строка начала> and num_row < $<строка окончания>
Но к сожалению он работает только в версиях 8i и старше.
В младших версиях запрещена сортировка во вложенных запросах.
Переменные передаются из скрипта, т.к. запрос кэшируется -
----------------
select <список полей> from table <условие> order by <поле для сортировки> - этот
----------------
то постраничный вывод весьма щустро работает.
В младших версиях работает сортировка во вложеных запросах.
 

romutis

Guest
Автор оригинала: socket80
Потом, после выборки всей базы? :) Бедный BULK COLLECTIONS
Есть стойкое ощущение, что у тебя проблемы с восприятием прочитанного текста...

Нет, отнюдь не после выборки всей базы. Сортировка по order by, группировка и прочее проводятся до выборки. Т.е. считывание в BULK COLLECTION идет с использованием внутреннего курсора и данные, записываемые в BULK COLLECTION уже упорядочены и сгруппированы согласно параметрам твоего селекта. И выбирается с помощью этого курсора только кол-во записей, указанное в LIMIT. Так что это будет работать _ВСЕГДА_ быстрее запроса в запросе "SELECT * FROM (SELECT ...)".


BULK COLLECTIONS, кстати, описаны в Оракловской документации, простым и ясным английским языком. Почему бы не почитать доку, вместо того, чтобы задавать глупые вопросы?
 

romutis

Guest
Автор оригинала: ABORIGEN
Интересует именно вариант применения для разбивки запроса по страницам.
Что тебе мешает использовать, например, ряды с 20-го по 39-й для вывода страницы номер 2? Общее кол-во страниц = ceil(MTABLE.COUNT / <кол-во строк на странице >)
 

ruslan

Guest
Если уж говорим про PHP, то почему вообще не использовать OCIFetchStatement ???
вроде идеально для постраничного вывода или я не прав???

int ocifetchstatement ( resource stmt, array &output [, int skip [, int maxrows [, int flags]]])
 

ABORIGEN

Guest
Автор оригинала: ruslan
Если уж говорим про PHP, то почему вообще не использовать OCIFetchStatement ???
вроде идеально для постраничного вывода или я не прав???

int ocifetchstatement ( resource stmt, array &output [, int skip [, int maxrows [, int flags]]])
ocifetchstatement -- Fetch all rows of result data into an array

Выбрать ВСЕ данные из результирующего набора в массив. НО! В моем справочнике формулировка функции стоит только из двух параметров, а вот про skip и mazrows ничего не сказано! Вот я сейчас и попробую !!! :confused:
 

ABORIGEN

Guest
Автор оригинала: romutis
BULK COLLECTIONS, кстати, описаны в Оракловской документации, простым и ясным английским языком. Почему бы не почитать доку, вместо того, чтобы задавать глупые вопросы?
Если бы я мог также хорошо понимать "простой и ясный англицкий язык" как он написан, то наверное я не задавал такие глупые вопросы. Так что мне видится Ваш вопрос не менее глупым и неуместным. Извините за грубость.
 
Сверху