powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса Firebird 2.5
25 сообщений из 30, страница 1 из 2
Оптимизация запроса Firebird 2.5
    #39863921
basicom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу помощи в оптимизации запроса, куда копать?
Запрос выполняется из java к firebird 2.5 для построения отчёта и выгрузки в Exсel.
Если убрать из текста символы \" и ", то в чистом виде SQL.
В таблице TRZ(rgAmountRests) данные о времени, количестве и признаках события.
В таблице D(spcAzsDensity) событие изменения температуры и плотности.
Для отчёта выдёргиваем данные из таблицы TRZ и добавляем данные по текущей плотности и температуре и вычисляем массу исходя из текущей плотности.
Запрос на 3000 строк выполняется примерно 5 минут на разных машинах Pentium/CoreI5/XeonE5620.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
SQL="select TRZ.\"AZSCode\" as \"nazvanie\"," +
                "  USL.\"Name\" as \"nazvanie_uslugi\"," +
                "  DERJ.\"Name\" as \"gr_nomer\"," +
                "  DERJ.\"Code\" as \"el_nomer\"," +
                "  coalesce(DERJ.\"ExtCode\", '') as \"derjatel\"," +
                "  cast(TRZ.\"Date\" as date) as \"data\"," +
                "  cast(TRZ.\"Date\" as time) as \"time\"," +
                "  TRZ.\"Quantity\" as \"summa_za_chto\"," +
                "" +
                "	(select first 1 DENS.\"density\"" +
                "        from \"spcAzsDensity\" DENS" +
                "        where DENS.\"Date\" = (select max(D.\"Date\")" +
                "                             from \"spcAzsDensity\" D" +
                "                             where D.\"Date\" <= TRZ.\"Date\" and" +
                "                                   D.\"AzsCode\" = TRZ.\"AZSCode\" and" +
                "                                   D.\"AmountID\" = TRZ.\"AmountID\") and" +
                "									DENS.\"AzsCode\" = TRZ.\"AZSCode\" and" +
                "									DENS.\"AmountID\" = TRZ.\"AmountID\") as \"density\"," +
                "" +
                "        (select first 1 DENS.\"temp\"" +
                "        from \"spcAzsDensity\" DENS" +
                "        where DENS.\"Date\" = (select max(D.\"Date\")" +
                "                             from \"spcAzsDensity\" D" +
                "                             where D.\"Date\" <= TRZ.\"Date\" and" +
                "                                   D.\"AzsCode\" = TRZ.\"AZSCode\" and" +
                "                                   D.\"AmountID\" = TRZ.\"AmountID\") and" +
                "									DENS.\"AzsCode\" = TRZ.\"AZSCode\" and" +
                "									DENS.\"AmountID\" = TRZ.\"AmountID\") as \"temp\"," +
                "" +
                "        round(trz.\"Quantity\" *" +
                "        (select first 1 DENS.\"density\"" +
                "        from \"spcAzsDensity\" DENS" +
                "        where DENS.\"Date\" = (select max(D.\"Date\")" +
                "                             from \"spcAzsDensity\" D" +
                "                             where D.\"Date\" <= TRZ.\"Date\" and" +
                "                                   D.\"AzsCode\" = TRZ.\"AZSCode\" and" +
                "                                   D.\"AmountID\" = TRZ.\"AmountID\") and" +
                "									DENS.\"AzsCode\" = TRZ.\"AZSCode\" and" +
                "									DENS.\"AmountID\" = TRZ.\"AmountID\"), 3) as \"massa\"" +
                "" +
                "from \"rgAmountRests\" TRZ\n" +
                "left join \"dcAmounts\" USL on TRZ.\"AmountID\" = USL.\"AmountID\"\n" +
                "left join \"dcCards\" DERJ on TRZ.\"CardID\" = DERJ.\"CardID\"" +
                "where TRZ.\"DocTypeID\" in (3, 4, 9)" +
                "and TRZ.\"PartnerID\" in (" + this.idFirmy + ")" +
                "and TRZ.\"Date\" between cast(replace('" + this.dateStart + " 00:00:00', '/', '.') as timestamp)" +
                "and cast(replace('" + this.dateEnd + " 23:59:59', '/', '.') as timestamp)" +
                "order by DERJ.\"Name\", TRZ.\"Date\"";
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39863928
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нечетабельно
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39863930
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
basicomЕсли убрать из текста символы \" и ", то в чистом виде SQL.
ну так кто будет убирать - мы, что-ли? "вот вам мусорный текст, читайте"? Нет, спасибо.

тем не менее - зачем в запросе налеплены вот эти суб-селекты? (select first 1). И вот это - "select max(D.\"Date\")" - три раза одно и то же?
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39863932
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
basicomЕсли убрать из текста символы \" и ", то в чистом виде SQL.

Ну так убери. Назачем нам тут Ява?

За неиспользование параметров - отдельный эцих с гвоздями.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39863956
basicom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подредактировал:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
select 	TRZ."AZSCode" as "nazvanie", 
	USL."Name" as "nazvanie_uslugi",  
	DERJ."Name" as "gr_nomer",  
	DERJ."Code" as "el_nomer",  
	coalesce(DERJ."ExtCode", '') as "derjatel",  
	cast(TRZ."Date" as date) as "data",  
	cast(TRZ."Date" as time) as "time",  
	TRZ."Quantity" as "summa_za_chto",       
	(select first 1 DENS."density"        
		from "spcAzsDensity" DENS       
		where DENS."Date" = (select max(D."Date")
	                     from "spcAzsDensity" D
	                     where D."Date" <= TRZ."Date" 
	and  D."AzsCode" = TRZ."AZSCode" 
	and  D."AmountID" = TRZ."AmountID") 
	and  DENS."AzsCode" = TRZ."AZSCode" 
	and  DENS."AmountID" = TRZ."AmountID") as "density",
                     (select first 1 DENS."temp"   from "spcAzsDensity" DENS        where DENS."Date" = (select max(D."Date")
		                                  from "spcAzsDensity" D                 where D."Date" <= TRZ."Date" 
	and  D."AzsCode" = TRZ."AZSCode" 
	and  D."AmountID" = TRZ."AmountID") 
	and  DENS."AzsCode" = TRZ."AZSCode"
 	and  DENS."AmountID" = TRZ."AmountID") as "temp",
	          round(trz."Quantity" *  (select first 1 DENS."density"       
  	          from "spcAzsDensity" DENS        where DENS."Date" = (select max(D."Date")
                               from "spcAzsDensity" D                  where D."Date" <= TRZ."Date" 
	and  D."AzsCode" = TRZ."AZSCode" 
	and  D."AmountID" = TRZ."AmountID") 
	and  DENS."AzsCode" = TRZ."AZSCode" 
	and  DENS."AmountID" = TRZ."AmountID"), 3) as "massa" 
	from "rgAmountRests" TRZ
	
left join "dcAmounts" USL on TRZ."AmountID" = USL."AmountID"
	
left join "dcCards" DERJ on TRZ."CardID" = DERJ."CardID"
	where TRZ."DocTypeID" in (3, 4, 9)
	and TRZ."PartnerID" in (19)
	and TRZ."Date" between cast(replace('1/9/2019 00:00:00', '/', '.') as timestamp)
	and cast(replace('18/9/2019 23:59:59', '/', '.') as timestamp)order by DERJ."Name", TRZ."Date"
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39863960
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LEFT-ы осознанные?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39863968
basicom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё что написано писал сотрудник, который учился программировать, я только пытаюсь разобраться - увидев, понял, что много лишнего, но дело не в эстетике кода, а понимании - можно ли переписать, увеличив скорость. Если нет, то смысла переписывать не вижу.
На выходе получаем таблицу вида:
АЗС Вид Гр. номер Эл. номер Держатель Дата Время Кол-во Плотность Темп. Масса
azs 2 Аи-95 000201 950DE6116F Toyota 150 ХР 2019-09-03 10:36:32 -66.00 0.746000 7.000000 -49.23600000
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39863969
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
basicomя только пытаюсь разобраться

Даже не пытайся. Выкинь код целиком, возьми исходную задачу и напиши запрос с нуля. На
этот раз - с параметрами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39863971
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

да тут не в LEFT дело, а в мутных подзапросах с агрегатами, которые перевыполняются многократно
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39863977
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
19.09.2019 14:05, Симонов Денис пишет:
> да тут не в LEFT дело, а в мутных подзапросах с агрегатами, которые перевыполняются многократно

не уверен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39864176
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо тут дело в консерватории. В смысле в отсутствии ID в архиве. Ему нужно три поля из одной и той же записи в архиве, а вложенный селект позволяет достать только одно. Что прилеплен второй уровень вложенности с максом вместо order by в первом уровне - это от дикости. Был бы в архиве ID, можно было бы архив приджойнить с одним вложенным селектом в условии
Код: plsql
1.
on spcAzsDensity1.id=(select first 1 spcAzsDensity2.id from spcAzsDensity2 его условия по полям с order by spcAzsDensity2.Date desc)


и получать все три поля разом. А ещё у вас там без меня появились всякие псевдотаблицы, вроде тоже годно здесь, но я в них не вникал. Ну и, как всегда, индексы проверить - которых нет, создать, которые лишние, перебить или пригасить плюснолями. Например, поле DocTypeID подозрительное на эту тему. Первый лефт к бабке не ходи бездумно забабахан, второй, возможно, и нужен - если речь о держателях платёжных карт, а платить могут и налом. Что будет с запросом в случае нулла - не думал, лень.
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39864201
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
basicom,

вот эту билиберду

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select first 1 DENS."temp"   
from "spcAzsDensity" DENS        
where DENS."Date" = (select max(D."Date")
		     from "spcAzsDensity" D                 
                     where D."Date" <= TRZ."Date" 
	                and  D."AzsCode" = TRZ."AZSCode" 
	                and  D."AmountID" = TRZ."AmountID") 
	and  DENS."AzsCode" = TRZ."AZSCode"
 	and  DENS."AmountID" = TRZ."AmountID"



скорее всего можно заменить на эту

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT FIRST 1
    DENS."temp"
FROM "spcAzsDensity" DENS
WHERE DENS."Date" <= TRZ."Date" AND
      DENS."AzsCode" = TRZ."AZSCode" AND
      DENS."AmountID" = TRZ."AmountID"
ORDER BY DENS."Date" DESC
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39864584
freeman611
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
basicom,

Напиши хранимую процедуру, проще и быстрее.
Что-то вроде этого

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
create or alter procedure NEW_PROCEDURE (
    DB timestamp,
    DE timestamp)
returns (
    TEMP numeric(15,2),
    DENSITY numeric(15,2),
    NAZVANIE varchar(10)
    )
as
declare variable MAX_DATE timestamp;
begin
  for select TRZ."AZSCode" as "nazvanie", ...
  from "rgAmountRests" TRZ ,,,,
  where TRZ."Date" between :db and :de
  into :nazvanie ...
  do begin

    max_date=(select max(D."Date")
                         from "spcAzsDensity" D
                         where D."Date" <= :date
                           and  D."AzsCode" = :nazvanie
                           and  D."AmountID" = :AmountID);

    for select first 1 density, temp
    from spcAzsDensity  DENS
    where  DENS."Date" = :max_date and  D."AzsCode" = :nazvanie ....
    into density, temp  do begin end
    massa=Quantity*density
    suspend;
  end;
end;



и запрос потом из нее select * from new_procedure('12.12.1212', '12.12.1212')
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865518
basicom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Обнаружил интересный факт. Выполнил первоначальный sql запрос в IBExperte через SQL Editor.
Скорость выполнения запроса от 5 до 11 секунд в зависимости от выборки.
А вот fetch зависит от полученного результата от 30 секунд(500 строк) до 5 минут при 3500 строк.
Как я понимаю тормозит процесс получение результата, а не сам запрос.
Можно ли ускорить процесс получения выборки?

------ Performance info ------
Prepare time = 16ms
Execute time = 8s 705ms
Avg fetch time = 1 243,57 ms
Current memory = 13 725 576
Max memory = 14 181 572
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 27 420 626

------ Performance info ------
Prepare time = 31ms
Execute time = 5s 710ms
Avg fetch time = 815,71 ms
Current memory = 13 725 576
Max memory = 14 181 572
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 27 420 626
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865532
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
basicom,

ну попробуй TempCahceLimit увеличить
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865543
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
basicomДобрый день.
Обнаружил интересный факт. Выполнил первоначальный sql запрос в IBExperte через SQL Editor.
Скорость выполнения запроса от 5 до 11 секунд в зависимости от выборки.
А вот fetch зависит от полученного результата от 30 секунд(500 строк) до 5 минут при 3500 строк.
Как я понимаю тормозит процесс получение результата, а не сам запрос.
Можно ли ускорить процесс получения выборки?


это точно результаты Fetch All?

27 млн фетчей при 0 reads намекают.
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865573
basicom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Статистика приведена на момент окончания выполнения запроса, когда fetch All ещё не выполнен.
Параметр Fetches from cache что означает?
Это из другого запроса:

------ Performance info ------
Prepare time = 16ms
Execute time = 2m 2s 601ms
Avg fetch time = 15 325,13 ms
Current memory = 9 406 060
Max memory = 14 181 572
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = -2 081 022 114

Ещё напрягает статистика в Performance Analysis -> Indexed Reads для таблицы spcAzsDensity зашкаливает а 152 миллиона, в то время как у других таблиц в районе 2000.
При том что число записей у неё не самое большое примерно 8000.
Что означает этот показатель? индекса у таблицы нет.
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865576
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
23.09.2019 13:04, basicom пишет:
> индекса у таблицы нет.

я тебе не верю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865583
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
basicomПараметр Fetches from cache что означает?

Число чтений страниц из страничного кэша.

basicomиндекса у таблицы нет.
Значит надо сделать.

И вообще, статистика в основном бесполезна, кури план после вдумчивого чтения
http://www.ibase.ru/dataaccesspaths/
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865611
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На каждую запись остатков с джойнами по 6 подзапросов в архив к одной и той же записи да ещё и натуралом... О чём тут ещё рассуждать-то. Гы, как говорится.
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865622
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
basicomСтатистика приведена на момент окончания выполнения запроса, когда fetch All ещё не выполнен.
Параметр Fetches from cache что означает?


Разбор полетов с медленным фетчем без статистики на этот самый фетч бессмысленна.
Показывает подготовку записей на один буфер передачи. по дефолту 8k

Fetches from cache означает сколько раз каждое значение поля было прочитано из страницы данных/индекса.
если чтение с диска 0 - то все топталось на кэше в дефолтных 2048 страницах.

basicomЭто из другого запроса:

------ Performance info ------
Prepare time = 16ms
Execute time = 2m 2s 601ms
Avg fetch time = 15 325,13 ms
Current memory = 9 406 060
Max memory = 14 181 572
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = -2 081 022 114


а это старое доброе за пределами добра и зла MaxInt.

basicomЕщё напрягает статистика в Performance Analysis -> Indexed Reads для таблицы spcAzsDensity зашкаливает а 152 миллиона, в то время как у других таблиц в районе 2000.
При том что число записей у неё не самое большое примерно 8000.
Что означает этот показатель? индекса у таблицы нет.

то, что кто-то оттуда постоянно читает.
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865691
basicom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий,
может я индексы с ключами путаю, поясните про веру в существование индекса?)
скрин таблицы прикладываю...
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865695
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
картинки выкладывают тупые тётеньки в своём бложике.
а суровые мучачосы должны приводить полный DDL-скрипт таблицы.

зы: не в виде картинки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865701
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
basicomиндексы с ключами путаю, поясните про веру в существование индекса?)
- индексы на закладке Indices
- по ключам PK, FK, Unique автоматически строятся индексы.
...
Рейтинг: 0 / 0
Оптимизация запроса Firebird 2.5
    #39865712
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

ну судя по картинке у него PK нет. Короче в топку
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса Firebird 2.5
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]