Форум: "Базы";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
ВнизЧто не так в запросе? Найти похожие ветки
← →
Ivanov Sergey (2006-01-27 13:31) [0]Есть запрос:
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 элемента.
без условий любая из этих конструкций выполняется менее одной сек.
← →
Sergey13 © (2006-01-27 13:34) [1]А так если?
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
← →
Sergey13 © (2006-01-27 13:35) [2]БД какая?
← →
Ivanov Sergey (2006-01-27 13:37) [3]С такого варианта я начал. По ходу добавил индекы по полям учавствующим в сортировке и фильтрации. по времени может и еще больше я не дождался...
С уважением Иванов Сергей.
← →
Ivanov Sergey (2006-01-27 13:38) [4]Опс... забыл поставить галку - IB6.0
← →
Johnmen © (2006-01-27 13:42) [5]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.
Может тормозить ещё сортировка. => нужен индекс по полю сортировки.
← →
Sergey13 © (2006-01-27 13:44) [6]>выполняется 2 часа!
А бекап/ресторе нормально выполняются? Что-то сильно уж много.
> IB6.0
Стандартная рекомендация - выкинуть нафик и поставить FireBird.
← →
Ivanov Sergey (2006-01-27 13:47) [7]Прошу прощения, не досмотрел, но вариант Sergey13 © (27.01.06 13:34) [1] не такой как был у меня. И главное он выполняется сразу!
Вопрос только почему?
← →
Johnmen © (2006-01-27 13:47) [8]
> Sergey13 © (27.01.06 13:44) [6]
> >выполняется 2 часа!
> ...Что-то сильно уж много.
Это у него оптимизатор дурит. Выполняет внутренний запрос для каждой записи внешнего.
← →
Ivanov Sergey (2006-01-27 13:49) [9]Быкап и ресторе делаются нормально. А про выбросить и заменить так 6.0 бесплатен.
← →
Sergey13 © (2006-01-27 13:49) [10]2[7] Ivanov Sergey (27.01.06 13:47)
>Вопрос только почему?
Для ответа надо бы на твой взглянуть. И план бы желательно увидеть.
ЗЫ: Оператор IN - это последнее к чему следует прибегать в запросе. Когда по другому - никак. ИМХО.
← →
Sergey13 © (2006-01-27 13:51) [11]2[9] Ivanov Sergey (27.01.06 13:49)
> А про выбросить и заменить так 6.0 бесплатен.
FB не дороже стОит. 8-) Только глюков на порядок меньше.
← →
Ivanov Sergey (2006-01-27 13:53) [12]мой запрос
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 14:03) [13]2 [12] Ivanov Sergey (27.01.06 13:53)
Это тот же что в сабже. А тот вариант,с которого начинал и было долго?
← →
Ivanov Sergey (2006-01-27 14:08) [14]вот так было в начале. Просто пришлось подряд много раз выборки делать и как то задумался что там можно делать с 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:11) [15]2 [14] Ivanov Sergey (27.01.06 14:08)
> [3] Ivanov Sergey (27.01.06 13:37)
> По ходу добавил индекы по полям учавствующим в сортировке и фильтрации
Наверное индексов нужных еще не было. Хотя 2 с лишним часа - это явный и непонятный перебор для полсотни тыщ записей.
← →
Виталий Панасенко (2006-01-27 14:37) [16]
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... создать ?
← →
Vemer © (2006-01-27 16:57) [17]Вариант с 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;
← →
Johnmen © (2006-01-27 17:04) [18]>Vemer © (27.01.06 16:57) [17]
Это будет тормозить гарантированно. С максимальной степенью...
← →
SpellCaster (2006-01-31 14:08) [19]Вложенные запросы выполняются для каждой записи. Потому и тормозит
← →
Johnmen © (2006-01-31 14:19) [20]>Вложенные запросы выполняются для каждой записи.
Не всегда. Зависит от конкретного вида запроса и оптимизатора. Уже говорил [8].
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.039 c