Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как разбить SQL запрос на два?

697
31 августа 2002 года
bjaka_max
22 / / 20.04.2000
Проблема в быстродействии... Есть запрос, он работает но сильно тормозит,так как в нём используются вложенные запросы. Можно разбить этот запрос на два (во втором должны использоваться результаты первого) по логике это должно дать заметный выигрыш. Теперь вопрос: как это сделать? Кто нибудь знает как сохранить TQuery в таблицу? while(){} не предлагать, в результатах десятка два тысяч строк...ну примерно такой порядок...
250
31 августа 2002 года
Joker
1.4K / / 20.02.2000
Цитата:

On 2002-08-31 0932, bjaka_max wrote
Проблема в быстродействии... Есть запрос, он работает но сильно тормозит,так как в нём используются вложенные запросы. Можно разбить этот запрос на два (во втором должны использоваться результаты первого) по логике это должно дать заметный выигрыш. Теперь вопрос как это сделать? Кто нибудь знает как сохранить TQuery в таблицу? while(){} не предлагать, в результатах десятка два тысяч строк...ну примерно такой порядок...


Неуверен что тебе это ускорит, полагаю даже что атормозит, бд для того и нужны чтобы обрабатывать здоровые массивы данных, если хочешь разбить и юзать результаты запроса, попробуй Кашировать запрос..

// http//www.sp1r1tual.com

697
02 сентября 2002 года
bjaka_max
22 / / 20.04.2000
Проблема в том что запрос вложенный, нужно выбирать записи из архива (при изменении в архив добавляется строчка с датой) с датой максимальной но меньшей чем запрашиваемая. Таким образом время выполнения запроса растёт в квадратичной зависимости от обьёма архива... Если для начала выбрать все необходимые даты, а потом отбирать нужные записи то зависимость линейная. Ну я так подозреваю. Если вас не затруднит поясните, что значит кэшировать запрос, на предмет как это сделать физически...
Аноним
А что, если в SQL создать view и с ним уже работать?
697
03 сентября 2002 года
bjaka_max
22 / / 20.04.2000
В BDE view вроде нет, а sql - сервер ставить... Это же туда придётся все базы перекидывать, а это и муторно, и глупо. В базе один человек работает...
250
05 сентября 2002 года
Joker
1.4K / / 20.02.2000
Цитата:

On 2002-09-02 0738, bjaka_max wrote
Проблема в том что запрос вложенный, нужно выбирать записи из архива (при изменении в архив добавляется строчка с датой) с датой максимальной но меньшей чем запрашиваемая. Таким образом время выполнения запроса растёт в квадратичной зависимости от обьёма архива... Если для начала выбрать все необходимые даты, а потом отбирать нужные записи то зависимость линейная. Ну я так подозреваю. Если вас не затруднит поясните, что значит кэшировать запрос, на предмет как это сделать физически...



Неуверен что все получится как я говрю, но теория такова(на практики я сам это не использовал)
Для того чтобы первый запрос не изменил саму базу данных, а результат получился как бы в памяти юзаем кэширование Query1->CachedUpdates=true;
Да и еще помести с Data Access компонент UpdateSQL чтобы после выполнения селекта
подсоедини к компоненту Query (получившаяся татаблица ака результат годен не только для чтения но и для модификации). ., делаешь нужный запрос и в консе сохраняешь хеш ApplyUpdate вроде так, а вообще почитай где нибудь про это..

// http//www.sp1r1tual.com

Аноним
Скорее ни каких результатов разбиение не даст. А для ускорения создавай индексы в БД, оптимизируй сам запрос...
697
06 сентября 2002 года
bjaka_max
22 / / 20.04.2000
Индексы не помогают - пробовал. А оптимизировать...
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
ну не знаю...
1.4K
06 сентября 2002 года
s_alexander
7 / / 20.06.2000
Индексы обычно заметно ускоряют выполнение запроса. Нужно только правильно выбирать поля по которым их строить. Не забывай при этом, что индекс можно, а иногда и нужно строить по нескольким полям одновременно. Если время выполнения растет в основном от объема архива, то в нем в первую очередь и нужно их строить.
Я бы может и сказал чего-нибудь конкретное по запросу, но сейчас много работы... Ну если хочешь, пришли мне по почте свои таблицы с данными (если они очень большие, то часть данных удали) и свой запрос, попробую чего-нибудь придумать... (письмо не больше 1Mb)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог