![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что не так в запросе?
Ivanov Sergey © (2006-01-27 13:31:00)Есть запрос:
select
BLR_BIL_ID,
BLR_TIMEST,
BLR_KRD_ID,
BLR_COUNT,
BLR_PRICE,
BLR_COUNT*BLR_PRICE as sum_row
from
BILLROW
where
BLR_BIL_ID IN (select bil_id from BILLS where BIL_Type_id = 1 AND BIL_TIMEST_BEG >= '01.10.2005')
order by
BLR_TIMEST;
выполняется 2 часа!
в BILLROW 54000 записей, IN (select bil_id fro... возвращает 254 элемента.
без условий любая из этих конструкций выполняется менее одной сек.
Johnmen (2006-01-31 14:19:00) [1]>Вложенные запросы выполняются для каждой записи.
Не всегда. Зависит от конкретного вида запроса и оптимизатора. Уже говорил [8].
SpellCaster (2006-01-31 14:08:00) [2]Вложенные запросы выполняются для каждой записи. Потому и тормозит
Johnmen (2006-01-27 17:04:00) [3]>Vemer © (27.01.06 16:57) [17]
Это будет тормозить гарантированно. С максимальной степенью...
Vemer (2006-01-27 16:57:00) [4]Вариант с Exists, (до кучи:)):
select
BLR_BIL_ID,
BLR_TIMEST,
BLR_KRD_ID,
BLR_COUNT,
BLR_PRICE,
BLR_COUNT*BLR_PRICE as sum_row
from
BILLROW
where
EXISTS(select bil_id from BILLS where bil_id = BLR_BIL_ID And BIL_Type_id = 1 AND BIL_TIMEST_BEG >= '01.10.2005')
order by
BLR_TIMEST;
Виталий Панасенко (2006-01-27 14:37:00) [5]
select
B.BLR_BIL_ID,
B.BLR_TIMEST,
B.BLR_KRD_ID,
B.BLR_COUNT,
B.BLR_PRICE,
B.BLR_COUNT*B.BLR_PRICE as sum_row
from
BILLROW B, BILLS B2
where
B.BLR_BIL_ID=B2.bil_id AND B2.BIL_Type_id = 1 AND B2.BIL_TIMEST_BEG >= '01.10.2005'
order by
B.BLR_TIMEST;
Не канает ? не проверял. А не лучше ли ХП с for do... создать ?
Sergey13 (2006-01-27 14:11:00) [6]2 [14] Ivanov Sergey (27.01.06 14:08)
> [3] Ivanov Sergey (27.01.06 13:37)
> По ходу добавил индекы по полям учавствующим в сортировке и фильтрации
Наверное индексов нужных еще не было. Хотя 2 с лишним часа - это явный и непонятный перебор для полсотни тыщ записей.
Ivanov Sergey (2006-01-27 14:08:00) [7]вот так было в начале. Просто пришлось подряд много раз выборки делать и как то задумался что там можно делать с 20 мегабайтной базой в течении 2ух часов, потом вынес выборку в подзапрос а лучше не стало или стало не сильно лучше.
select
BLR_BIL_ID,
BLR_TIMEST,
BLR_KRD_ID,
BLR_COUNT,
BLR_PRICE,
BLR_COUNT*BLR_PRICE as sum_row
from
BILLROW
left join bills on BLR_BIL_ID = BIL_ID
where
BIL_TYPE_ID = 1 and BIL_TIMEST_BEG >= '01.10.2005'
order by
BLR_TIMEST;
Sergey13 (2006-01-27 14:03:00) [8]2 [12] Ivanov Sergey (27.01.06 13:53)
Это тот же что в сабже. А тот вариант,с которого начинал и было долго?
Ivanov Sergey (2006-01-27 13:53:00) [9]мой запрос
select
BLR_BIL_ID,
BLR_TIMEST,
BLR_KRD_ID,
BLR_COUNT,
BLR_PRICE,
BLR_COUNT*BLR_PRICE as sum_row
from
BILLROW
where
BLR_BIL_ID IN (select bil_id from BILLS where BIL_Type_id = 1 AND BIL_TIMEST_BEG >= '01.10.2005')
order by
BLR_TIMEST;
после препаре:
PLAN (BILLS NATURAL)
PLAN SORT ((BILLROW NATURAL))
Sergey13 (2006-01-27 13:51:00) [10]2[9] Ivanov Sergey (27.01.06 13:49)
> А про выбросить и заменить так 6.0 бесплатен.
FB не дороже стОит. 8-) Только глюков на порядок меньше.
Sergey13 (2006-01-27 13:49:00) [11]2[7] Ivanov Sergey (27.01.06 13:47)
>Вопрос только почему?
Для ответа надо бы на твой взглянуть. И план бы желательно увидеть.
ЗЫ: Оператор IN - это последнее к чему следует прибегать в запросе. Когда по другому - никак. ИМХО.
Ivanov Sergey (2006-01-27 13:49:00) [12]Быкап и ресторе делаются нормально. А про выбросить и заменить так 6.0 бесплатен.
Johnmen (2006-01-27 13:47:00) [13]
> Sergey13 © (27.01.06 13:44) [6]
> >выполняется 2 часа!
> ...Что-то сильно уж много.
Это у него оптимизатор дурит. Выполняет внутренний запрос для каждой записи внешнего.
Ivanov Sergey (2006-01-27 13:47:00) [14]Прошу прощения, не досмотрел, но вариант Sergey13 © (27.01.06 13:34) [1] не такой как был у меня. И главное он выполняется сразу!
Вопрос только почему?
Sergey13 (2006-01-27 13:44:00) [15]>выполняется 2 часа!
А бекап/ресторе нормально выполняются? Что-то сильно уж много.
> IB6.0
Стандартная рекомендация - выкинуть нафик и поставить FireBird.
Johnmen (2006-01-27 13:42:00) [16]1.
...
from
BILLROW
JOIN BILLS ON BLR_BIL_ID=BILLS.bil_id
where
BIL_Type_id = 1 AND BIL_TIMEST_BEG >= '01.10.2005'
...
2.
Может тормозить ещё сортировка. => нужен индекс по полю сортировки.
Ivanov Sergey (2006-01-27 13:38:00) [17]Опс... забыл поставить галку - IB6.0
Ivanov Sergey (2006-01-27 13:37:00) [18]С такого варианта я начал. По ходу добавил индекы по полям учавствующим в сортировке и фильтрации. по времени может и еще больше я не дождался...
С уважением Иванов Сергей.
Sergey13 (2006-01-27 13:35:00) [19]БД какая?
Sergey13 (2006-01-27 13:34:00) [20]А так если?
select
BLR_BIL_ID,
BLR_TIMEST,
BLR_KRD_ID,
BLR_COUNT,
BLR_PRICE,
BLR_COUNT*BLR_PRICE as sum_row
from
BILLROW,BILLS
where
BLR_BIL_ID=BILLS.bil_id and BIL_Type_id = 1 AND BIL_TIMEST_BEG >= '01.10.2005'
order by
BLR_TIMEST