Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
 Аватар для Slavianko
0 / 0 / 0
Регистрация: 30.06.2022
Сообщений: 4

PostgreSQL Оптимизировать запрос

02.07.2022, 15:37. Показов 874. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код выполняется от 13 минут, выдает 1 800 291 строк, хотелось бы при возможности упростить код запроса.
Вроде бы все данные выдает верно.
Когда запускаю с explain analyze, больше получаса висит, не дожидаюсь результата (это возможно еще тупо инет отрубается, он сейчас нестабильный и за полчаса может оборваться).


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
SELECT "TAG_IDS"."ID" AS tag_id,
 "TAG_IDS"."NAME" AS tag_name,
 "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AS doctor_id,
 "DOCTOR_TYPES"."DOCTOR_TYPE_ID" AS doctor_type_id,
 "COUNTER_TAGS"."COUNTER" AS counter,
 
 array_agg("HISTORY_ENDORSEMENTS"."USER_ID") AS user_id_array,
 array_agg("USERS"."NAME") AS user_name_array,
 array_agg("HISTORY_ENDORSEMENTS"."PATIENT_NAME") AS patient_name_array,
 array_agg("HISTORY_ENDORSEMENTS"."IS_NEGATIVE") AS is_negative_array,
 
 (SELECT COUNT("IS_NEGATIVE") FROM "HISTORY_ENDORSEMENTS" WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = "TAG_IDS"."ID" AND "IS_NEGATIVE" = FALSE) AS is_negative_false,
 (SELECT COUNT("IS_NEGATIVE") FROM "HISTORY_ENDORSEMENTS" WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = "TAG_IDS"."ID" AND "IS_NEGATIVE" = TRUE) AS is_negative_true,
 (SELECT COUNT("TAG_ID") FROM "HISTORY_ENDORSEMENTS" WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = 100000 AND "IS_NEGATIVE" = FALSE) AS dummy_is_negative_false,
 (SELECT COUNT("TAG_ID") FROM "HISTORY_ENDORSEMENTS" WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = 100000 AND "IS_NEGATIVE" = TRUE) AS dummy_is_negative_true,
                            
 (array_to_string (array(SELECT "PATIENT_NAME" FROM "HISTORY_ENDORSEMENTS" WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = 100000 AND "IS_NEGATIVE" = FALSE), ',')) AS patient_name_dummy_is_negative_false,
 
 (array_to_string (array(SELECT "PATIENT_NAME" FROM "HISTORY_ENDORSEMENTS" WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = 100000 AND "IS_NEGATIVE" = TRUE), ',')) AS patient_name_dummy_is_negative_true,
 
 (array_to_string (array(SELECT "USER_ID" FROM "HISTORY_ENDORSEMENTS" WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = 100000 AND "IS_NEGATIVE" = FALSE), ',')) AS user_id_dummy_is_negative_false,
 
 (array_to_string (array(SELECT "USER_ID" FROM "HISTORY_ENDORSEMENTS" WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = 100000 AND "IS_NEGATIVE" = TRUE), ',')) AS user_id_dummy_is_negative_true
 
 FROM "TAGS"
 
 LEFT JOIN "DOCTOR_TYPES" ON "DOCTOR_TYPES"."DOCTOR_TYPE_ID"="TAGS"."DOCTOR_TYPE_ID"
 LEFT JOIN "CLINIC_DOCTOR_SCHEDULE" ON "CLINIC_DOCTOR_SCHEDULE"."ID"="DOCTOR_TYPES"."CLINIC_DOCTOR_ID"
 LEFT JOIN "COUNTER_TAGS" ON "COUNTER_TAGS"."TAG_ID"="TAGS"."TAG_ID" AND "COUNTER_TAGS"."DOCTOR_ID"="CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID"
 LEFT JOIN "HISTORY_ENDORSEMENTS" ON "HISTORY_ENDORSEMENTS"."TAG_ID"="TAGS"."TAG_ID" AND "HISTORY_ENDORSEMENTS"."DOCTOR_ID"="CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID"
 LEFT JOIN "USERS" ON "USERS"."ID"="HISTORY_ENDORSEMENTS"."USER_ID"
 LEFT JOIN "TAG_IDS" ON "TAGS"."TAG_ID"="TAG_IDS"."ID"
                             
 GROUP BY tag_id, doctor_id, doctor_type_id, counter;
Можно пока исключить вывод patient_name_dummy_is_negative_false и patient_name_dummy_is_negative_true, поскольку выдает пустые данные. Но на перспективу там тоже данные будут.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.07.2022, 15:37
Ответы с готовыми решениями:

Запрос в postgresql
Добрый день всем. Просьба помочь составить запрос. Есть схема prescat в ней есть представление v_settings в ней есть параметр...

Запрос в PostgreSQL"
Помогите написать запрос, что бы получить вот такую таблицу. Диагности- Лечебные Оперативные Итого ...

Оптимизировать запрос
Помогите мне оптимизировать запрос. Суть в чем. У меня есть две таблицы, одна с номерами телефоном, другая со звонками на эти номера. ...

9
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
02.07.2022, 23:20
Цитата Сообщение от Slavianko Посмотреть сообщение
выдает 1 800 291 строк
1. Это сколько в Мb ?

2. DDL табличек с индексами в студию.

3. Время CPU по отношению к запросу какое?
1
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
03.07.2022, 08:25
поля в count-х избыточны, заменить на * чуть быстрей будет
что за блажь поля логического типа сравнивать с true или false? просто where S_NEGATIVE или where not S_NEGATIVE
1
 Аватар для Slavianko
0 / 0 / 0
Регистрация: 30.06.2022
Сообщений: 4
03.07.2022, 13:22  [ТС]
Цитата Сообщение от PaulWist Посмотреть сообщение
1. Это сколько в Мb ?

2. DDL табличек с индексами в студию.

3. Время CPU по отношению к запросу какое?
SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE "TAG_IDS"
(
  "ID" BIGINT NOT NULL DEFAULT NEXTVAL('"TAG_IDS_seq"'::regclass),
  "NAME" CHARACTER VARYING(128),
  CONSTRAINT "TAG_IDS_pkey" PRIMARY KEY ("ID"),
  CONSTRAINT unique_tag_ids UNIQUE ("NAME")
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "TAG_IDS"
  OWNER TO postgres;
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
CREATE TABLE "CLINIC_DOCTOR_SCHEDULE"
(
  "ID" bigserial NOT NULL,
  "CLINIC_ID" BIGINT NOT NULL,
  "DOCTOR_ID" BIGINT NOT NULL,
  "EXPIRATION_TIME" TIMESTAMP WITHOUT TIME zone,
  "PRICE" BIGINT,
  "IS_CHILDREN_RECEPTION" BOOLEAN,
  "SPECIAL_PRICE" BIGINT,
  "POSITION_ACTION_TIME" TIMESTAMP WITHOUT TIME zone,
  "EXPIRATION_TIME_ARHIV" TIMESTAMP WITHOUT TIME zone,
  CONSTRAINT "CLINIC_DOCTOR_SCHEDULE_pkey" PRIMARY KEY ("ID"),
  CONSTRAINT "CLINIC_ID" FOREIGN KEY ("CLINIC_ID")
      REFERENCES "CLINICS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT "DOCTOR_ID" FOREIGN KEY ("DOCTOR_ID")
      REFERENCES "DOCTORS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT positive_clinic_id CHECK ("CLINIC_ID" > 0),
  CONSTRAINT positive_doctor_id CHECK ("DOCTOR_ID" > 0)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "CLINIC_DOCTOR_SCHEDULE"
  OWNER TO postgres;
 
-- Index: duplicate__clinic_id__doctor_id
 
-- DROP INDEX duplicate__clinic_id__doctor_id;
 
CREATE UNIQUE INDEX duplicate__clinic_id__doctor_id
  ON "CLINIC_DOCTOR_SCHEDULE"
  USING btree
  ("CLINIC_ID", "DOCTOR_ID");
 
-- Index: "fki_CLINIC_ID"
 
-- DROP INDEX "fki_CLINIC_ID";
 
CREATE INDEX "fki_CLINIC_ID"
  ON "CLINIC_DOCTOR_SCHEDULE"
  USING btree
  ("CLINIC_ID");
 
-- Index: "fki_DOCTOR_ID"
 
-- DROP INDEX "fki_DOCTOR_ID";
 
CREATE INDEX "fki_DOCTOR_ID"
  ON "CLINIC_DOCTOR_SCHEDULE"
  USING btree
  ("DOCTOR_ID");
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
40
41
42
43
44
45
46
47
CREATE TABLE "DOCTOR_TYPES"
(
  "ID" BIGINT NOT NULL DEFAULT NEXTVAL('"DOCTOR_TYPES_seq"'::regclass),
  "DOCTOR_TYPE_ID" INTEGER NOT NULL,
  "CLINIC_DOCTOR_ID" BIGINT,
  CONSTRAINT "DOCTOR_TYPES_pey" PRIMARY KEY ("ID"),
  CONSTRAINT "CLINIC_DOCTOR_ID2" FOREIGN KEY ("CLINIC_DOCTOR_ID")
      REFERENCES "CLINIC_DOCTOR_SCHEDULE" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT "DOCTOR_TYPE_ID2" FOREIGN KEY ("DOCTOR_TYPE_ID")
      REFERENCES "DOCTOR_TYPE_IDS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT positive_clinic_doctor_id CHECK ("CLINIC_DOCTOR_ID" > 0),
  CONSTRAINT positive_doctor_type_id CHECK ("DOCTOR_TYPE_ID" > 0)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "DOCTOR_TYPES"
  OWNER TO postgres;
 
-- Index: duplicate__clinic_doctor_id__doctor_type_id
 
-- DROP INDEX duplicate__clinic_doctor_id__doctor_type_id;
 
CREATE UNIQUE INDEX duplicate__clinic_doctor_id__doctor_type_id
  ON "DOCTOR_TYPES"
  USING btree
  ("CLINIC_DOCTOR_ID", "DOCTOR_TYPE_ID");
 
-- Index: "fki_CLINIC_DOCTOR_ID2"
 
-- DROP INDEX "fki_CLINIC_DOCTOR_ID2";
 
CREATE INDEX "fki_CLINIC_DOCTOR_ID2"
  ON "DOCTOR_TYPES"
  USING btree
  ("CLINIC_DOCTOR_ID");
 
-- Index: "fki_DOCTOR_TYPE_ID2"
 
-- DROP INDEX "fki_DOCTOR_TYPE_ID2";
 
CREATE INDEX "fki_DOCTOR_TYPE_ID2"
  ON "DOCTOR_TYPES"
  USING btree
  ("DOCTOR_TYPE_ID");
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
40
41
42
43
44
45
46
47
48
49
CREATE TABLE "COUNTER_TAGS"
(
  "ID" BIGINT NOT NULL DEFAULT NEXTVAL('"COUNTER_TAGS_seq"'::regclass),
  "TAG_ID" BIGINT NOT NULL,
  "DOCTOR_ID" BIGINT NOT NULL,
  "COUNTER" INTEGER NOT NULL,
  CONSTRAINT "COUNTER_TAGS_pkey" PRIMARY KEY ("ID"),
  CONSTRAINT "DOCTOR_ID5" FOREIGN KEY ("DOCTOR_ID")
      REFERENCES "DOCTORS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT "TAG_ID3" FOREIGN KEY ("TAG_ID")
      REFERENCES "TAG_IDS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT positive_counter CHECK ("COUNTER" > 0),
  CONSTRAINT positive_doctor_id CHECK ("DOCTOR_ID" > 0),
  CONSTRAINT positive_tag_id CHECK ("TAG_ID" > 0)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "COUNTER_TAGS"
  OWNER TO postgres;
 
-- Index: duplicate__tag_id__doctor_id
 
-- DROP INDEX duplicate__tag_id__doctor_id;
 
CREATE UNIQUE INDEX duplicate__tag_id__doctor_id
  ON "COUNTER_TAGS"
  USING btree
  ("TAG_ID", "DOCTOR_ID");
 
-- Index: "fki_DOCTOR_ID5"
 
-- DROP INDEX "fki_DOCTOR_ID5";
 
CREATE INDEX "fki_DOCTOR_ID5"
  ON "COUNTER_TAGS"
  USING btree
  ("DOCTOR_ID");
 
-- Index: "fki_TAG_ID3"
 
-- DROP INDEX "fki_TAG_ID3";
 
CREATE INDEX "fki_TAG_ID3"
  ON "COUNTER_TAGS"
  USING btree
  ("TAG_ID");
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
CREATE TABLE "HISTORY_ENDORSEMENTS"
(
  "ID" BIGINT NOT NULL DEFAULT NEXTVAL('"HISTORY_ENDORSEMENTS_seq"'::regclass),
  "TAG_ID" BIGINT NOT NULL,
  "DOCTOR_ID" BIGINT NOT NULL,
  "USER_ID" BIGINT NOT NULL,
  "PATIENT_NAME" CHARACTER VARYING(64),
  "ACTIVATION_TIME" TIMESTAMP WITHOUT TIME zone,
  "IP_ADDRESS" CHARACTER VARYING(100),
  "FINGERPRINT" CHARACTER VARYING(32),
  "NAME" CHARACTER VARYING(100),
  "GENDER" BOOLEAN,
  "DATE_BIRTH" DATE,
  "IS_NEGATIVE" BOOLEAN DEFAULT FALSE,
  CONSTRAINT "HISTORY_ENDORSEMENTS_pkey" PRIMARY KEY ("ID"),
  CONSTRAINT "DOCTOR_ID4" FOREIGN KEY ("DOCTOR_ID")
      REFERENCES "DOCTORS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT "TAG_ID4" FOREIGN KEY ("TAG_ID")
      REFERENCES "TAG_IDS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT "USER_ID5" FOREIGN KEY ("USER_ID")
      REFERENCES "USERS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT positive_doctor_id CHECK ("DOCTOR_ID" > 0),
  CONSTRAINT positive_tag_id CHECK ("TAG_ID" > 0),
  CONSTRAINT positive_user_id CHECK ("USER_ID" > 0)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "HISTORY_ENDORSEMENTS"
  OWNER TO postgres;
 
-- Index: "fki_DOCTOR_ID4"
 
-- DROP INDEX "fki_DOCTOR_ID4";
 
CREATE INDEX "fki_DOCTOR_ID4"
  ON "HISTORY_ENDORSEMENTS"
  USING btree
  ("DOCTOR_ID");
 
-- Index: "fki_TAG_ID4"
 
-- DROP INDEX "fki_TAG_ID4";
 
CREATE INDEX "fki_TAG_ID4"
  ON "HISTORY_ENDORSEMENTS"
  USING btree
  ("TAG_ID");
 
-- Index: "fki_USER_ID5"
 
-- DROP INDEX "fki_USER_ID5";
 
CREATE INDEX "fki_USER_ID5"
  ON "HISTORY_ENDORSEMENTS"
  USING btree
  ("USER_ID");
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
CREATE TABLE "USERS"
(
  "ID" bigserial NOT NULL,
  "NAME" CHARACTER VARYING(64) NOT NULL,
  "RATING_POINTS" INTEGER NOT NULL,
  "KEYWORD" CHARACTER VARYING(128),
  "EMAIL" CHARACTER VARYING(64),
  "MOBILE" CHARACTER VARYING(16),
  "SURNAME" CHARACTER VARYING(64),
  "IS_ACTIVE" BOOLEAN,
  "ACTIVATION_KEY" CHARACTER VARYING(128),
  "GENDER" BOOLEAN NOT NULL,
  "DATE_BIRTH" DATE,
  "SALT" CHARACTER VARYING(64),
  "EXPIRATION_TIME" TIMESTAMP WITHOUT TIME zone,
  "REGISTRATION_TIME" TIMESTAMP WITHOUT TIME zone NOT NULL,
  "INFO" CHARACTER VARYING(2048),
  CONSTRAINT "USERS_pkey" PRIMARY KEY ("ID"),
  CONSTRAINT unique_user_email UNIQUE ("EMAIL"),
  CONSTRAINT positive_raiting CHECK ("RATING_POINTS" > 0)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "USERS"
  OWNER TO postgres;
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
CREATE TABLE "TAGS"
(
  "ID" BIGINT NOT NULL DEFAULT NEXTVAL('"TAGS_seq"'::regclass),
  "DOCTOR_TYPE_ID" INTEGER,
  "DOCTOR_ID" BIGINT,
  "IS_PRINT" BOOLEAN,
  "TAG_ID" BIGINT,
  CONSTRAINT "TAGS_pkey" PRIMARY KEY ("ID"),
  CONSTRAINT "DOCTOR_ID2" FOREIGN KEY ("DOCTOR_ID")
      REFERENCES "DOCTORS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT "DOCTOR_TYPE_ID3" FOREIGN KEY ("DOCTOR_TYPE_ID")
      REFERENCES "DOCTOR_TYPE_IDS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT "TAGS_ID" FOREIGN KEY ("TAG_ID")
      REFERENCES "TAG_IDS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT positive_doctor_id CHECK ("DOCTOR_ID" > 0),
  CONSTRAINT positive_doctor_type_id CHECK ("DOCTOR_TYPE_ID" > 0)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "TAGS"
  OWNER TO postgres;
 
-- Index: duplicate___tag_id__doctor_id
 
-- DROP INDEX duplicate___tag_id__doctor_id;
 
CREATE UNIQUE INDEX duplicate___tag_id__doctor_id
  ON "TAGS"
  USING btree
  ("TAG_ID", "DOCTOR_ID");
 
-- Index: duplicate__tag_id__doctor_type_id
 
-- DROP INDEX duplicate__tag_id__doctor_type_id;
 
CREATE UNIQUE INDEX duplicate__tag_id__doctor_type_id
  ON "TAGS"
  USING btree
  ("TAG_ID", "DOCTOR_TYPE_ID");
 
-- Index: "fki_DOCTOR_ID2"
 
-- DROP INDEX "fki_DOCTOR_ID2";
 
CREATE INDEX "fki_DOCTOR_ID2"
  ON "TAGS"
  USING btree
  ("DOCTOR_ID");
 
-- Index: "fki_DOCTOR_TYPE_ID3"
 
-- DROP INDEX "fki_DOCTOR_TYPE_ID3";
 
CREATE INDEX "fki_DOCTOR_TYPE_ID3"
  ON "TAGS"
  USING btree
  ("DOCTOR_TYPE_ID");
Добавлено через 14 минут
Цитата Сообщение от Аватар Посмотреть сообщение
поля в count-х избыточны, заменить на * чуть быстрей будет
что за блажь поля логического типа сравнивать с true или false? просто where S_NEGATIVE или where not S_NEGATIVE
Спасибо, это в запросе подправил

Добавлено через 14 минут
>>1. Это сколько в Мb?

Подскажите, где (какой командой к запросу) это посмотреть? В результате выполнения запроса в панели вывода pgAdmin вижу только время выполнения запроса в ms и количество строк.

>>3. Время CPU по отношению к запросу какое?

При запуске запроса, полностью одно ядро занято процессом в постгре (на все время выполнения запроса). Есть какой-то более точный метод это посмотреть?
0
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
03.07.2022, 22:31
SQL
1
2
EXPLAIN (analyze, buffers, timing, wal)
SELECT ...
План запроса смотрите, в нем будет сказано, где-же точно и что тормозит.
1
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
04.07.2022, 09:55
Цитата Сообщение от Slavianko Посмотреть сообщение
Подскажите, где (какой командой к запросу) это посмотреть? В результате выполнения запроса в панели вывода pgAdmin вижу только время выполнения запроса в ms и количество строк.
Это просто подсчитать, длина полей результирующего запроса известна, например

SQL
1
2
3
4
5
SELECT "TAG_IDS"."ID" AS tag_id, -- 4
 "TAG_IDS"."NAME" AS tag_name, -- 128
 "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AS doctor_id, -- 4
 "DOCTOR_TYPES"."DOCTOR_TYPE_ID" AS doctor_type_id, -- 4
 "COUNTER_TAGS"."COUNTER" AS counter, -- 4
Тут максимум 144 байта

Смущают

SQL
1
(array_to_string (array(SELECT "PATIENT_NAME" FROM "HISTORY_ENDORSEMENTS" WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = 100000 AND "IS_NEGATIVE" = FALSE), ',')) AS patient_name_dummy_is_negative_false, -- 64
для 2 млн строк результата по 64*количество PATIENT_NAME может быть достаточно большим, если array содержит по 100 элементов, то на строку получается 6.4К, итого 6.4Г на один array_to_string, у вас таких 4 шт, итого получим 25Г результирующей выборки.

Упрощайте запрос (например методом дихотомии), смотрите при добавлении какого поля, таблицы начнутся тормоза.
1
 Аватар для Slavianko
0 / 0 / 0
Регистрация: 30.06.2022
Сообщений: 4
04.07.2022, 12:55  [ТС]
Цитата Сообщение от grgdvo Посмотреть сообщение
SQL
1
2
EXPLAIN (analyze, buffers, timing, wal)
SELECT ...
План запроса смотрите, в нем будет сказано, где-же точно и что тормозит.
версия postgres 9.1, pgAdmin3, с параметрами timing, wal план запроса не запустился (возможно, с этими версиями они не поддерживаются). Сделал только EXPLAIN (analyze, buffers) SELECT... (во вложении).
На сколько я понимаю, наибольшее количество ресурсов уходит на объединение таблиц Left Join. Но они вроде все нужны, чтобы объединить все подзапросы. Возможно, как-то пограмотнее их можно написать.
Вложения
Тип файла: xlsx explain-analyze-buffer-data-03_07_2022.xlsx (13.3 Кб, 3 просмотров)
0
 Аватар для Slavianko
0 / 0 / 0
Регистрация: 30.06.2022
Сообщений: 4
04.07.2022, 13:12  [ТС]
продублирую, чтобы файл не открывать:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
QUERY PLAN
GroupAggregate  (cost=1097309.96..799389101.23 ROWS=2307292 width=84) (actual TIME=16545.270..1262930.651 ROWS=1803470 loops=1)
  Buffers: shared hit=100888148 READ=22874, temp READ=69839 written=69859
  ->  Sort  (cost=1097309.96..1103078.19 ROWS=2307292 width=84) (actual TIME=16545.127..18820.715 ROWS=2872583 loops=1)
        Sort KEY: "TAG_IDS"."ID", "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID", "DOCTOR_TYPES"."DOCTOR_TYPE_ID", "COUNTER_TAGS"."COUNTER"
        Sort Method: external sort  Disk: 214984kB
        Buffers: shared hit=57526 READ=4704, temp READ=69839 written=69859
        ->  Hash LEFT JOIN  (cost=455137.45..522221.93 ROWS=2307292 width=84) (actual TIME=5678.284..9847.903 ROWS=2872583 loops=1)
              Hash Cond: ("TAGS"."TAG_ID" = "TAG_IDS"."ID")
              Buffers: shared hit=57526 READ=4704, temp READ=42966 written=42986
              ->  MERGE LEFT JOIN  (cost=455108.13..490467.35 ROWS=2307292 width=50) (actual TIME=5678.003..8869.264 ROWS=2872583 loops=1)
                    MERGE Cond: (("TAGS"."TAG_ID" = "COUNTER_TAGS"."TAG_ID") AND ("CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" = "COUNTER_TAGS"."DOCTOR_ID"))
                    Buffers: shared hit=57517 READ=4704, temp READ=42966 written=42986
                    ->  MERGE LEFT JOIN  (cost=455108.13..474187.67 ROWS=2307292 width=46) (actual TIME=5677.021..7913.247 ROWS=2872583 loops=1)
                          MERGE Cond: (("TAGS"."TAG_ID" = public."HISTORY_ENDORSEMENTS"."TAG_ID") AND ("CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" = public."HISTORY_ENDORSEMENTS"."DOCTOR_ID"))
                          Buffers: shared hit=1291 READ=3797, temp READ=42966 written=42986
                          ->  Sort  (cost=428160.54..433928.77 ROWS=2307292 width=20) (actual TIME=5231.601..6480.116 ROWS=2608409 loops=1)
                                Sort KEY: "TAGS"."TAG_ID", "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID"
                                Sort Method: external MERGE  Disk: 86720kB
                                Buffers: shared hit=1235 READ=1061, temp READ=40830 written=40816
                                ->  Hash RIGHT JOIN  (cost=4038.55..42345.52 ROWS=2307292 width=20) (actual TIME=47.271..800.605 ROWS=2608409 loops=1)
                                      Hash Cond: ("DOCTOR_TYPES"."DOCTOR_TYPE_ID" = "TAGS"."DOCTOR_TYPE_ID")
                                      Buffers: shared hit=1235 READ=1061, temp READ=1037 written=1023
                                      ->  Hash LEFT JOIN  (cost=3973.30..11429.55 ROWS=163743 width=12) (actual TIME=46.184..260.756 ROWS=163513 loops=1)
                                            Hash Cond: ("DOCTOR_TYPES"."CLINIC_DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."ID")
                                            Buffers: shared hit=1215 READ=1054, temp READ=1037 written=1023
                                            ->  Seq Scan ON "DOCTOR_TYPES"  (cost=0.00..2701.43 ROWS=163743 width=12) (actual TIME=0.006..42.224 ROWS=163513 loops=1)
                                                  Buffers: shared hit=77 READ=987
                                            ->  Hash  (cost=2215.80..2215.80 ROWS=101080 width=16) (actual TIME=46.002..46.002 ROWS=101062 loops=1)
                                                  Buckets: 4096  Batches: 8  Memory Usage: 608kB
                                                  Buffers: shared hit=1138 READ=67, temp written=385
                                                  ->  Seq Scan ON "CLINIC_DOCTOR_SCHEDULE"  (cost=0.00..2215.80 ROWS=101080 width=16) (actual TIME=0.009..21.596 ROWS=101062 loops=1)
                                                        Buffers: shared hit=1138 READ=67
                                      ->  Hash  (cost=44.00..44.00 ROWS=1700 width=12) (actual TIME=1.078..1.078 ROWS=1714 loops=1)
                                            Buckets: 1024  Batches: 1  Memory Usage: 81kB
                                            Buffers: shared hit=20 READ=7
                                            ->  Seq Scan ON "TAGS"  (cost=0.00..44.00 ROWS=1700 width=12) (actual TIME=0.011..0.600 ROWS=1714 loops=1)
                                                  Buffers: shared hit=20 READ=7
                          ->  Materialize  (cost=26947.58..27801.04 ROWS=170692 width=42) (actual TIME=445.410..691.026 ROWS=387933 loops=1)
                                Buffers: shared hit=56 READ=2736, temp READ=2136 written=2170
                                ->  Sort  (cost=26947.58..27374.31 ROWS=170692 width=42) (actual TIME=445.405..629.055 ROWS=186713 loops=1)
                                      Sort KEY: public."HISTORY_ENDORSEMENTS"."TAG_ID", public."HISTORY_ENDORSEMENTS"."DOCTOR_ID"
                                      Sort Method: external MERGE  Disk: 10328kB
                                      Buffers: shared hit=56 READ=2736, temp READ=2136 written=2170
                                      ->  Hash LEFT JOIN  (cost=64.13..6860.06 ROWS=170692 width=42) (actual TIME=0.335..133.593 ROWS=193051 loops=1)
                                            Hash Cond: (public."HISTORY_ENDORSEMENTS"."USER_ID" = "USERS"."ID")
                                            Buffers: shared hit=56 READ=2736
                                            ->  Seq Scan ON "HISTORY_ENDORSEMENTS"  (cost=0.00..4448.92 ROWS=170692 width=28) (actual TIME=0.025..77.454 ROWS=193051 loops=1)
                                                  Buffers: shared hit=6 READ=2736
                                            ->  Hash  (cost=56.28..56.28 ROWS=628 width=22) (actual TIME=0.291..0.291 ROWS=653 loops=1)
                                                  Buckets: 1024  Batches: 1  Memory Usage: 37kB
                                                  Buffers: shared hit=50
                                                  ->  Seq Scan ON "USERS"  (cost=0.00..56.28 ROWS=628 width=22) (actual TIME=0.003..0.172 ROWS=653 loops=1)
                                                        Buffers: shared hit=50
                    ->  INDEX Scan USING duplicate__tag_id__doctor_id ON "COUNTER_TAGS"  (cost=0.00..4661.10 ROWS=61530 width=20) (actual TIME=0.978..252.433 ROWS=386753 loops=1)
                          Buffers: shared hit=56226 READ=907
              ->  Hash  (cost=18.03..18.03 ROWS=903 width=42) (actual TIME=0.253..0.253 ROWS=913 loops=1)
                    Buckets: 1024  Batches: 1  Memory Usage: 66kB
                    Buffers: shared hit=9
                    ->  Seq Scan ON "TAG_IDS"  (cost=0.00..18.03 ROWS=903 width=42) (actual TIME=0.008..0.113 ROWS=913 loops=1)
                          Buffers: shared hit=9
  SubPlan 1
    ->  Aggregate  (cost=14.57..14.58 ROWS=1 width=0) (actual TIME=0.020..0.020 ROWS=1 loops=1803470)
          Buffers: shared hit=6998247 READ=14010
          ->  Bitmap Heap Scan ON "HISTORY_ENDORSEMENTS"  (cost=10.55..14.57 ROWS=1 width=0) (actual TIME=0.016..0.016 ROWS=0 loops=1803470)
                Recheck Cond: (("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID") AND ("TAG_ID" = "TAG_IDS"."ID"))
                FILTER: (NOT "IS_NEGATIVE")
                Buffers: shared hit=6998247 READ=14010
                ->  BitmapAnd  (cost=10.55..10.55 ROWS=1 width=0) (actual TIME=0.013..0.013 ROWS=0 loops=1803470)
                      Buffers: shared hit=6903832 READ=5481
                      ->  Bitmap INDEX Scan ON "fki_DOCTOR_ID4"  (cost=0.00..4.47 ROWS=25 width=0) (actual TIME=0.004..0.004 ROWS=4 loops=1803470)
                            INDEX Cond: ("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID")
                            Buffers: shared hit=5431921 READ=4748
                      ->  Bitmap INDEX Scan ON "fki_TAG_ID4"  (cost=0.00..5.83 ROWS=207 width=0) (actual TIME=0.044..0.044 ROWS=408 loops=328041)
                            INDEX Cond: ("TAG_ID" = "TAG_IDS"."ID")
                            Buffers: shared hit=1471911 READ=733
  SubPlan 2
    ->  Aggregate  (cost=14.57..14.58 ROWS=1 width=0) (actual TIME=0.014..0.014 ROWS=1 loops=1803470)
          Buffers: shared hit=7012257
          ->  Bitmap Heap Scan ON "HISTORY_ENDORSEMENTS"  (cost=10.55..14.57 ROWS=1 width=0) (actual TIME=0.011..0.011 ROWS=0 loops=1803470)
                Recheck Cond: (("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID") AND ("TAG_ID" = "TAG_IDS"."ID"))
                FILTER: "IS_NEGATIVE"
                Buffers: shared hit=7012257
                ->  BitmapAnd  (cost=10.55..10.55 ROWS=1 width=0) (actual TIME=0.011..0.011 ROWS=0 loops=1803470)
                      Buffers: shared hit=6909313
                      ->  Bitmap INDEX Scan ON "fki_DOCTOR_ID4"  (cost=0.00..4.47 ROWS=25 width=0) (actual TIME=0.003..0.003 ROWS=4 loops=1803470)
                            INDEX Cond: ("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID")
                            Buffers: shared hit=5436669
                      ->  Bitmap INDEX Scan ON "fki_TAG_ID4"  (cost=0.00..5.83 ROWS=207 width=0) (actual TIME=0.039..0.039 ROWS=408 loops=328041)
                            INDEX Cond: ("TAG_ID" = "TAG_IDS"."ID")
                            Buffers: shared hit=1472644
  SubPlan 3
    ->  Aggregate  (cost=52.79..52.80 ROWS=1 width=0) (actual TIME=0.108..0.108 ROWS=1 loops=1803470)
          Buffers: shared hit=14466553 READ=4160
          ->  Bitmap Heap Scan ON "HISTORY_ENDORSEMENTS"  (cost=48.78..52.79 ROWS=1 width=0) (actual TIME=0.105..0.105 ROWS=0 loops=1803470)
                Recheck Cond: (("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID") AND ("TAG_ID" = 100000))
                FILTER: (NOT "IS_NEGATIVE")
                Buffers: shared hit=14466553 READ=4160
                ->  BitmapAnd  (cost=48.78..48.78 ROWS=1 width=0) (actual TIME=0.103..0.103 ROWS=0 loops=1803470)
                      Buffers: shared hit=14293752 READ=24
                      ->  Bitmap INDEX Scan ON "fki_DOCTOR_ID4"  (cost=0.00..4.47 ROWS=25 width=0) (actual TIME=0.003..0.003 ROWS=4 loops=1803470)
                            INDEX Cond: ("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID")
                            Buffers: shared hit=5436669
                      ->  Bitmap INDEX Scan ON "fki_TAG_ID4"  (cost=0.00..44.06 ROWS=1570 width=0) (actual TIME=0.550..0.550 ROWS=6339 loops=328041)
                            INDEX Cond: ("TAG_ID" = 100000)
                            Buffers: shared hit=8857083 READ=24
  SubPlan 4
    ->  Aggregate  (cost=52.79..52.80 ROWS=1 width=0) (actual TIME=0.107..0.107 ROWS=1 loops=1803470)
          Buffers: shared hit=14470713
          ->  Bitmap Heap Scan ON "HISTORY_ENDORSEMENTS"  (cost=48.78..52.79 ROWS=1 width=0) (actual TIME=0.105..0.105 ROWS=0 loops=1803470)
                Recheck Cond: (("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID") AND ("TAG_ID" = 100000))
                FILTER: "IS_NEGATIVE"
                Buffers: shared hit=14470713
                ->  BitmapAnd  (cost=48.78..48.78 ROWS=1 width=0) (actual TIME=0.103..0.103 ROWS=0 loops=1803470)
                      Buffers: shared hit=14293776
                      ->  Bitmap INDEX Scan ON "fki_DOCTOR_ID4"  (cost=0.00..4.47 ROWS=25 width=0) (actual TIME=0.003..0.003 ROWS=4 loops=1803470)
                            INDEX Cond: ("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID")
                            Buffers: shared hit=5436669
                      ->  Bitmap INDEX Scan ON "fki_TAG_ID4"  (cost=0.00..44.06 ROWS=1570 width=0) (actual TIME=0.549..0.549 ROWS=6339 loops=328041)
                            INDEX Cond: ("TAG_ID" = 100000)
                            Buffers: shared hit=8857107
  SubPlan 5
    ->  Bitmap Heap Scan ON "HISTORY_ENDORSEMENTS"  (cost=48.78..52.79 ROWS=1 width=3) (actual TIME=0.105..0.105 ROWS=0 loops=1803470)
          Recheck Cond: (("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID") AND ("TAG_ID" = 100000))
          FILTER: (NOT "IS_NEGATIVE")
          Buffers: shared hit=14470713
          ->  BitmapAnd  (cost=48.78..48.78 ROWS=1 width=0) (actual TIME=0.104..0.104 ROWS=0 loops=1803470)
                Buffers: shared hit=14293776
                ->  Bitmap INDEX Scan ON "fki_DOCTOR_ID4"  (cost=0.00..4.47 ROWS=25 width=0) (actual TIME=0.003..0.003 ROWS=4 loops=1803470)
                      INDEX Cond: ("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID")
                      Buffers: shared hit=5436669
                ->  Bitmap INDEX Scan ON "fki_TAG_ID4"  (cost=0.00..44.06 ROWS=1570 width=0) (actual TIME=0.550..0.550 ROWS=6339 loops=328041)
                      INDEX Cond: ("TAG_ID" = 100000)
                      Buffers: shared hit=8857107
  SubPlan 6
    ->  Bitmap Heap Scan ON "HISTORY_ENDORSEMENTS"  (cost=48.78..52.79 ROWS=1 width=3) (actual TIME=0.104..0.104 ROWS=0 loops=1803470)
          Recheck Cond: (("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID") AND ("TAG_ID" = 100000))
          FILTER: "IS_NEGATIVE"
          Buffers: shared hit=14470713
          ->  BitmapAnd  (cost=48.78..48.78 ROWS=1 width=0) (actual TIME=0.103..0.103 ROWS=0 loops=1803470)
                Buffers: shared hit=14293776
                ->  Bitmap INDEX Scan ON "fki_DOCTOR_ID4"  (cost=0.00..4.47 ROWS=25 width=0) (actual TIME=0.003..0.003 ROWS=4 loops=1803470)
                      INDEX Cond: ("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID")
                      Buffers: shared hit=5436669
                ->  Bitmap INDEX Scan ON "fki_TAG_ID4"  (cost=0.00..44.06 ROWS=1570 width=0) (actual TIME=0.550..0.550 ROWS=6339 loops=328041)
                      INDEX Cond: ("TAG_ID" = 100000)
                      Buffers: shared hit=8857107
  SubPlan 7
    ->  Bitmap Heap Scan ON "HISTORY_ENDORSEMENTS"  (cost=48.78..52.79 ROWS=1 width=8) (actual TIME=0.105..0.105 ROWS=0 loops=1803470)
          Recheck Cond: (("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID") AND ("TAG_ID" = 100000))
          FILTER: (NOT "IS_NEGATIVE")
          Buffers: shared hit=14470713
          ->  BitmapAnd  (cost=48.78..48.78 ROWS=1 width=0) (actual TIME=0.104..0.104 ROWS=0 loops=1803470)
                Buffers: shared hit=14293776
                ->  Bitmap INDEX Scan ON "fki_DOCTOR_ID4"  (cost=0.00..4.47 ROWS=25 width=0) (actual TIME=0.003..0.003 ROWS=4 loops=1803470)
                      INDEX Cond: ("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID")
                      Buffers: shared hit=5436669
                ->  Bitmap INDEX Scan ON "fki_TAG_ID4"  (cost=0.00..44.06 ROWS=1570 width=0) (actual TIME=0.550..0.550 ROWS=6339 loops=328041)
                      INDEX Cond: ("TAG_ID" = 100000)
                      Buffers: shared hit=8857107
  SubPlan 8
    ->  Bitmap Heap Scan ON "HISTORY_ENDORSEMENTS"  (cost=48.78..52.79 ROWS=1 width=8) (actual TIME=0.104..0.104 ROWS=0 loops=1803470)
          Recheck Cond: (("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID") AND ("TAG_ID" = 100000))
          FILTER: "IS_NEGATIVE"
          Buffers: shared hit=14470713
          ->  BitmapAnd  (cost=48.78..48.78 ROWS=1 width=0) (actual TIME=0.103..0.103 ROWS=0 loops=1803470)
                Buffers: shared hit=14293776
                ->  Bitmap INDEX Scan ON "fki_DOCTOR_ID4"  (cost=0.00..4.47 ROWS=25 width=0) (actual TIME=0.003..0.003 ROWS=4 loops=1803470)
                      INDEX Cond: ("DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID")
                      Buffers: shared hit=5436669
                ->  Bitmap INDEX Scan ON "fki_TAG_ID4"  (cost=0.00..44.06 ROWS=1570 width=0) (actual TIME=0.548..0.548 ROWS=6339 loops=328041)
                      INDEX Cond: ("TAG_ID" = 100000)
                      Buffers: shared hit=8857107
Total runtime: 1263300.012 ms
0
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
05.07.2022, 01:26
Цитата Сообщение от Slavianko Посмотреть сообщение
postgres 9.1
Блин... 9.1... Дальше можно даже не пытаться.
Эта версия уже лет как 10 наверно вышла из эксплуатации и поддержки.
Обновляйтесь, пытаться на ней что-то оптимизировать бесполезно.
Итак план и запрос раздутые, хотите миллион записей, а еще на 9.1.
Простите, не помогу.
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
09.07.2022, 08:56
LEFT JOIN "TAG_IDS" ON "TAGS"."TAG_ID"="TAG_IDS"."ID" - именование полей - просто жесть!

Четыре COUNT-а можно вынести в подзапросы, должно быть быстрее. Примерная идея (LEFT JOIN-ы не умею):

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
  (
    SELECT
      COUNT(*) AS cnt,
      "DOCTOR_ID",
      "TAG_ID",
      "IS_NEGATIVE"
    FROM
      "HISTORY_ENDORSEMENTS"
    GROUP BY
      "DOCTOR_ID",
      "TAG_ID",
      "IS_NEGATIVE"
  ) is_negative,
  (
    SELECT
      COUNT(*) AS cnt,
      "DOCTOR_ID",
      "IS_NEGATIVE"
    FROM
      "HISTORY_ENDORSEMENTS"
    WHERE
      "TAG_ID" = 100000
    GROUP BY
      "DOCTOR_ID",
      "IS_NEGATIVE"
  ) dummy_is_negative

Кликните здесь для просмотра всего текста
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
SELECT
  t."ID" AS tag_id,
  t."NAME" AS tag_name,
  t."DOCTOR_TYPE_ID" AS doctor_type_id,
  she."DOCTOR_ID" AS doctor_id,
  --"COUNTER_TAGS"."COUNTER" as counter,
 
  --array_agg("HISTORY_ENDORSEMENTS"."USER_ID") as user_id_array,
  --array_agg("USERS"."NAME") as user_name_array,
  --array_agg("HISTORY_ENDORSEMENTS"."PATIENT_NAME") as patient_name_array,
  --array_agg("HISTORY_ENDORSEMENTS"."IS_NEGATIVE") as is_negative_array,
 
  --(select count("IS_NEGATIVE") from "HISTORY_ENDORSEMENTS" where "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" and "TAG_ID" = "TAG_IDS"."ID" and "IS_NEGATIVE" = false) as is_negative_false,
  --(select count("IS_NEGATIVE") from "HISTORY_ENDORSEMENTS" where "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" and "TAG_ID" = "TAG_IDS"."ID" and "IS_NEGATIVE" = true) as is_negative_true,
  --(select count("TAG_ID") from "HISTORY_ENDORSEMENTS" where "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" and "TAG_ID" = 100000 and "IS_NEGATIVE" = false) as dummy_is_negative_false,
  --(select count("TAG_ID") from "HISTORY_ENDORSEMENTS" where "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" and "TAG_ID" = 100000 and "IS_NEGATIVE" = true) as dummy_is_negative_true,
  
  --(array_to_string (array(select "PATIENT_NAME" from "HISTORY_ENDORSEMENTS" where "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" and "TAG_ID" = 100000 and "IS_NEGATIVE" = false), ',')) AS patient_name_dummy_is_negative_false,
  --(array_to_string (array(select "PATIENT_NAME" from "HISTORY_ENDORSEMENTS" where "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" and "TAG_ID" = 100000 and "IS_NEGATIVE" = true), ',')) AS patient_name_dummy_is_negative_true,
  --(array_to_string (array(select "USER_ID" from "HISTORY_ENDORSEMENTS" where "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" and "TAG_ID" = 100000 and "IS_NEGATIVE" = false), ',')) AS user_id_dummy_is_negative_false,
  --(array_to_string (array(select "USER_ID" from "HISTORY_ENDORSEMENTS" where "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" and "TAG_ID" = 100000 and "IS_NEGATIVE" = true), ',')) AS user_id_dummy_is_negative_true
 
FROM
  "TAGS" t,
  "DOCTOR_TYPES" dt,
  "CLINIC_DOCTOR_SCHEDULE" she
  --LEFT JOIN "COUNTER_TAGS" ON "COUNTER_TAGS"."TAG_ID"="TAGS"."TAG_ID" and "COUNTER_TAGS"."DOCTOR_ID"="CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID"
-- LEFT JOIN "HISTORY_ENDORSEMENTS" ON "HISTORY_ENDORSEMENTS"."TAG_ID"="TAGS"."TAG_ID" AND "HISTORY_ENDORSEMENTS"."DOCTOR_ID"="CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID"
-- LEFT JOIN "USERS" ON "USERS"."ID"="HISTORY_ENDORSEMENTS"."USER_ID"
-- LEFT JOIN "TAG_IDS" ON "TAGS"."TAG_ID"="TAG_IDS"."ID"
  (
    SELECT
      COUNT(*) AS cnt,
      "DOCTOR_ID",
      "TAG_ID",
      "IS_NEGATIVE"
    FROM
      "HISTORY_ENDORSEMENTS"
    GROUP BY
      "DOCTOR_ID",
      "TAG_ID",
      "IS_NEGATIVE"
  ) is_negative,
  (
    SELECT
      COUNT(*) AS cnt,
      "DOCTOR_ID",
      "IS_NEGATIVE"
    FROM
      "HISTORY_ENDORSEMENTS"
    WHERE
      "TAG_ID" = 100000
    GROUP BY
      "DOCTOR_ID",
      "IS_NEGATIVE"
  ) dummy_is_negative
WHERE
    t."DOCTOR_TYPE_ID" = dt."DOCTOR_TYPE_ID"
AND dt."CLINIC_DOCTOR_ID" = she."ID"
GROUP BY
  tag_id,
  doctor_id,
  doctor_type_id,
  counter


Добавлено через 6 минут
Сейчас только заметил, что эти два подзапроса можно схлопнуть в один:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
(
    SELECT
      COUNT(*) AS cnt,
      "DOCTOR_ID",
      "TAG_ID",
      "IS_NEGATIVE"
    FROM
      "HISTORY_ENDORSEMENTS"
    GROUP BY
      "DOCTOR_ID",
      "TAG_ID",
      "IS_NEGATIVE"
  ) is_negative,
Добавлено через 9 минут
SQL
1
2
3
4
  (SELECT SUM(is_negative.cnt) FROM is_negative WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = "TAG_IDS"."ID" AND "IS_NEGATIVE" = FALSE) AS is_negative_false,
  (SELECT SUM(is_negative.cnt) FROM is_negative WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = "TAG_IDS"."ID" AND "IS_NEGATIVE" = TRUE) AS is_negative_true,
  (SELECT is_negative.cnt FROM is_negative WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = 100000 AND "IS_NEGATIVE" = FALSE) AS dummy_is_negative_false,
  (SELECT is_negative.cnt FROM is_negative WHERE "DOCTOR_ID" = "CLINIC_DOCTOR_SCHEDULE"."DOCTOR_ID" AND "TAG_ID" = 100000 AND "IS_NEGATIVE" = TRUE) AS dummy_is_negative_true,
Добавлено через 2 минуты
Можно даже вьюшку создать с тем подзапросом
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.07.2022, 08:56
Помогаю со студенческими работами здесь

Оптимизировать запрос
Всем здраствовать!!! Тут меня мой ребёночек озадачил и попросил помочь. У него на работе есть кажисть какая то БД типа - PostgreSQL ...

Оптимизировать запрос Update
Всем добрый день! Есть 2 таблички, и я пытаюсь обновить поле CreatedOn в одной таблице данными из другой следующим запросом: Update...

Как ускорить запрос выборки геоданных в PostgreSQL?
К примеру есть таблица адресов компаний из 3-х полей: company_id, lat, lon. Необходимо получить расстояния до ближайшего адреса каждой из...

Оптимизировать запрос в котором группируется большое кол-во данных
Запрос WITH ar AS( SELECT * FROM "ActualDocuments" WHERE "Account" =...

Запрос напрямую к PostgreSQL
Всем привет! Использую связку Access и PostgreSQL (лежит на MCS, в облаке короче). Подключил через ODBC нужные таблицы и столкнулся со...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru