Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса Firebird 2.5 / 25 сообщений из 30, страница 1 из 2
19.09.2019, 13:24
    #39863921
basicom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
Прошу помощи в оптимизации запроса, куда копать?
Запрос выполняется из 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
19.09.2019, 13:29
    #39863928
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
нечетабельно
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.09.2019, 13:30
    #39863930
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
basicomЕсли убрать из текста символы \" и ", то в чистом виде SQL.
ну так кто будет убирать - мы, что-ли? "вот вам мусорный текст, читайте"? Нет, спасибо.

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

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

За неиспользование параметров - отдельный эцих с гвоздями.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.09.2019, 13:50
    #39863956
basicom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
Подредактировал:
Код: 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
19.09.2019, 13:54
    #39863960
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
LEFT-ы осознанные?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.09.2019, 14:02
    #39863968
basicom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
Всё что написано писал сотрудник, который учился программировать, я только пытаюсь разобраться - увидев, понял, что много лишнего, но дело не в эстетике кода, а понимании - можно ли переписать, увеличив скорость. Если нет, то смысла переписывать не вижу.
На выходе получаем таблицу вида:
АЗС Вид Гр. номер Эл. номер Держатель Дата Время Кол-во Плотность Темп. Масса
azs 2 Аи-95 000201 950DE6116F Toyota 150 ХР 2019-09-03 10:36:32 -66.00 0.746000 7.000000 -49.23600000
...
Рейтинг: 0 / 0
19.09.2019, 14:04
    #39863969
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
basicomя только пытаюсь разобраться

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

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

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


и получать все три поля разом. А ещё у вас там без меня появились всякие псевдотаблицы, вроде тоже годно здесь, но я в них не вникал. Ну и, как всегда, индексы проверить - которых нет, создать, которые лишние, перебить или пригасить плюснолями. Например, поле DocTypeID подозрительное на эту тему. Первый лефт к бабке не ходи бездумно забабахан, второй, возможно, и нужен - если речь о держателях платёжных карт, а платить могут и налом. Что будет с запросом в случае нулла - не думал, лень.
...
Рейтинг: 0 / 0
19.09.2019, 19:52
    #39864201
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
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
20.09.2019, 13:14
    #39864584
freeman611
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
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
23.09.2019, 12:05
    #39865518
basicom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
Добрый день.
Обнаружил интересный факт. Выполнил первоначальный 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
23.09.2019, 12:18
    #39865532
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
basicom,

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


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

27 млн фетчей при 0 reads намекают.
...
Рейтинг: 0 / 0
23.09.2019, 13:04
    #39865573
basicom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
Статистика приведена на момент окончания выполнения запроса, когда 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
23.09.2019, 13:05
    #39865576
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
23.09.2019 13:04, basicom пишет:
> индекса у таблицы нет.

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

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

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

И вообще, статистика в основном бесполезна, кури план после вдумчивого чтения
http://www.ibase.ru/dataaccesspaths/
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.09.2019, 13:35
    #39865611
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
На каждую запись остатков с джойнами по 6 подзапросов в архив к одной и той же записи да ещё и натуралом... О чём тут ещё рассуждать-то. Гы, как говорится.
...
Рейтинг: 0 / 0
23.09.2019, 13:55
    #39865622
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
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
23.09.2019, 14:51
    #39865691
basicom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
Мимопроходящий,
может я индексы с ключами путаю, поясните про веру в существование индекса?)
скрин таблицы прикладываю...
...
Рейтинг: 0 / 0
23.09.2019, 14:54
    #39865695
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса Firebird 2.5
картинки выкладывают тупые тётеньки в своём бложике.
а суровые мучачосы должны приводить полный DDL-скрипт таблицы.

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

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


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