Форум: "Базы";
Текущий архив: 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.006 c