powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Производительность запроса?
16 сообщений из 16, страница 1 из 1
Производительность запроса?
    #39906146
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Производительность запроса?

Исходный запрос:

Код: plsql
1.
2.
3.
4.
5.
6.
select 
  * 
  from AUF_POS D,AUF_KOPF H 
  where D.AUF_NR=H.AUF_NR 
    AND to_char(H.ERFASS_DAT,'DD-MM-YYYY')>='01-JAN-2019' 
    AND to_char(H.ERFASS_DAT,'DD-MM-YYYY')<='31-JAN-2019'



выполняется за 0.045 сек.

Модифицированный запрос

Код: plsql
1.
2.
3.
4.
select 
  * 
  from AUF_POS D INNER JOIN AUF_KOPF H ON  D.auf_nr = H.AUF_NR
  where H.ERFASS_DAT > to_date('01-APR-2019', 'DD-MON-YYYY') AND H.ERFASS_DAT <= to_date('30-APR-2019', 'DD-MON-YYYY')



выполняется за 1.05 сек.

Вариация
Код: plsql
1.
  where H.ERFASS_DAT BETWEEN to_date('01-APR-2019', 'DD-MON-YYYY') AND to_date('30-APR-2019', 'DD-MON-YYYY')



работает еще медленнее.

Поля
AUF_NR numeric(9)
ERFASS_DAT timestamp without time zone

Планы запросов - одинаковые.


Где Я потерял 0.6 сек?
Что не так с BETWEEN?
Почему первый - там разница в формате вывода месяца - запрос вообще вернул правильные данные?


Тапками кидать можно, но всего пару дней как разбираюсь с постгрее...
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906148
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCat.000003,

покажите explain (analyze,buffers) всех 3 запросов
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906154
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCat.000003

Почему первый - там разница в формате вывода месяца - запрос вообще вернул правильные данные?

Вы в этом уверены, что вернул именно правильные? )))

смысл сравнивать время работы неправильного запроса - вообще не понятно

И вообще не понятно, как он мог хоть что-то вернуть, т.к., например:

условие 01-01-2019 >= 01-JAN-2019
для большинства локалей будет ложно
цифры в ASCII таблицы обычно идут ДО букв, хотя. конечно, зависит от настройки локали
т.ч. 0 >= J всегда должно быть ложно
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906157
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCat.000003,

​На то, что берутся данные за Январь и за Апрель - можно не смотреть - разница есть и в пределах одного месяца.
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906165
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Первый и второй запрос смотрят на разные месяцы, а значит могут возвращать очень разное количество строк.

Попробуйте

Код: sql
1.
2.
3.
select   * 
  from AUF_POS D INNER JOIN AUF_KOPF H ON  D.auf_nr = H.AUF_NR
  where H.ERFASS_DAT > '2019-04-01' AND H.ERFASS_DAT <= '2019-04-30';



или

Код: sql
1.
2.
3.
select   * 
  from AUF_POS D INNER JOIN AUF_KOPF H ON  D.auf_nr = H.AUF_NR
  where H.ERFASS_DAT BETWEEN '2019-04-01' AND  '2019-04-30';
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906166
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij,

Legend:
Node Type Relation Name Startup Cost Total Cost Actual Rows Plan Rows Plan Width Actual Startup Time Actual Total Time Actual Loops Parallel Aware


1 (WHERE D.AUF_NR=H.AUF_NR ).
Код: plaintext
1.
2.
3.
Seq Scan	liorder.auf_kopf h	0.00	78738.91	602744	2890	622	0.179	2632.848	1	true
Index Scan	auf_pos_search_index	0.43	163.46	6	98	429	0.007	0.019	602744	false
Nested Loop		0.43	553972.79	3821561	18333	1051	0.298	29474.381	1	false
Gather		1000.43	559372.79	8655159	44000	1051	1.777	37078.682	1	false


3 (Between).
Код: plaintext
1.
2.
3.
Index Scan	auf_pos_search_index	0.43	189.70	6	98	429	0.009	0.022	2144	false
Seq Scan	liorder.auf_kopf h	0.00	78738.91	2144	1863	622	0.081	420.311	1	true
Nested Loop		0.43	433978.00	12194	11818	1051	0.188	518.042	1	false
Gather		1000.43	437814.20	30741	28362	1051	1.499	553.323	1	false

2.
Код: plaintext
1.
2.
3.
Gather				1000.43	575636.56	39128	46448	1051	1.550	576.085	1	false
Nested Loop			0.43	569991.76	16213	19353	1051	0.162	533.269	1	false
Seq Scan	liorder.auf_kopf h	0.00	78738.91	2831	3051	622	0.085	407.264	1	true
Index Scan	auf_pos_search_index	0.43	160.03	6	98	429	0.008	0.021	2831	false
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906167
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

>Вы в этом уверены, что вернул именно правильные?
Не уверен. Я вообще "не знаю" что там за данные.

Но тот кто смотрел данные сказал что они его устраивают.
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906172
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

>цифры в ASCII таблицы обычно идут ДО букв
Это - понятно.
Непонятно почему сравнение двух длинных целых работает медленнее сравнения строк, включая преобразование одного из этих целых в строку.
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906175
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCat.000003
Melkij,

Legend:
Node Type Relation Name Startup Cost Total Cost Actual Rows Plan Rows Plan Width Actual Startup Time Actual Total Time Actual Loops Parallel Aware


1 (WHERE D.AUF_NR=H.AUF_NR ).
Код: plaintext
1.
2.
3.
Seq Scan	liorder.auf_kopf h	0.00	78738.91	602744	2890	622	0.179	2632.848	1	true
Index Scan	auf_pos_search_index	0.43	163.46	6	98	429	0.007	0.019	602744	false
Nested Loop		0.43	553972.79	3821561	18333	1051	0.298	29474.381	1	false
Gather		1000.43	559372.79	8655159	44000	1051	1.777	37078.682	1	false


3 (Between).
Код: plaintext
1.
2.
3.
Index Scan	auf_pos_search_index	0.43	189.70	6	98	429	0.009	0.022	2144	false
Seq Scan	liorder.auf_kopf h	0.00	78738.91	2144	1863	622	0.081	420.311	1	true
Nested Loop		0.43	433978.00	12194	11818	1051	0.188	518.042	1	false
Gather		1000.43	437814.20	30741	28362	1051	1.499	553.323	1	false

2.
Код: plaintext
1.
2.
3.
Gather				1000.43	575636.56	39128	46448	1051	1.550	576.085	1	false
Nested Loop			0.43	569991.76	16213	19353	1051	0.162	533.269	1	false
Seq Scan	liorder.auf_kopf h	0.00	78738.91	2831	3051	622	0.085	407.264	1	true
Index Scan	auf_pos_search_index	0.43	160.03	6	98	429	0.008	0.021	2831	false



а вывести текстовый вывод эксплейнов религия не велит ?

тег [csv] освойте хотя бы.
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906180
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guzya,

авторselect *
from AUF_POS D INNER JOIN AUF_KOPF H ON D.auf_nr = H.AUF_NR
where H.ERFASS_DAT BETWEEN '2019-04-01' AND '2019-04-30';

Примерно в два раза медленнее

Код: plsql
1.
2.
3.
4.
5.
6.
select 
  * 
  --FROM AUF_POS D, AUF_KOPF H 
  from AUF_POS D INNER JOIN AUF_KOPF H ON  D.auf_nr = H.AUF_NR
  where H.ERFASS_DAT BETWEEN to_date('01-APR-2019', 'DD-MON-YYYY') AND to_date('30-APR-2019', 'DD-MON-YYYY')
  --where H.ERFASS_DAT > to_date('01-APR-2019', 'DD-MON-YYYY') AND H.ERFASS_DAT <= to_date('30-APR-2019', 'DD-MON-YYYY')
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906184
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

>а вывести текстовый вывод эксплейнов религия не велит ?
Не религия, но навыки.
Если проще - не умею.
Умею взять план в дбФорге и запостить "как есть".

Могу еще скинуть ХМЛ.


Из командной строки с сервером пока не работаю - не умею.
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906200
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCat.000003,

N.P.

Собрал в кучку 4 варианта запроса.

Код: 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.
select * 
  FROM AUF_POS D, AUF_KOPF H 
  WHERE D.auf_nr = H.AUF_NR
  AND to_char(H.ERFASS_DAT,'DD-MM-YYYY')>='01-APR-2019'
  AND to_char(H.ERFASS_DAT,'DD-MM-YYYY')<='30-APR-2019'
;

select * 
  from AUF_POS D INNER JOIN AUF_KOPF H ON  D.auf_nr = H.AUF_NR
  where H.ERFASS_DAT > to_date('01-APR-2019', 'DD-MON-YYYY') 
    AND H.ERFASS_DAT <= to_date('30-APR-2019', 'DD-MON-YYYY')
  ;

  select * 
  from AUF_POS D INNER JOIN AUF_KOPF H ON  D.auf_nr = H.AUF_NR
  where H.ERFASS_DAT BETWEEN to_date('01-APR-2019', 'DD-MON-YYYY') 
                                           AND to_date('30-APR-2019', 'DD-MON-YYYY')
  ;

  select * 
  from AUF_POS D INNER JOIN AUF_KOPF H ON  D.auf_nr = H.AUF_NR
  where H.ERFASS_DAT BETWEEN '2019-04-01' 
                                          AND  '2019-04-30'
  ;



Выполнил несколько раз. Наиболее показательные тайминги:

Query opened in 0.129s [0.043s exec, 0.086s fetch]
Query opened in 0.132s [0.042s exec, 0.090s fetch]
Query opened in 0.133s [0.042s exec, 0.091s fetch]
Query opened in 0.128s [0.042s exec, 0.086s fetch]


Query opened in 0.012s [0.006s exec, 0.006s fetch]
Query opened in 0.004s [0.003s exec, 0.001s fetch]
Query opened in 0.450s [0.017s exec, 0.433s fetch]
Query opened in 0.134s [0.041s exec, 0.093s fetch]

Нагрузка на сервер сегодня примерно ноль - все уже выключено перед рождественскими каникулами.
Так что выпал в сильное непонимание того что и как должно работать...
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906232
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Поковырял планы запросов в части фильтрации:

Некорректный формат месяца:
Filter: ((to_char(erfass_dat, 'DD-MM-YYYY'::text) >= '01-APR-2019'::text) AND (to_char(erfass_dat, 'DD-MM-YYYY'::text) <= '30-APR-2019'::text))
Rows Removed by Filter: 21985


Kорректный формат месяца:
Filter: ((to_char(erfass_dat, 'DD-MON-YYYY'::text) >= '01-APR-2019'::text) AND (to_char(erfass_dat, 'DD-MON-YYYY'::text) <= '30-APR-2019'::text))
Rows Removed by Filter: 21195


Версия BETWEEN
Filter: ((erfass_dat >= to_date('01-APR-2019'::text, 'DD-MON-YYYY'::text)) AND (erfass_dat <= to_date('30-APR-2019'::text, 'DD-MON-YYYY'::text)))
Rows Removed by Filter: 460049

Но почему последняя практически не ускоряет запрос - не понимаю.


Последний вариант, где поле и дата без преобразования - тоже не понимаю.
Но тут непонимание другого - какая именно будет компарация и что будет кастится.
Filter: ((erfass_dat >= '2019-04-01 00:00:00'::timestamp without time zone) AND (erfass_dat <= '2019-04-30 00:00:00'::timestamp without time zone))
Rows Removed by Filter: 460049
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906235
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCat.000003,

Сторонний вопрос: как запросом собрать в одну таблицу результат анализа нескольких версий запроса?
Вроде на stackoverflow рекомендовали писать функцию.
Чего по-проще нету?
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906251
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как минимум показывайте DDL таблиц и какие есть индексы
Т.к. на мой взгляд, в планах какая-то ерунда. При таком запросе и правильном индексе никакого seq scan быть не должно.

Хотя с планами PostgreSQL близко не знаком (использую Oracle)
...
Рейтинг: 0 / 0
Производительность запроса?
    #39906294
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Индекса по полю - ERFASS_DAT - нет. По этому полный скан Я воспринимаю как нормальное поведение.
По - AUF_NR - есть. Вроде первичный, но неуникальный. Детали не помню - база не моя.

Ну да ладно - в этом году уже все.
Всех - с Наступающим...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Производительность запроса?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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