| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Oracle > как вытащить первые 10 записей? |
| Автор: Гость_Гость 27.5.2005, 16:50 |
| Помогите с запросом .Надо вытащить первые 10 записей. |
| Автор: LSD 27.5.2005, 17:39 | ||
|
| Автор: Kurt 29.5.2005, 23:15 |
| LSD А нет че-нить более оптимального? Как я понимаю, тут сначала делается запрос на выборку ВСЕХ данных из таблицы, а уж потом берутся первые 10 строк из полученного резалтсета. А если исходначя таблица будет большой, а нам нужны жалкие 10 строчек? Ведь получается излишняя нагрузка на сервер? |
| Автор: <Spawn> 30.5.2005, 05:08 |
| Kurt Смотри мой http://forum.vingrad.ru/index.php?showtopic=36715&st=0entry273916 |
| Автор: Kurt 30.5.2005, 13:01 |
| <Spawn> Так это ж то же самое, что и пример LSD.. Точно так же сначала делается выборка ВСЕХ строк. |
| Автор: stron 30.5.2005, 14:09 | ||
| Kurt А я себе другого варианта не представляю. У тебя же есть условие where, поэтому тебе всё равно придётся бежать по всей таблице. Причём этого не избежать, даже если использовать курсоры Я бы вытаскивал записи так(Oracle не знаю, поэтому пишу под MsSQL):
А в Oracle есть аналоги LIMIT в MySQL? Если есть, так это надо использовать |
| Автор: LSD 30.5.2005, 19:57 | ||||
Я ступил, тот запрос вообще работать будет некоректно, надо так:
Этот запрос вернет строки с MIN_ROWS по MAX_ROWS. Рекомендую посмотреть http://asktom.oracle.com/pls/ask/f?p=4950:8:125395858626650511::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:127412348064. |
| Автор: Kurt 30.5.2005, 23:02 | ||||
Бывает:
Но я все равно не совсем понимаю. Вот у меня есть таблица, скажем, на 4GB. Чтоб вытащить первые 10 строчек, я все равно сначала тяну всю таблицу? Ведь в вышеописанных примерах сначала делается "общий запрос" (достать все данные), а уж потом из него выдергиваются нужные 10 строчек. Неужели в такой крутой и общепризнанной базе нет такой очень полезной штуки? Неужели нет аналога MySQL'евского LIMIT или Cache'йного TOP? |
| Автор: <Spawn> 31.5.2005, 05:03 |
| Есть одна идея, но не знаю на сколько она реальна (и проверить нет возможности - на работе Oracle 8, дома 9-ка пока не стоит |
| Автор: LSD 31.5.2005, 20:16 | ||||
Давайте не будем путать тянуть всю таблицу и просматривать всю таблицу. Во первых клиент получит только первые N записей, а во вторых какими порциями fetch-ить данные зависит от клиента и способа доступа к данным (в Java данные в ResultSet можно подкачивать по частям). По поводу полного просмотра таблицы, если в подзапросе используется order by, то просмотра таблицы не избежать никак. Если поле не индексированное, то просмотр будет полным, если индексированное то будет полный просмотр индекса (во всяком случае такой план я получил на тестовой табличке). Стоимость запроса с order by по первичному ключу и по нениндексированному полю, различается в 3-4 раза. Если же порядок не важен то можно использовать:
И полного просмотра не будет. Добавлено @ 20:18 По поводу идеи <Spawn>, она реализуема. Но я не думаю, что открытие курсора по внутреннему запросу и fetch, будет быстрее, чем прямой SQL запрос на первые N строк. Хотя надо попробовать. |
| Автор: Stampede 31.5.2005, 20:58 | ||
Не все так плохо. Оптимизатор оракла понимает, что мы хотим отсечь часть результатов, и строит план выполнения запроса таким образом, чтобы поскорее от нас отделаться А то, что синтаксис получается неудобный - это да, есть такое дело. Более того, до версии 8i такая конструкция вообще была неозможна - оракл ругался на ORDER BY в подзапросе. В результате получалось, что мы только можем взять первые N записей (в каком уж там порядке они придут зависит от типа запроса), и уже внутри них отсортировать по нужному нам полю - что, разумеется, было не совсем то, что мы хотели получить. Но только не надо на этом основании говорить, что оракыл сакс (хотя он, конечно, сакс). Просто у каждой СУБД есть свои тараканы. А что делать? Нет в мире совершенства |
| Автор: rmaf 20.7.2005, 12:05 |
| Почитав ваши мнения, решил попробовать с этого: select * from (select t.*, rownum from MONITOR t order by DATE_OPER) where rownum<=10 сделать это: select t.*, rownum from MONITOR t where rownum<=10 результат одинаковый. "Так зачем платить больше?" или я чего-то не понимию? |
| Автор: LSD 20.7.2005, 13:18 | ||
Результат будет разный, в первом случае вначале записи будут отсортированны, а только затем выбранны первые 10 строк. А во втором слечае вначале будут отобранны первые 10 строк (какие они будут неизвестно), а затем они будут отсортированны. P.S. Для кода есть кнопочка "Код", используй ее, так код будет более читабельным. |
| Автор: rmaf 20.7.2005, 14:03 |
| Спасибо за пояснения... Добавлено @ 14:08 LSD а можно ли как-то запросом узнать сколько и какие столбцы в таблице? Это я так, под руку спрашиваю, вдруг ты знаешь... |
| Автор: LSD 20.7.2005, 17:04 | ||||||||
По правилам форума:
Если вопрос большой, лучше создать отдельную тему, а если вопрос маленький и была связанная тема, то лучше спросить в ней. В твоем случае http://forum.vingrad.ru/index.php?showtopic=59115. А то придут модераторы и будут ругаться |