union глюк или я что-то не так делаю
union глюк или я что-то не так делаю
fierbird 1.5.2 под линуха
создаю сиквел с использованием union из двух частей
если поотдельности эти части запускать, тo IBExpert показывает Execute time равный милисекундам, если же обьединяю то результат уже 3 секунды. при этом тот же самый IBExpert в Performance analysis показывает ображение к одной таблице около 500000 раз, хотя в таблицах не более 500 записей.
весь этот тормоз возникает из-за того что я считаю суммы внутри запросов
(
...select sum( ssm.zena*ssm.kolvo*(select vk_.kyrs from valuta_kyrs vk_ where
vk_.date_ =(select max(vk1_.date_) from val.....
)
если заместо union использую union all и убираю order by то запрос выполнется моментально.
что делать? может в настройках сервера что-то надо менять? или вообще нельзя делать юнионы запросам с такой структурой?
создаю сиквел с использованием union из двух частей
если поотдельности эти части запускать, тo IBExpert показывает Execute time равный милисекундам, если же обьединяю то результат уже 3 секунды. при этом тот же самый IBExpert в Performance analysis показывает ображение к одной таблице около 500000 раз, хотя в таблицах не более 500 записей.
весь этот тормоз возникает из-за того что я считаю суммы внутри запросов
(
...select sum( ssm.zena*ssm.kolvo*(select vk_.kyrs from valuta_kyrs vk_ where
vk_.date_ =(select max(vk1_.date_) from val.....
)
если заместо union использую union all и убираю order by то запрос выполнется моментально.
что делать? может в настройках сервера что-то надо менять? или вообще нельзя делать юнионы запросам с такой структурой?
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: union глюк или я что-то не так делаю
fetch в первом случае, fetch all (внутри сервера, дабы удалить дубликаты) во второмGall писал(а):fierbird 1.5.2 под линуха
создаю сиквел с использованием union из двух частей
если поотдельности эти части запускать, тo IBExpert показывает Execute time равный милисекундам, если же обьединяю то результат уже 3 секунды.
Т.к. сервер перестаёт выполнять весь запросGall писал(а):если заместо union использую union all и убираю order by то запрос выполнется моментально.
Запросы писать нормальные (а не "сиквелы") к нормально спроектированным стр-рам данныхGall писал(а):что делать? может в настройках сервера что-то надо менять? или вообще нельзя делать юнионы запросам с такой структурой?
дело в том, что я ищу не последнюю дату, а дату сответствующую дню закупки либо продажи. если есть какой-то метод для ускорения такого поиска, то подскажите.kdv писал(а):уж сколько раз советовали - храните ТЕКУЩИЕ (последние) значения курса валюты, чтобы не шарить по всей таблице валют запросами select max(course_date)...
время выборки уменьшилось в два раза, большое спасибоMerlin писал(а):Сделай descending index по дате в журнале курсов.
kvd, строить систему чтобы курс существовал на каждый день не очень удобно, но видимо необходимо.
тогда встречный вопрос - поддерживает ли firebird какие-либо аналоги jobs из MSSQLServer? Я поискал, но не нашел.
Не всегда прокатывает. Вспомни дефолт - пять раз на дню курс менялся. Самое простое - денормализация. То есть, при выполнении соответсвующего действия с документом (зависит от политики фирмы, начало оформления или утверждение) брать курс из журнала и укладывать в заголовок документа.kdv писал(а):опять же, тогда надо организовать систему (таблицу курсов валют) так, чтобы курс существовал на каждый день. И при выборке просто искать соответствие дате закупки или продажи, а не по max.а дату сответствующую дню закупки либо продажи
2 Gall
Спробуй ещё такую конструкцию
В принципе почти то же самое, но может оказаться шустрее.
Спробуй ещё такую конструкцию
Код: Выделить всё
Select Sum(Doc.Cena*Doc.Kolvo*R1.Rate)
From Doc Join Rates R1 On R1.Valuta=Doc.Valuta
And R1.Data=(Select Max(R2.Data)
From Rates R2
Where R2.Valuta=Doc.Valuta
And R2.Data<=Doc.Data)