powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите оптимизировать запрос, пожалуйста
25 сообщений из 57, страница 2 из 3
помогите оптимизировать запрос, пожалуйста
    #34860938
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pjatachokой, забыл в запросе написать GROUP BY l.link_id, T2.T2cgssn, T2.T2cdssn, T2.mtype, m.ni, m.opc, m.dpc;да, точно, ведь требуемая группировка не совпадает с T2. (в первом запросе нужная группировка совпадала с T1)

pjatachokосталось почитать материал по составлению триггеровбудете поддерживать таблицы T1, T2 триггерами? скорость изменения данных конечно упадет. (вопрос(ы) по триггерам задавайте в новой теме:)

pjatachokЗЫ думаю мне пора проставляться))) жаль не в москве живуничего, научно-технический прогресс научится таки когда-нибудь отправлять пиво на мыло :)
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34875477
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat(вопрос(ы) по триггерам задавайте в новой теме:)

я все же задам здесь, дабы там не описывать вновь таблицы T1 и T2
LeXa NalBat, может Вы знаете как обойти проблему:
пытаюсь создать триггер для T2:

create function updateT2() returns opaque as '
DECLARE
T2record record;
SCCPrecord record;
begin
SELECT cgssn, cdssn INTO SCCPrecord
FROM sccp_addr
WHERE new.sccp_addr_id = sccp_addr.sccp_addr_id;

SELECT * INTO T2record
FROM T2
WHERE T2time_id = new.time_id
AND T2mtp_addr_id = new.mtp_addr_id
AND T2link_addr_id = new.link_addr_id
AND T2mtype = new.mtype
AND T2cgssn = SCCPrecord.cgssn
AND T2cdssn = SCCPrecord.cdssn
if (not found)
then
INSERT INTO T2 (T2time_id, T2mtp_addr_id, T2link_addr_id, T2mtype, T2cgssn, T2cdssn, T2cnt)
VALUES (new.time_id, new.mtp_addr_id, new.link_addr_id, new.mtype, SCCPrecord.cgssn, SCCPrecord.cdssn, new.count);
else
UPDATE T2 SET T2cnt = T2cnt + new.count
WHERE T2time_id = new.time_id
AND T2mtp_addr_id = new.mtp_addr_id
AND T2link_addr_id = new.link_addr_id
AND T2mtype = new.mtype
AND T2cgssn = SCCPrecord.cgssn
AND T2cdssn = SCCPrecord.cdssn
end if;

return NULL;
end;
' language 'plpgsql';

create trigger updateT1 after insert on sccp_msg_stat
for each row execute procedure UpdateT2();


но проблема в том что
ERROR: INTO specified more than once
CONTEXT: compile of PL/pgSQL function "updatet2" near line 19

можно ли как-то выбрать и сохранить значения cgssn, cdssn без применения INTO? или нужно как-то перестраивать триггер?
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34875591
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pjatachok create function updateT2() returns opaque as '
DECLARE
T2record record;
SCCPrecord record;
вы еще забыли тег . попробуйте применить его.


если же серьезно, то скрипт желательно выжелять тегом
[src]
или (если хотите вставить свою подсветку)
[FIX]
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34875677
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4321 pjatachok create function updateT2() returns opaque as '
DECLARE
T2record record;
SCCPrecord record;
вы еще забыли тег . попробуйте применить его.


если же серьезно, то скрипт желательно выжелять тегом
src
или (если хотите вставить свою подсветку)
FIX

понял, выполнил:

пытаюсь создать триггер для T2:
Код: plaintext
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.
create function updateT2() returns opaque as '
DECLARE
T2record record;
SCCPrecord record;
begin
SELECT cgssn, cdssn INTO SCCPrecord
FROM sccp_addr
WHERE new.sccp_addr_id = sccp_addr.sccp_addr_id;

SELECT * INTO T2record
FROM T2
WHERE T2time_id = new.time_id
AND T2mtp_addr_id = new.mtp_addr_id
AND T2link_addr_id = new.link_addr_id
AND T2mtype = new.mtype
AND T2cgssn = SCCPrecord.cgssn
AND T2cdssn = SCCPrecord.cdssn
if (not found)
then
INSERT INTO T2 (T2time_id, T2mtp_addr_id, T2link_addr_id, T2mtype, T2cgssn, T2cdssn, T2cnt)
VALUES (new.time_id, new.mtp_addr_id, new.link_addr_id, new.mtype, SCCPrecord.cgssn, SCCPrecord.cdssn, new.count);
else
UPDATE T2 SET T2cnt = T2cnt + new.count
WHERE T2time_id = new.time_id
AND T2mtp_addr_id = new.mtp_addr_id
AND T2link_addr_id = new.link_addr_id
AND T2mtype = new.mtype
AND T2cgssn = SCCPrecord.cgssn
AND T2cdssn = SCCPrecord.cdssn
end if;

return NULL;
end;
' language 'plpgsql';

create trigger updateT1 after insert on sccp_msg_stat
for each row execute procedure UpdateT2();

но проблема в том что
ERROR: INTO specified more than once
CONTEXT: compile of PL/pgSQL function "updatet2" near line 19

можно ли как-то выбрать и сохранить значения cgssn, cdssn без применения INTO? или нужно как-то перестраивать триггер?
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34875708
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"не вникая какой в том прок, что за том в руках и о чем глава" (с)
pjatachok 4321 pjatachok create function updateT2() returns opaque as '
DECLARE
T2record record;
SCCPrecord record;
вы еще забыли тег . попробуйте применить его.


если же серьезно, то скрипт желательно выжелять тегом
src
или (если хотите вставить свою подсветку)
FIX

понял, выполнил:

пытаюсь создать триггер для T2:
Код: plaintext
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.
create function updateT2() returns opaque as '
DECLARE
T2record record;
SCCPrecord record;
begin
SELECT cgssn, cdssn INTO SCCPrecord
FROM sccp_addr
WHERE new.sccp_addr_id = sccp_addr.sccp_addr_id;

SELECT * INTO T2record
FROM T2
WHERE T2time_id = new.time_id
AND T2mtp_addr_id = new.mtp_addr_id
AND T2link_addr_id = new.link_addr_id
AND T2mtype = new.mtype
AND T2cgssn = SCCPrecord.cgssn
AND T2cdssn = SCCPrecord.cdssn
-- А КТО SELECT будет завершать!!! ;;;;;;
if (not found)
then
INSERT INTO T2 (T2time_id, T2mtp_addr_id, T2link_addr_id, T2mtype, T2cgssn, T2cdssn, T2cnt)
VALUES (new.time_id, new.mtp_addr_id, new.link_addr_id, new.mtype, SCCPrecord.cgssn, SCCPrecord.cdssn, new.count);
else
UPDATE T2 SET T2cnt = T2cnt + new.count
WHERE T2time_id = new.time_id
AND T2mtp_addr_id = new.mtp_addr_id
AND T2link_addr_id = new.link_addr_id
AND T2mtype = new.mtype
AND T2cgssn = SCCPrecord.cgssn
AND T2cdssn = SCCPrecord.cdssn
end if;

return NULL;
end;
' language 'plpgsql';

create trigger updateT1 after insert on sccp_msg_stat
for each row execute procedure UpdateT2();

но проблема в том что
ERROR: INTO specified more than once
CONTEXT: compile of PL/pgSQL function "updatet2" near line 19

можно ли как-то выбрать и сохранить значения cgssn, cdssn без применения INTO? или нужно как-то перестраивать триггер?
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34875721
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"не вникая какой в том прок, что за том в руках и о чем глава" (с)
pjatachok 4321 pjatachok create function updateT2() returns opaque as '
DECLARE
T2record record;
SCCPrecord record;
вы еще забыли тег . попробуйте применить его.


если же серьезно, то скрипт желательно выжелять тегом
src
или (если хотите вставить свою подсветку)
FIX

понял, выполнил:

пытаюсь создать триггер для T2:
Код: plaintext
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.
create function updateT2() returns opaque as $$
DECLARE
T2record record;
SCCPrecord record;
begin
SELECT cgssn, cdssn INTO SCCPrecord
FROM sccp_addr
WHERE new.sccp_addr_id = sccp_addr.sccp_addr_id;

SELECT * INTO T2record
FROM T2
WHERE T2time_id = new.time_id
AND T2mtp_addr_id = new.mtp_addr_id
AND T2link_addr_id = new.link_addr_id
AND T2mtype = new.mtype
AND T2cgssn = SCCPrecord.cgssn
AND T2cdssn = SCCPrecord.cdssn
-- А КТО SELECT будет завершать!!! ;;;;;;
if (not found)
then
INSERT INTO T2 (T2time_id, T2mtp_addr_id, T2link_addr_id, T2mtype, T2cgssn, T2cdssn, T2cnt)
VALUES (new.time_id, new.mtp_addr_id, new.link_addr_id, new.mtype, SCCPrecord.cgssn, SCCPrecord.cdssn, new.count);
else
UPDATE T2 SET T2cnt = T2cnt + new.count
WHERE T2time_id = new.time_id
AND T2mtp_addr_id = new.mtp_addr_id
AND T2link_addr_id = new.link_addr_id
AND T2mtype = new.mtype
AND T2cgssn = SCCPrecord.cgssn
AND T2cdssn = SCCPrecord.cdssn
end if;

return NULL;
end;
$$ language 'plpgsql';

create trigger updateT1 after insert on sccp_msg_stat
for each row execute procedure UpdateT2();

но проблема в том что
ERROR: INTO specified more than once
CONTEXT: compile of PL/pgSQL function "updatet2" near line 19

можно ли как-то выбрать и сохранить значения cgssn, cdssn без применения INTO? или нужно как-то перестраивать триггер?
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34876029
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ооооо!!!!! 4321 , дико извиняюсь, забыл в конце селекта поставить ; )))))))
вопрос исчерпан
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34879057
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,
только что выяснилось что вместо запроса

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT l.link_id, s.cgssn, s.cdssn, i.mtype, m.ni, m.opc, m.dpc, SUM(i.count)
FROM sccp_msg_stat AS i, mtp_addr AS m, link_addr AS l, time_intervals_css7 AS t, sccp_addr AS s
WHERE t.time_id = i.time_id
AND m.mtp_addr_id = i.mtp_addr_id
AND l.link_addr_id = i.link_addr_id
AND i.sccp_addr_id = s.sccp_addr_id
AND ( t.btime BETWEEN '2007-7-1 0:0:0' AND '2007-10-8 0:0:0' )
AND ( t.etime BETWEEN '2007-7-1 0:0:0' AND '2007-10-8 0:0:0' )
AND link_id IN ( 'SL1804289383', 'SL336465782', 'SL35005211', 'SL521595368' )
GROUP BY i.mtype, l.link_id, s.cgssn, s.cdssn, m.ni,m.opc,m.dpc;

будеьт стоять запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT l.link_id, s.cgssn, s.cdssn, i.mtype, m.ni, m.opc, m.dpc, SUM(i.count)
FROM sccp_msg_stat AS i, mtp_addr AS m, link_addr AS l, time_intervals_css7 AS t, sccp_addr AS s
WHERE t.time_id = i.time_id
AND m.mtp_addr_id = i.mtp_addr_id
AND l.link_addr_id = i.link_addr_id
AND i.sccp_addr_id = s.sccp_addr_id
AND ( t.btime BETWEEN '2007-7-1 0:0:0' AND '2007-10-8 0:0:0' )
AND ( t.etime BETWEEN '2007-7-1 0:0:0' AND '2007-10-8 0:0:0' )
AND link_id IN ( 'SL1804289383', 'SL336465782', 'SL35005211', 'SL521595368' )

AND s.cgssn= 4  AND s.cdssn= 6  AND s.cgpa LIKE '????????' AND s.cdpa LIKE '????????'  //новое условие

GROUP BY i.mtype, l.link_id, s.cgssn, s.cdssn, m.ni,m.opc,m.dpc;

и в данном случае имея таблицу T2 ничего с s.cgpa LIKE '????????' AND s.cdpa LIKE '????????' похоже не сделать => таблица T2 в таком виде не годится(((( вместо '????????' будут стоять произвольные регулярные выражения....и что же делать?
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34879321
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pjatachok
Код: plaintext
1.
2.
SELECT ... s.cgssn, s.cdssn ...
WHERE ... s.cgssn= 4  AND s.cdssn= 6  ...
GROUP BY ... s.cgssn, s.cdssn ...
видимо s.cgssn, s.cdssn в SELECT и GROUP BY лишние. но на скорость это не влияет.

автор
Код: plaintext
1.
2.
3.
4.
distinct s.sccp_addr_id
 560339 

distinct s.cgssn, s.cdssn
 54 
чему равно distinct s.cgssn, s.cdssn, s.cgpa, s.cdpa?

если намного меньше, чем 560339, то можно добавить s.cgpa, s.cdpa в предварительную группировку при формировании таблицы T2.
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34880209
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AND s.cgssn=4 AND s.cdssn=6 AND s.cgpa LIKE '????????' AND s.cdpa LIKE '????????' - это опция, иногда это есть в запросе, иногда нет

LeXa NalBat чему равно distinct s.cgssn, s.cdssn, s.cgpa, s.cdpa?

Код: plaintext
1.
2.
3.
4.
select count(*) from ( select distinct s.cgssn, s.cdssn, s.cgpa, s.cdpa from sccp_addr AS s ) as t1;
 count
--------
  560340 
( 1  запись)

и кстати

Код: plaintext
1.
2.
3.
4.
select count(*) from sccp_addr;
 count
--------
  560340 
( 1  запись)
что логично так как эти 4 поля только и входят в sccp_addr кроме sccp_addr_id

других способов сокращения времени выборки нет?
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34880561
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажите explain analyze ... where ... s.cgpa LIKE '?1?' AND s.cdpa LIKE '?2?' ...

какая избирательность (селктивность) по условию s.cgpa LIKE '?1?' AND s.cdpa LIKE '?2?'? то есть чему равно select count(*) from sccp_addr AS s where s.cgpa LIKE '?1?' AND s.cdpa LIKE '?2?'.

параметры '?1?' и '?2?' сильно варьируемы, или например могут принимать несколько значений? они могут начинаться с '_' или '%'?
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34881216
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat, вместо любого знака вопроса в '???????' может быть любая цифра, то есть это будут значения вида
'_23_45__' (например, где _ - любой символ-цифра (regexp в postgresql))
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34885015
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pjatachokвместо любого знака вопроса в '???????' может быть любая цифра, то есть это будут значения вида
'_23_45__' (например, где _ - любой символ-цифра (regexp в postgresql))я правильно понял?
значения параметров в выражениях LIKE состоят из цифр и подчеркиваний, причем могут начинаться с подчеркивания?
например:
1234567
12__34_
__1__2_

explain analyze и count(*) покажите?
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34885365
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор
я правильно понял?
значения параметров в выражениях LIKE состоят из цифр и подчеркиваний, причем могут начинаться с подчеркивания?

LeXa NalBat , правильно

EXPLAIN ANALYSE SELECT m.ni, m.opc, m.dpc, l.link_id, s.cgssn, s.cdssn, i.mtype, SUM(i.count)
FROM sccp_msg_stat AS i, mtp_addr AS m, link_addr AS l, time_intervals_css7 AS t, sccp_addr AS s
WHERE t.time_id = i.time_id
AND m.mtp_addr_id = i.mtp_addr_id
AND l.link_addr_id = i.link_addr_id
AND i.sccp_addr_id = s.sccp_addr_id
AND ( t.btime BETWEEN '2007-7-1 0:0:0' AND '2007-8-31 0:0:0' )
AND ( t.etime BETWEEN '2007-7-1 0:0:0' AND '2007-8-31 0:0:0' )
AND link_id IN ( 'SL521595368', 'SL336465782', 'SL1804289383', 'SL35005211' )
AND s.cgssn=6 AND s.cdssn=7 AND s.cgpa LIKE '7:99______' AND s.cdpa LIKE '1:79______'
GROUP BY m.ni,m.opc,m.dpc, l.link_id, s.cgssn, s.cdssn, i.mtype;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
HashAggregate  (cost= 1165102 . 03 .. 1165102 . 04  rows= 1  width= 31 ) (actual time= 77560 . 080 .. 77560 . 095  rows= 14  loops= 1 )
   ->  Nested Loop  (cost= 16165 . 49 .. 1165101 . 77  rows= 13  width= 31 ) (actual time= 1077 . 697 .. 77559 . 041  rows= 197  loops= 1 )
         ->  Hash Join  (cost= 16165 . 49 .. 1165062 . 30  rows= 13  width= 35 ) (actual time= 1065 . 260 .. 77348 . 703  rows= 197  loops= 1 )
               Hash Cond: ("outer".link_addr_id = "inner".link_addr_id)
               ->  Hash Join  (cost= 16163 . 92 .. 1165060 . 13  rows= 94  width= 24 ) (actual time= 1045 . 014 .. 77327 . 862  rows= 197  loops= 1 )
                     Hash Cond: ("outer".mtp_addr_id = "inner".mtp_addr_id)
                     ->  Hash Join  (cost= 16161 . 78 .. 1165056 . 58  rows= 94  width= 22 ) (actual time= 1034 . 371 .. 77316 . 649  rows= 197  loops= 1 )
                           Hash Cond: ("outer".sccp_addr_id = "inner".sccp_addr_id)
                           ->  Seq Scan on sccp_msg_stat i  (cost= 0 . 00 .. 886548 . 24  rows= 52469124  width= 22 ) (actual time= 2 . 366 .. 50629 . 782  rows= 52469126  loops= 1 )
                           ->  Hash  (cost= 16161 . 78 .. 16161 . 78  rows= 1  width= 8 ) (actual time= 658 . 800 .. 658 . 800  rows= 26  loops= 1 )
                                 ->  Seq Scan on sccp_addr s  (cost= 0 . 00 .. 16161 . 78  rows= 1  width= 8 ) (actual time= 83 . 005 .. 658 . 684  rows= 26  loops= 1 )
                                       Filter: ((cgssn =  6 ) AND (cdssn =  7 ) AND ((cgpa)::text ~~ '7:99______'::text) AND ((cdpa)::text ~~ '1:79______'::text))
                     ->  Hash  (cost= 1 . 91 .. 1 . 91  rows= 91  width= 10 ) (actual time= 10 . 624 .. 10 . 624  rows= 92  loops= 1 )
                           ->  Seq Scan on mtp_addr m  (cost= 0 . 00 .. 1 . 91  rows= 91  width= 10 ) (actual time= 10 . 452 .. 10 . 541  rows= 92  loops= 1 )
               ->  Hash  (cost= 1 . 56 .. 1 . 56  rows= 4  width= 19 ) (actual time= 20 . 238 .. 20 . 238  rows= 4  loops= 1 )
                     ->  Seq Scan on link_addr l  (cost= 0 . 00 .. 1 . 56  rows= 4  width= 19 ) (actual time= 20 . 197 .. 20 . 227  rows= 4  loops= 1 )
                           Filter: (((link_id)::text = 'SL521595368'::text) OR ((link_id)::text = 'SL336465782'::text) OR ((link_id)::text = 'SL1804289383'::text) OR ((link_id)::text = 'SL35005211'::text))
         ->  Index Scan using time_intervals_css7_pk on time_intervals_css7 t  (cost= 0 . 00 .. 3 . 02  rows= 1  width= 4 ) (actual time= 1 . 062 .. 1 . 063  rows= 1  loops= 197 )
               Index Cond: (t.time_id = "outer".time_id)
               Filter: ((btime >= '2007-07-01 00:00:00+04'::timestamp with time zone) AND (btime <= '2007-08-31 00:00:00+04'::timestamp with time zone) AND (etime >= '2007-07-01 00:00:00+04'::timestamp with time zone) AND (etime <= '2007-08-31 00:00:00+04'::timestamp with time zone))
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34885441
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создать индекс на таблицу sccp_msg_stat по полю sccp_addr_id
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34885535
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBatсоздать индекс на таблицу sccp_msg_stat по полю sccp_addr_id
ну это понятно,
просто раньше в самом начале пытались уйти от таблицы sccp_msg_stat (52мл записи а теперь опять к ней возвращаемся)
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34885586
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pjatachok LeXa NalBatсоздать индекс на таблицу sccp_msg_stat по полю sccp_addr_idну это понятно,
просто раньше в самом начале пытались уйти от таблицы sccp_msg_stat (52мл записи а теперь опять к ней возвращаемся)ТОТ запрос оптимизировали введением дополнительной таблицы. ЭТОТ - построением нужного индекса. имхо, эти два запроса, отличающиеся казалось бы только "опцей, иногда это есть в запросе, иногда нет", на самом деле являются принципально разными в смысле эффективных планов выполнения.
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34885724
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat, ВАУ!!!!! выполняется после введения индекса за 800мс!!!!!!! ОГРОМНОЕ СПАСИБО ЕЩЕ РАЗ
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34885785
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а, это из кеша результаты взяты после повторения запроса....так выполняется где-то за 45сек..все же не 300сек, уже лучше
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34885810
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pjatachokа, это из кеша результаты взяты после повторения запроса....так выполняется где-то за 45сек..все же не 300сек, уже лучшепо плану NestedLoop( SeqScan(sccp_addr), IndexScan(sccp_msg_stat) ) должен выполняться около секунды. давайте explain analyze.
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34885971
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat pjatachokа, это из кеша результаты взяты после повторения запроса....так выполняется где-то за 45сек..все же не 300сек, уже лучшепо плану NestedLoop( SeqScan(sccp_addr), IndexScan(sccp_msg_stat) ) должен выполняться около секунды. давайте explain analyze.

ситуация:
выполнил несколько других запросов, в том числе "тяжелых", а потом
EXPLAIN ANALYSE SELECT m.ni, m.opc, m.dpc, l.link_id, s.cgssn, s.cdssn, i.mtype, SUM(i.count)
FROM sccp_msg_stat AS i, mtp_addr AS m, link_addr AS l, time_intervals_css7 AS t, sccp_addr AS s
WHERE t.time_id = i.time_id
AND m.mtp_addr_id = i.mtp_addr_id
AND l.link_addr_id = i.link_addr_id
AND i.sccp_addr_id = s.sccp_addr_id
AND ( t.btime BETWEEN '2007-7-1 0:0:0' AND '2007-8-31 0:0:0' )
AND ( t.etime BETWEEN '2007-7-1 0:0:0' AND '2007-8-31 0:0:0' )
AND link_id IN ( 'SL521595368', 'SL336465782', 'SL1804289383', 'SL35005211' )
AND s.cgssn=6 AND s.cdssn=7 AND s.cgpa LIKE '_:99______' AND s.cdpa LIKE '1:79______'
GROUP BY m.ni,m.opc,m.dpc, l.link_id, s.cgssn, s.cdssn, i.mtype;
результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 HashAggregate  (cost= 19084 . 06 .. 19084 . 07  rows= 1  width= 31 ) (actual time= 43217 . 227 .. 43217 . 244  rows= 16  loops= 1 )
   ->  Nested Loop  (cost= 5 . 42 .. 19083 . 80  rows= 13  width= 31 ) (actual time= 149 . 868 .. 43187 . 854  rows= 11278  loops= 1 )
         ->  Nested Loop  (cost= 5 . 42 .. 19044 . 46  rows= 13  width= 29 ) (actual time= 145 . 103 .. 43107 . 428  rows= 11278  loops= 1 )
               ->  Nested Loop  (cost= 5 . 42 .. 19004 . 99  rows= 13  width= 33 ) (actual time= 92 . 067 .. 42921 . 316  rows= 11278  loops= 1 )
                     Join Filter: ("inner".link_addr_id = "outer".link_addr_id)
                     ->  Nested Loop  (cost= 5 . 42 .. 18853 . 65  rows= 94  width= 22 ) (actual time= 92 . 025 .. 42513 . 388  rows= 11334  loops= 1 )
                           ->  Seq Scan on sccp_addr s  (cost= 0 . 00 .. 16161 . 78  rows= 1  width= 8 ) (actual time= 25 . 238 .. 1030 . 528  rows= 70  loops= 1 )
                                 Filter: ((cgssn =  6 ) AND (cdssn =  7 ) AND ((cgpa)::text ~~ '_:99______'::text) AND ((cdpa)::text ~~ '1:79______'::text))
                           ->  Bitmap Heap Scan on sccp_msg_stat i  (cost= 5 . 42 .. 2683 . 23  rows= 691  width= 22 ) (actual time= 25 . 555 .. 592 . 376  rows= 162  loops= 70 )
                                 Recheck Cond: (i.sccp_addr_id = "outer".sccp_addr_id)
                                 ->  Bitmap Index Scan on sccp_msg_stat_sccp_addr_id  (cost= 0 . 00 .. 5 . 42  rows= 691  width= 0 ) (actual time= 22 . 696 .. 22 . 696  rows= 162  loops= 70 )
                                       Index Cond: (i.sccp_addr_id = "outer".sccp_addr_id)
                     ->  Seq Scan on link_addr l  (cost= 0 . 00 .. 1 . 56  rows= 4  width= 19 ) (actual time= 0 . 003 .. 0 . 031  rows= 4  loops= 11334 )
                           Filter: (((link_id)::text = 'SL521595368'::text) OR ((link_id)::text = 'SL336465782'::text) OR ((link_id)::text = 'SL1804289383'::text) OR ((link_id)::text = 'SL35005211'::text))
               ->  Index Scan using time_intervals_css7_pk on time_intervals_css7 t  (cost= 0 . 00 .. 3 . 02  rows= 1  width= 4 ) (actual time= 0 . 013 .. 0 . 014  rows= 1  loops= 11278 )
                     Index Cond: (t.time_id = "outer".time_id)
                     Filter: ((btime >= '2007-07-01 00:00:00+04'::timestamp with time zone) AND (btime <= '2007-08-31 00:00:00+04'::timestamp with time zone) AND (etime >= '2007-07-01 00:00:00+04'::timestamp with time zone) AND (etime <= '2007-08-31 00:00:00+04'::timestamp with time zone))
         ->  Index Scan using mtp_addr_pk on mtp_addr m  (cost= 0 . 00 .. 3 . 01  rows= 1  width= 10 ) (actual time= 0 . 004 .. 0 . 005  rows= 1  loops= 11278 )
               Index Cond: (m.mtp_addr_id = "outer".mtp_addr_id)
 Total runtime:  43217 . 390  ms
(записей:  20 )


тут же сразу повторяю тот же запрос EXPLAIN ANALYSE и результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
HashAggregate  (cost= 19084 . 06 .. 19084 . 07  rows= 1  width= 31 ) (actual time= 909 . 227 .. 909 . 244  rows= 16  loops= 1 )
   ->  Nested Loop  (cost= 5 . 42 .. 19083 . 80  rows= 13  width= 31 ) (actual time= 5 . 677 .. 889 . 441  rows= 11278  loops= 1 )
         ->  Nested Loop  (cost= 5 . 42 .. 19044 . 46  rows= 13  width= 29 ) (actual time= 5 . 669 .. 825 . 657  rows= 11278  loops= 1 )
               ->  Nested Loop  (cost= 5 . 42 .. 19004 . 99  rows= 13  width= 33 ) (actual time= 5 . 654 .. 742 . 487  rows= 11278  loops= 1 )
                     Join Filter: ("inner".link_addr_id = "outer".link_addr_id)
                     ->  Nested Loop  (cost= 5 . 42 .. 18853 . 65  rows= 94  width= 22 ) (actual time= 5 . 621 .. 395 . 019  rows= 11334  loops= 1 )
                           ->  Seq Scan on sccp_addr s  (cost= 0 . 00 .. 16161 . 78  rows= 1  width= 8 ) (actual time= 5 . 123 .. 293 . 484  rows= 70  loops= 1 )
                                 Filter: ((cgssn =  6 ) AND (cdssn =  7 ) AND ((cgpa)::text ~~ '_:99______'::text) AND ((cdpa)::text ~~ '1:79______'::text))
                           ->  Bitmap Heap Scan on sccp_msg_stat i  (cost= 5 . 42 .. 2683 . 23  rows= 691  width= 22 ) (actual time= 0 . 131 .. 1 . 282  rows= 162  loops= 70 )
                                 Recheck Cond: (i.sccp_addr_id = "outer".sccp_addr_id)
                                 ->  Bitmap Index Scan on sccp_msg_stat_sccp_addr_id  (cost= 0 . 00 .. 5 . 42  rows= 691  width= 0 ) (actual time= 0 . 075 .. 0 . 075  rows= 162  loops= 70 )
                                       Index Cond: (i.sccp_addr_id = "outer".sccp_addr_id)
                     ->  Seq Scan on link_addr l  (cost= 0 . 00 .. 1 . 56  rows= 4  width= 19 ) (actual time= 0 . 002 .. 0 . 027  rows= 4  loops= 11334 )
                           Filter: (((link_id)::text = 'SL521595368'::text) OR ((link_id)::text = 'SL336465782'::text) OR ((link_id)::text = 'SL1804289383'::text) OR ((link_id)::text = 'SL35005211'::text))
               ->  Index Scan using time_intervals_css7_pk on time_intervals_css7 t  (cost= 0 . 00 .. 3 . 02  rows= 1  width= 4 ) (actual time= 0 . 005 .. 0 . 005  rows= 1  loops= 11278 )
                     Index Cond: (t.time_id = "outer".time_id)
                     Filter: ((btime >= '2007-07-01 00:00:00+04'::timestamp with time zone) AND (btime <= '2007-08-31 00:00:00+04'::timestamp with time zone) AND (etime >= '2007-07-01 00:00:00+04'::timestamp with time zone) AND (etime <= '2007-08-31 00:00:00+04'::timestamp with time zone))
         ->  Index Scan using mtp_addr_pk on mtp_addr m  (cost= 0 . 00 .. 3 . 01  rows= 1  width= 10 ) (actual time= 0 . 003 .. 0 . 003  rows= 1  loops= 11278 )
               Index Cond: (m.mtp_addr_id = "outer".mtp_addr_id)
 Total runtime:  909 . 399  ms
(записей:  20 )

вот так "прыгает" время выполнения запроса
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34886019
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, кэширование налицо. но в этом запросе с s.cgpa LIKE '_:99______' прочесывается в пять раз больше строк (11278), чем в предыдущем с s.cgpa LIKE '7:99______' (197).
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34888683
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat, итак, я понимаю, больше ничего нельзя сделать с этим запросом?
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34888811
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробовать "избыточную OLAP-like структуру"

например:

имеем таблицу t1 (f1 text)
12
13
23

надо ускорить запрос select count(*) from t1 where f1 like '_3';

поддерживаем триггерами таблицу t2 (f1 text, cnt integer)
12 1
_2 1
1_ 2
__ 3
13 1
_3 2
23 1
2_ 1

требуемый запрос эквивалентен быстрому select cnt from t2 where f1 = '_3'

однако при изменении одной строки в t1 надо будет в триггере изменить 2^(length(f1)) строк в t2
...
Рейтинг: 0 / 0
помогите оптимизировать запрос, пожалуйста
    #34902963
pjatachok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat, большое спасибо за предложение))))много для себя узнал на будущее)) однако в данном случае такое решение врядли применимо, поскольку как вы заметили число строк в новой таблице будет степенной функцией от числа строк в оригинальной) а их весьма много
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 2 из 3
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите оптимизировать запрос, пожалуйста
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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