Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];

Вниз

WHERE и ORDER BY   Найти похожие ветки 

 
EternalWonderer   (2002-08-30 10:56) [0]

Сравним два запроса:
select * from t order by d - время выполнения 30 секунд
select * from t where d=1 - время выполнения 50 мсек.
где в t около 30 000 записей и имеется индекс по d (normal или bitmap), d имеет тип NUMBER(2).

Вопрос: как бы ускорить первый запрос?


 
Turalyon   (2002-08-30 11:00) [1]

В первом запросе возвращается 30 000 записей а во второв всего 1 по этому и скорость соответствующая... если надо ускорить - не выбирай все записи.. как нибудь фильтруй... надо смотреть по контексту задачи.


 
EternalWonderer   (2002-08-30 13:49) [2]

1. Дык ведь на клиента - то они не возвращаются - по сети передаётся только 25-50 строк(OraQuery1.FetchRows=25).
Аналогичный запрос с ORDER BY по первичному индексу:
select * from t order by ID - выполняется 50 мсек!

Все остальные запросы, в том числе с ORDER BY по уникальному ключу, вызывают, видимо, несмотря на построенный индекс, полное сканирование таблицы и задержку с выдачей первых 25 строк через 20-40 секунд. По - моему, если по столбцу построен индекс, он должен выдавать первые строки без сканирования. Я ошибаюсь?

2. Уточняю: Во втором запросе "возвращается" в зависимости от подставляемого значения от 10 до 50% записей - за 50-60 мсек.


 
dimis   (2002-08-30 14:04) [3]

попробуй поставить
select * from t where d=1 order by d
и ты увидишь что запрос будет выполняться тоже долго.
все дело в том , что без order и group by данные на клинта начинают поступать до того как закончился формироваться курсор и подкачиваются в фоновом режиме.
в случае с order курсор формируется полностью, затем сортируется
ускорить это врятли получится даже если создавать индексы


 
EternalWonderer   (2002-08-30 14:54) [4]

время выполнения запроса
select * from t where d=1 order by d
получается прямо пропорционально доли отбираемых строк и для случая d is not null равно запросу без where.

Значит, получается, что даже имея по d уникальный индекс, oracle начихает на него и начнёт сканировать таблицу ??? Верится с трудом. Может, здесь есть какой - то подводный камень?


 
Дядя Будда   (2002-08-30 15:30) [5]

Все очень просто!
Если нет Where условия, то Oracle вообще проигнорирует все индексы и сделает Full Scan.
Чтобы ускорить запрос Select * From t Order By d, надо создать индекс по полю d (например IDX_D) и преобразовать запрос в следующую форму:
Select /*+ INDEX (t IDX_D) */ * From t Where d=d Order By d
Это принесет пользу только в том случае, если не нужно будет фетчить всю выборку.


 
EternalWonderer   (2002-08-30 16:36) [6]

> Дядя Будда © (30.08.02 15:30)
А вот и ничего подобного! У меня (Oracle 8.1.5) запрос
select * from t where d=d order by d
выполняется точно с той же скоростью, что и без where - за 30 сек. Пробовал как на normal, так и на bitmap индексе.

Зато
select * from t where d>0 order by d
выдало первые строки сразу. Но это - если d типа NUMBER. Для VARCHAR это не проходит. Во маразм!


 
Дядя Будда   (2002-08-30 16:51) [7]

To EternalWonderer
Странно...
У меня на 8.1.7 select * from t where d=d order by d на таблице с 20,000 записей и VarCharовским полем d отработал за 0.05 секунды и план показал, что скан идет именно по этому индексу. Может у тебя с настройками оптимизатора что-нить не так...
В принципе и Order By можно не ставить, тоже все будет работать, но лучше подстраховаться на случай, если вдруг индекс исчезнет, то логика сломаться не должна, пусть лучше все начнет тормозить, чем пойдут кривые данные.


 
Sly   (2002-08-30 16:51) [8]

Зато для VARCHAR2 работает d > CHR(0) :-)


 
Denis_P   (2002-08-30 17:13) [9]

Замечу, что возможно нет статистики по таблицам (схеме) и селект идет не лучшим образом. Можно либо сделать analyze либо использовать хинты.
Денис.


 
Дядя Будда   (2002-08-30 17:36) [10]

Речь как раз и идет о хинте /*+ INDEX (t IDX_D) */
(Select /*+ INDEX (t IDX_D) */ * From t Where d=d Order By d)
В нем вся соль. Он принудительно заставляет Oracle бежать по индексу, если конечно Oraclовый оптимизатор не говорит ему игнорировать такие хинты


 
Denis_P   (2002-08-30 17:40) [11]

Дядя Будда, оно-то всё и понятно кроме того, что я не понял, пробовал ли EternalWonderer выполнить запрос с хинтом?... ;-)
Хотя, как Вы и говорите, может и оптимайзер "криво" настроен...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
7-73904
FATman
2002-07-11 22:46
2002.09.23
Можно ли поменять кодовую сраницу для своей проги?


6-73796
Феликс
2002-07-20 22:09
2002.09.23
Почему когда работаю с wininet все виснет?


1-73739
SergLight
2002-09-10 15:46
2002.09.23
Custom Hint


14-73858
ErmSergey
2002-08-28 17:50
2002.09.23
БД без BDE


1-73636
Sergey-ZZZ
2002-09-12 14:20
2002.09.23
ComboBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский