|
Модераторы: LSD |
|
Гость_Гость |
|
|||
Unregistered |
Помогите с запросом .Надо вытащить первые 10 записей.
|
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 18 Всего: 537 |
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Kurt |
|
|||
Увлеченный Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: нет Всего: 36 |
LSD
А нет че-нить более оптимального? Как я понимаю, тут сначала делается запрос на выборку ВСЕХ данных из таблицы, а уж потом берутся первые 10 строк из полученного резалтсета. А если исходначя таблица будет большой, а нам нужны жалкие 10 строчек? Ведь получается излишняя нагрузка на сервер? -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
<Spawn> |
|
|||
Око кары:) Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 1 Всего: 64 |
Kurt Смотри мой пример
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
Kurt |
|
|||
Увлеченный Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: нет Всего: 36 |
<Spawn>
Так это ж то же самое, что и пример LSD.. Точно так же сначала делается выборка ВСЕХ строк. -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
stron |
|
|||
Консультант Профиль Группа: Комодератор Сообщений: 1654 Регистрация: 17.7.2003 Где: Питер Репутация: нет Всего: 36 |
Kurt
А я себе другого варианта не представляю. У тебя же есть условие where, поэтому тебе всё равно придётся бежать по всей таблице. Причём этого не избежать, даже если использовать курсоры Я бы вытаскивал записи так(Oracle не знаю, поэтому пишу под MsSQL):
А в Oracle есть аналоги LIMIT в MySQL? Если есть, так это надо использовать Это сообщение отредактировал(а) stron - 30.5.2005, 14:35 -------------------- подписи нет |
|||
|
||||
LSD |
|
||||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 18 Всего: 537 |
Я ступил, тот запрос вообще работать будет некоректно, надо так:
Этот запрос вернет строки с MIN_ROWS по MAX_ROWS. Рекомендую посмотреть getting rows N through M of a result set. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
Kurt |
|
||||
Увлеченный Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: нет Всего: 36 |
Бывает:
Но я все равно не совсем понимаю. Вот у меня есть таблица, скажем, на 4GB. Чтоб вытащить первые 10 строчек, я все равно сначала тяну всю таблицу? Ведь в вышеописанных примерах сначала делается "общий запрос" (достать все данные), а уж потом из него выдергиваются нужные 10 строчек. Неужели в такой крутой и общепризнанной базе нет такой очень полезной штуки? Неужели нет аналога MySQL'евского LIMIT или Cache'йного TOP? -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
||||
|
|||||
<Spawn> |
|
|||
Око кары:) Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 1 Всего: 64 |
Есть одна идея, но не знаю на сколько она реальна (и проверить нет возможности - на работе Oracle 8, дома 9-ка пока не стоит ) - насколько я помню, то есть функции итерпретации коллекции в виде таблицы, тогда тебе нужно будет написать функцию, возвращающую коллекцию записей(а на PL\SQL ты сам можешь на нужном fetch-е остановить выборку) и потом ее интерпретировать как таблицу в from части селекта.
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
LSD |
|
||||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 18 Всего: 537 |
Давайте не будем путать тянуть всю таблицу и просматривать всю таблицу. Во первых клиент получит только первые N записей, а во вторых какими порциями fetch-ить данные зависит от клиента и способа доступа к данным (в Java данные в ResultSet можно подкачивать по частям). По поводу полного просмотра таблицы, если в подзапросе используется order by, то просмотра таблицы не избежать никак. Если поле не индексированное, то просмотр будет полным, если индексированное то будет полный просмотр индекса (во всяком случае такой план я получил на тестовой табличке). Стоимость запроса с order by по первичному ключу и по нениндексированному полю, различается в 3-4 раза. Если же порядок не важен то можно использовать:
И полного просмотра не будет. Добавлено @ 20:18 По поводу идеи <Spawn>, она реализуема. Но я не думаю, что открытие курсора по внутреннему запросу и fetch, будет быстрее, чем прямой SQL запрос на первые N строк. Хотя надо попробовать. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
Stampede |
|
|||
Гносеолог Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: нет Всего: 144 |
Не все так плохо. Оптимизатор оракла понимает, что мы хотим отсечь часть результатов, и строит план выполнения запроса таким образом, чтобы поскорее от нас отделаться Проверял неоднократно на различный типах запросов, в том числе с большими объемами данных. Работает нормально. А то, что синтаксис получается неудобный - это да, есть такое дело. Более того, до версии 8i такая конструкция вообще была неозможна - оракл ругался на ORDER BY в подзапросе. В результате получалось, что мы только можем взять первые N записей (в каком уж там порядке они придут зависит от типа запроса), и уже внутри них отсортировать по нужному нам полю - что, разумеется, было не совсем то, что мы хотели получить. Но только не надо на этом основании говорить, что оракыл сакс (хотя он, конечно, сакс). Просто у каждой СУБД есть свои тараканы. А что делать? Нет в мире совершенства |
|||
|
||||
rmaf |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 15.7.2005 Репутация: нет Всего: нет |
Почитав ваши мнения, решил попробовать с этого:
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 |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 18 Всего: 537 |
Результат будет разный, в первом случае вначале записи будут отсортированны, а только затем выбранны первые 10 строк. А во втором слечае вначале будут отобранны первые 10 строк (какие они будут неизвестно), а затем они будут отсортированны. P.S. Для кода есть кнопочка "Код", используй ее, так код будет более читабельным. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
rmaf |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 15.7.2005 Репутация: нет Всего: нет |
Спасибо за пояснения...
Добавлено @ 14:08 LSD а можно ли как-то запросом узнать сколько и какие столбцы в таблице? Это я так, под руку спрашиваю, вдруг ты знаешь... |
|||
|
||||
LSD |
|
||||||||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 18 Всего: 537 |
По правилам форума:
Если вопрос большой, лучше создать отдельную тему, а если вопрос маленький и была связанная тема, то лучше спросить в ней. В твоем случае здесь. А то придут модераторы и будут ругаться -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||||||
|
|||||||||
Правила форума "Oracle" | |
|
Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Oracle | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |