Как разбить SQL запрос на два?
On 2002-08-31 0932, bjaka_max wrote
Проблема в быстродействии... Есть запрос, он работает но сильно тормозит,так как в нём используются вложенные запросы. Можно разбить этот запрос на два (во втором должны использоваться результаты первого) по логике это должно дать заметный выигрыш. Теперь вопрос как это сделать? Кто нибудь знает как сохранить TQuery в таблицу? while(){} не предлагать, в результатах десятка два тысяч строк...ну примерно такой порядок...
Неуверен что тебе это ускорит, полагаю даже что атормозит, бд для того и нужны чтобы обрабатывать здоровые массивы данных, если хочешь разбить и юзать результаты запроса, попробуй Кашировать запрос..
// http//www.sp1r1tual.com
On 2002-09-02 0738, bjaka_max wrote
Проблема в том что запрос вложенный, нужно выбирать записи из архива (при изменении в архив добавляется строчка с датой) с датой максимальной но меньшей чем запрашиваемая. Таким образом время выполнения запроса растёт в квадратичной зависимости от обьёма архива... Если для начала выбрать все необходимые даты, а потом отбирать нужные записи то зависимость линейная. Ну я так подозреваю. Если вас не затруднит поясните, что значит кэшировать запрос, на предмет как это сделать физически...
Неуверен что все получится как я говрю, но теория такова(на практики я сам это не использовал)
Для того чтобы первый запрос не изменил саму базу данных, а результат получился как бы в памяти юзаем кэширование Query1->CachedUpdates=true;
Да и еще помести с Data Access компонент UpdateSQL чтобы после выполнения селекта
подсоедини к компоненту Query (получившаяся татаблица ака результат годен не только для чтения но и для модификации). ., делаешь нужный запрос и в консе сохраняешь хеш ApplyUpdate вроде так, а вообще почитай где нибудь про это..
// http//www.sp1r1tual.com
select BASA, SUM(r.NTIME*DETUSEL.KOLVO) AS CHISL,
SUM((r.NTIME*r.KOEFF*t.TARIF/60*100)*DETUSEL.KOLVO*
(1+0.01*(r.ZAUSLTR+r.ZAAKTNAPR+r.ZATON))) AS RASCEN
from tarif_arh as t,rascen_arh as r,DETUSEL,SPUSEL
where t.razr=r.razr and
t.vipoln=true and
r.vipoln=true and
r."DETAL"=DETUSEL."DETAL" and
DETUSEL.USEL=SPUSEL.NOM and
SPUSEL.NOM=:TECUSEL and
t.oficdata=(select MAX(t_arch2.oficdata)
from tarif_arh as t_arch2
where t_arch2.oficdata<=:TECDATA and
t.razr=t_arch2.razr) and
r.oficdate=(select MAX(r_arch2.oficdate)
from rascen_arh as r_arch2
where r_arch2.oficdate<=:TECDATA and
r_arch2.nom=r.nom)
GROUP BY BASA
ORDER BY BASA
ну не знаю...
Я бы может и сказал чего-нибудь конкретное по запросу, но сейчас много работы... Ну если хочешь, пришли мне по почте свои таблицы с данными (если они очень большие, то часть данных удали) и свой запрос, попробую чего-нибудь придумать... (письмо не больше 1Mb)