powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с поризводительностью запроса.
25 сообщений из 33, страница 1 из 2
Помогите с поризводительностью запроса.
    #38980921
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!

Помогите плиз улучшить производительность запроса.
В таблице 38 573 строки, нет индексов.
В запросе таблица обращается на себя, для того, чтобы посчитать количество строк меньше и больше по определенному полю (rankZak).
Попытался улучшить следующим образом, но после выполнения 220-х секунд, остановил, такая скорость не устраивает.
Запрос работает правильно, проверял на маленьком срезе.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE portal.tempCorelation3 AS
SELECT nskv, nskvZ, rankGid, rankZak
  FROM portal.tempCorelation2;


SELECT t.nskv, 
       t.nskvZ, 
       t.d,
       t.alpha, 
       t.rankGid,
       t.rankZak,
       t.lx,
       t.ly,
       (SELECT COUNT(1) FROM portal.tempCorelation3 t1 WHERE t1.nskv = t.nskv AND t.nskvZ = t1.nskvZ AND t.rankGid < t1.rankGid AND t.rankZak < t1.rankZak) as Splus,
       (SELECT COUNT(1) FROM portal.tempCorelation3 t2 WHERE t2.nskv = t.nskv AND t.nskvZ = t2.nskvZ AND t.rankGid < t2.rankGid AND t.rankZak > t2.rankZak) as Sminus
  FROM portal.tempCorelation2 t;
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38980927
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok,

для начала попробовать добавить индекс по (nskv, nskvZ) в таблице tempCorelation3, если не поможет - привести explain analyze запроса.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38980935
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexiusvadipok,

для начала попробовать добавить индекс по (nskv, nskvZ) в таблице tempCorelation3, если не поможет - привести explain analyze запроса.

Эти таблицы только на одно использование, думаете есть смысл делать там индексы?
План запроса сейчас:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
"Seq Scan on tempcorelation2 t  (cost=0.00..78494834.22 rows=38573 width=52)"
"  SubPlan 1"
"    ->  Aggregate  (cost=1017.46..1017.47 rows=1 width=0)"
"          ->  Seq Scan on tempcorelation3 t1  (cost=0.00..1017.46 rows=1 width=0)"
"                Filter: ((t.rankgid < rankgid) AND (t.rankzak < rankzak) AND (nskv = t.nskv) AND (t.nskvz = nskvz))"
"  SubPlan 2"
"    ->  Aggregate  (cost=1017.46..1017.47 rows=1 width=0)"
"          ->  Seq Scan on tempcorelation3 t2  (cost=0.00..1017.46 rows=1 width=0)"
"                Filter: ((t.rankgid < rankgid) AND (t.rankzak > rankzak) AND (nskv = t.nskv) AND (t.nskvz = nskvz))"
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38980942
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokЭти таблицы только на одно использование, думаете есть смысл делать там индексы?


скорей всего да, но без данных сказать точно нельзя.
индекс на такой мелкой таблице создать очень быстро. проверьте и приведите explain analyze , если не поможет.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38980956
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokДобрый день, коллеги!

Помогите плиз улучшить производительность запроса.
В таблице 38 573 строки, нет индексов.
В запросе таблица обращается на себя, для того, чтобы посчитать количество строк меньше и больше по определенному полю (rankZak).
Попытался улучшить следующим образом, но после выполнения 220-х секунд, остановил, такая скорость не устраивает.
Запрос работает правильно, проверял на маленьком срезе.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE portal.tempCorelation3 AS
SELECT nskv, nskvZ, rankGid, rankZak
  FROM portal.tempCorelation2;


SELECT t.nskv, 
       t.nskvZ, 
       t.d,
       t.alpha, 
       t.rankGid,
       t.rankZak,
       t.lx,
       t.ly,
       (SELECT COUNT(1) FROM portal.tempCorelation3 t1 WHERE t1.nskv = t.nskv AND t.nskvZ = t1.nskvZ AND t.rankGid < t1.rankGid AND t.rankZak < t1.rankZak) as Splus,
       (SELECT COUNT(1) FROM portal.tempCorelation3 t2 WHERE t2.nskv = t.nskv AND t.nskvZ = t2.nskvZ AND t.rankGid < t2.rankGid AND t.rankZak > t2.rankZak) as Sminus
  FROM portal.tempCorelation2 t;


используй оконный каунт с ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38980986
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok,

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

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


скорей всего да, но без данных сказать точно нельзя.
индекс на такой мелкой таблице создать очень быстро. проверьте и приведите 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.
CREATE INDEX nskv_idx3 ON portal.tempCorelation3 (nskv);
CREATE INDEX nskvz_idx3 ON portal.tempCorelation3 (nskvZ);
CREATE INDEX nskv_idx2 ON portal.tempCorelation2 (nskv);
CREATE INDEX nskvz_idx2 ON portal.tempCorelation2 (nskvZ);


--так выполняется за 3 секунды
SELECT t.nskv, 
       t.nskvZ, 
       t.d,
       t.alpha, 
       t.rankGid,
       t.rankZak,
       t.lx,
       t.ly,
       (SELECT COUNT(1) FROM portal.tempCorelation3 t1 WHERE t1.nskv = t.nskv AND t.nskvZ = t1.nskvZ AND t.rankGid < t1.rankGid AND t.rankZak < t1.rankZak) as Splus,
       (SELECT COUNT(1) FROM portal.tempCorelation3 t2 WHERE t2.nskv = t.nskv AND t.nskvZ = t2.nskvZ AND t.rankGid < t2.rankGid AND t.rankZak > t2.rankZak) as Sminus
  FROM portal.tempCorelation2 t;


--так выполняется за 2 секунды
  SELECT t.nskv, 
       t.nskvZ, 
       t.d,
       t.alpha, 
       t.rankGid,
       t.rankZak,
       t.lx,
       t.ly,
       (SELECT COUNT(1) FROM portal.tempCorelation2 t1 WHERE t1.nskv = t.nskv AND t.nskvZ = t1.nskvZ AND t.rankGid < t1.rankGid AND t.rankZak < t1.rankZak) as Splus,
       (SELECT COUNT(1) FROM portal.tempCorelation2 t2 WHERE t2.nskv = t.nskv AND t.nskvZ = t2.nskvZ AND t.rankGid < t2.rankGid AND t.rankZak > t2.rankZak) as Sminus
  FROM portal.tempCorelation2 t;
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981061
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok,

если исключить коррелированные подзапросы из предложения Select и заменить их на оконные функции, как предлагал Ivan Durak, возможно, будет ещё быстрее
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981062
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durak,

Приведите пожалуйста пример. Чет не догоняю.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981064
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаvadipok,

если исключить коррелированные подзапросы из предложения Select и заменить их на оконные функции, как предлагал Ivan Durak, возможно, будет ещё быстрее

Спасибо Аня, приведите плиз пример.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981066
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokIvan Durak,

Приведите пожалуйста пример. Чет не догоняю.приведите тестовый набор данных, пригодный к использованию...
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981073
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

Если вы имеете в виду сделать так
Код: sql
1.
2.
COUNT(1) OVER (PARTITION BY t.nskv, t.nskvZ ORDER BY t.rankGid ASK, t.rankZak ASC) as Splus,
COUNT(1) OVER (PARTITION BY t.nskv, t.nskvZ ORDER BY t.rankGid ASK, t.rankZak DESC) as Splus


то я это по пробовал в первую очередь, результаты возвращает не то что мне надо.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981082
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

nskv nskvz gid zak rankgid lx rankzak ly d alpha"1018""14096"3.0967741935483923.38762214983712.000000000000000011.000000000000000000001777106"1018""14096"3.7096774193548428.16239316239327.000000000000000012.00000000000000001777106"1018""14096"3.5389610389610428.86666666666673.000000000000000013.00000000000000001777106"1018""14096"5.129.514563106796111.000000000000000014.00000000000000001777106"1018""14096"5.0196078431372532.622950819672110.000000000000000015.00000000000000001777106"1018""14096"3.6774193548387132.81553398058255.000000000000000016.00000000000000001777106"1018""14096"3.5598705501618133.72180451127824.000000000000000017.00000000000000001777106"1018""14096"3.701298701298743.74233128834366.000000000000000018.00000000000000001777106"1018""14096"3.724832214765145.06944444444448.000000000000000019.00000000000000001777106"1018""14096"5.225806451612945.482456140350912.0000000000000000110.00000000000000001777106"1018""14096"2.3529411764705955.64935064935071.00000000000000000000111.00000000000000001777106"1018""14096"3.7333333333333358.71559633027529.0000000000000000112.00000000000000001777106"1018""18963"3.7096774193548423.9069767441866.000000000000000011.00000000000000000000127834"1018""18963"5.225806451612928.11059907834111.000000000000000012.0000000000000000127834"1018""18963"5.130.87378640776710.000000000000000013.0000000000000000127834"1018""18963"3.5389610389610432.23826714801443.000000000000000014.0000000000000000127834"1018""18963"3.701298701298736.38036809815955.000000000000000015.0000000000000000127834"1018""18963"3.5598705501618137.66917293233084.000000000000000016.0000000000000000127834"1018""18963"2.3529411764705938.1595092024541.0000000000000000000017.0000000000000000127834"1018""18963"3.7333333333333339.08256880733948.000000000000000018.0000000000000000127834"1018""18963"5.0196078431372544.64406779661029.000000000000000019.0000000000000000127834"1018""18963"3.724832214765153.15972222222227.0000000000000000110.0000000000000000127834
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981093
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokЩукина Анна,

Если вы имеете в виду сделать так
Код: sql
1.
2.
COUNT(1) OVER (PARTITION BY t.nskv, t.nskvZ ORDER BY t.rankGid ASK, t.rankZak ASC) as Splus,
COUNT(1) OVER (PARTITION BY t.nskv, t.nskvZ ORDER BY t.rankGid ASK, t.rankZak DESC) as Splus


то я это по пробовал в первую очередь, результаты возвращает не то что мне надо.вам, скорее всего, нужна была функция DENSE_RANK() OVER(), а не COUNT() OVER()
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981121
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

По пробовал все методы, правильно работает только мой. Или я что-то не так делаю
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT t.nskv, 
       t.nskvZ, 
       t.gid,
       t.zak,
       (SELECT COUNT(1) FROM portal.tempCorelation2 t1 WHERE t1.nskv = t.nskv AND t.nskvZ = t1.nskvZ AND t.rankGid < t1.rankGid AND t.rankZak < t1.rankZak) as Splus,
       (SELECT COUNT(1) FROM portal.tempCorelation2 t2 WHERE t2.nskv = t.nskv AND t.nskvZ = t2.nskvZ AND t.rankGid < t2.rankGid AND t.rankZak > t2.rankZak) as Sminus,
       RANK() OVER (PARTITION BY t.nskv, t.nskvZ ORDER BY t.rankGid, t.rankZak) as a,
       DENSE_RANK() OVER (PARTITION BY t.nskv, t.nskvZ ORDER BY t.rankGid, t.rankZak) as b,
       COUNT(1) OVER (PARTITION BY t.nskv, t.nskvZ ORDER BY t.rankGid ASC, t.rankZak ASC) as c,
       COUNT(1) OVER (PARTITION BY t.nskv, t.nskvZ ORDER BY t.rankGid ASC, t.rankZak DESC) as e
  FROM portal.tempCorelation2 t
 ORDER BY t.nskv,
          t.nskvZ,
          t.gid,
          t.zak




nskv nskvz gid zak Splus Sminus a b c e"1018""14096"2.3529411764705955.64935064935071101111"1018""14096"3.0967741935483923.38762214983711002222"1018""14096"3.5389610389610428.8666666666667813333"1018""14096"3.5598705501618133.7218045112782444444"1018""14096"3.6774193548387132.8155339805825435555"1018""14096"3.701298701298743.7423312883436336666"1018""14096"3.7096774193548428.1623931623932507777"1018""14096"3.724832214765145.0694444444444228888"1018""14096"3.7333333333333358.7155963302752039999"1018""14096"5.0196078431372532.62295081967211110101010"1018""14096"5.129.51456310679611011111111"1018""14096"5.225806451612945.48245614035090012121212"1018""18963"2.3529411764705938.159509202454461111"1018""18963"3.0967741935483955.5048859934853092222
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981128
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом примере тоже видно, что он работает не так, как мне надо.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981162
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok,

там выше еще были магические слова ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

но имхо профита тут от оконных функций на такой мелкой таблице будет немного.

и кстати я предлагал сделать один индекс по (nskv, nskvZ), а раздельные.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981165
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok В этом примере тоже видно, что он работает не так, как мне надо.

Hm вы меня заинтересовали.
Через полчасика попробую понять решается это через window functions или нет.


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981211
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokдапочему бы не сократить время получения результата отказавшись от переливания в промежуточную таблицу?
Что же касаемо условия строго меньше на два поля, то оно выглядит странно - не соответствует последовательному ранжированию order by и вероятно ошибочно.
Кроме того, не понятно, нужно ли ранжирование rows или range, которое неприменимо для двух полей.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981271
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokЩукина Анна,

nskv nskvz gid zak rankgid lx rankzak ly d alpha

Код: 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.
WITH t (nskv, nskvz, gid, zak, rankgid, lx, rankzak, ly, d, alpha) AS (VALUES
('1018','14096',3.09677419354839,23.3876221498371,2.0000000000000000,1,1.00000000000000000000,1,777,106)
,('1018','14096',3.70967741935484,28.1623931623932,7.0000000000000000,1,2.0000000000000000,1,777,106)
,('1018','14096',3.53896103896104,28.8666666666667,3.0000000000000000,1,3.0000000000000000,1,777,106)
,('1018','14096',5.1,29.5145631067961,11.0000000000000000,1,4.0000000000000000,1,777,106)
,('1018','14096',5.01960784313725,32.6229508196721,10.0000000000000000,1,5.0000000000000000,1,777,106)
,('1018','14096',3.67741935483871,32.8155339805825,5.0000000000000000,1,6.0000000000000000,1,777,106)
,('1018','14096',3.55987055016181,33.7218045112782,4.0000000000000000,1,7.0000000000000000,1,777,106)
,('1018','14096',3.7012987012987,43.7423312883436,6.0000000000000000,1,8.0000000000000000,1,777,106)
,('1018','14096',3.7248322147651,45.0694444444444,8.0000000000000000,1,9.0000000000000000,1,777,106)
,('1018','14096',5.2258064516129,45.4824561403509,12.0000000000000000,1,10.0000000000000000,1,777,106)
,('1018','14096',2.35294117647059,55.6493506493507,1.00000000000000000000,1,11.0000000000000000,1,777,106)
,('1018','14096',3.73333333333333,58.7155963302752,9.0000000000000000,1,12.0000000000000000,1,777,106)
,('1018','18963',3.70967741935484,23.906976744186,6.0000000000000000,1,1.00000000000000000000,1,278,34)
,('1018','18963',5.2258064516129,28.110599078341,11.0000000000000000,1,2.0000000000000000,1,278,34)
,('1018','18963',5.1,30.873786407767,10.0000000000000000,1,3.0000000000000000,1,278,34)
,('1018','18963',3.53896103896104,32.2382671480144,3.0000000000000000,1,4.0000000000000000,1,278,34)
,('1018','18963',3.7012987012987,36.3803680981595,5.0000000000000000,1,5.0000000000000000,1,278,34)
,('1018','18963',3.55987055016181,37.6691729323308,4.0000000000000000,1,6.0000000000000000,1,278,34)
,('1018','18963',2.35294117647059,38.159509202454,1.00000000000000000000,1,7.0000000000000000,1,278,34)
,('1018','18963',3.73333333333333,39.0825688073394,8.0000000000000000,1,8.0000000000000000,1,278,34)
,('1018','18963',5.01960784313725,44.6440677966102,9.0000000000000000,1,9.0000000000000000,1,278,34)
,('1018','18963',3.7248322147651,53.1597222222222,7.0000000000000000,1,10.0000000000000000,1,278,34)
)
SELECT * FROM t;



-- кактотак
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981279
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok В этом примере тоже видно, что он работает не так, как мне надо.

В общем решение задачи через window functions сводится к придумыванию такой order by конструкции которая бы соответствовала сортировке по t.rankGid < t1.rankGid AND t.rankZak < t1.rankZak
Забавно вроде и простая задача но в лоб пока не решается.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981299
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Bogukvadipok В этом примере тоже видно, что он работает не так, как мне надо.

В общем решение задачи через window functions сводится к придумыванию такой order by конструкции которая бы соответствовала сортировке по t.rankGid < t1.rankGid AND t.rankZak < t1.rankZak
Забавно вроде и простая задача но в лоб пока не решается.

--
Maxim Boguk
www.postgresql-consulting.ru

Боюсь вы его не решите, по той простой причине, что там не считаются ранги, а СЧИТАЮТСЯ ЗНАЧЕНИЯ которые находятся НИЖЕ, и которые в первым случае БОЛЬШЕ, а во втором МЕНЬШЕ.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981304
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увы... не решается задача через WINDOW FUNCTIONS просто потому что набор условий в подзапросе не задает реализуемое условие сортировки.
Так как вот для 2х пар: rankGid rankZak
p1(1,2) и p2(2,1) нельзя сказать что по условию которое в подзапросе что p1>p2 и так же нельзя сказать что p2>p1
и при этом они не равны. А значит отсортировать невозможно а значит COUNT(*) на оконную функцию не заменяется.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981308
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.vadipokдапочему бы не сократить время получения результата отказавшись от переливания в промежуточную таблицу?
Что же касаемо условия строго меньше на два поля, то оно выглядит странно - не соответствует последовательному ранжированию order by и вероятно ошибочно.
Кроме того, не понятно, нужно ли ранжирование rows или range, которое неприменимо для двух полей.

Если будут ошибки, то их же еще править надо.
Боюсь потом будет не читабельно, и так слишком сложно получается:
Код: 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.
-- Function: portal.corelation(integer, date, date)

-- DROP FUNCTION portal.corelation(integer, date, date);

CREATE OR REPLACE FUNCTION portal.corelation(
    radius integer,
    startdate date,
    enddate date)
  RETURNS integer AS
$BODY$
DECLARE
    return_code integer := 1;
BEGIN
        DROP TABLE portal.Corelation;

	CREATE TABLE portal.tempCorelation AS
	WITH temp(nskv, gid, zak, Dat, Gor, X, Y) AS (
		SELECT TRIM(LTRIM(a.nskv, '0')) as nskv,
		       a.Gid/a.Dni as gid,
		       a.Zak/a.Dni as zak,
		       a.Dat,
		       a.Gor,
		       b.X,
		       b.Y
		  FROM portal.abdr a
		       INNER JOIN portal.abdadr b ON TRIM(LTRIM(b.nskv, '0')) = TRIM(LTRIM(a.nskv, '0'))
		 WHERE a.Dat between startdate AND enddate
		       AND a.Dni != 0)
	SELECT d.nskv, 
	       z.nskv as nskvZ, 
	       d.gid, 
	       z.zak, 
	       TRUNC(SQRT((d.x-z.x)*(d.x-z.x)+(d.y-z.y)*(d.y-z.y))) as d,
	       TRUNC(ACOS((z.x-d.x)/(SQRT((z.x-d.x)*(z.x-d.x)+(z.y-d.y)*(z.y-d.y))))*180/PI())+(CASE WHEN (z.y-d.y) < 0 THEN 180 ELSE 0 END) as alpha
	  FROM temp d,
	       temp z 
	 WHERE (d.x-z.x)*(d.x-z.x)+(d.y-z.y)*(d.y-z.y) between 1 and radius*radius
	       AND d.Dat = z.Dat
	       AND d.Gor = z.Gor
	       AND exists (SELECT 1 FROM portal.abddobg d1 WHERE d.nskv = TRIM(LTRIM(d1.nskv, '0')))
	       AND exists (SELECT 1 FROM portal.abdzak z1 WHERE z.nskv = TRIM(LTRIM(z1.nskv, '0')))
	       AND d.gid > 0
	       AND z.zak > 0
	ORDER BY d.nskv, z.nskv;

	CREATE INDEX nskv_idx1 ON portal.tempCorelation (nskv, nskvZ);

	CREATE TABLE portal.tempCorelation2 AS
	SELECT t.nskv, 
	       t.nskvZ, 
	       t.gid, 
	       t.zak, 
	       avg(t.numGid) OVER (PARTITION BY t.nskv, t.nskvZ, t.rankGid) as rankGid,
	       count(1) OVER (PARTITION BY t.nskv, t.nskvZ, t.gid) as lx,
	       avg(t.numZak) OVER (PARTITION BY t.nskv, t.nskvZ, t.rankZak) as rankZak,
	       count(1) OVER (PARTITION BY t.nskv, t.nskvZ, t.zak) as ly,
	       t.d,
	       t.alpha
	  FROM (SELECT *,
		       row_number() OVER (PARTITION BY nskv, nskvZ ORDER BY gid) as numGid,
		       rank() OVER (PARTITION BY nskv, nskvZ ORDER BY gid) as rankGid,
		       row_number() OVER (PARTITION BY nskvZ, nskv ORDER BY zak) as numZak,
		       rank() OVER (PARTITION BY nskv, nskvZ ORDER BY zak) as rankZak
		  FROM portal.tempCorelation) t
	ORDER BY t.nskv, 
		 t.nskvZ;

	CREATE INDEX nskv_idx2 ON portal.tempCorelation2 (nskv, nskvZ);

	CREATE TABLE portal.Corelation AS
	SELECT nskv, nskvZ, d, alpha, 
	       1-6*g2/(nSpirmen-0.5*T) as Spirmen,
	       (sumPlus-sumMinus)/(0.5*SQRT((n*(n-1)-Tx)*(n*(n-1)-Ty))) as Kandel
	  FROM (SELECT t.nskv, 
		       t.nskvZ, 
		       t.d,
		       t.alpha, 
		       Tx,
		       Ty,
		       t.maxCount*(t.maxCount*t.maxCount-1) as nSpirmen,
		       t.maxCount as n, 
		       SUM((t.rankGid-t.rankZak)*(t.rankGid-t.rankZak)) as g2,
		       SUM((t.lx*t.lx*t.lx-t.lx) + (t.ly*t.ly*t.ly-ly)) as T,
		       SUM(t.Splus) as sumPlus, 
		       SUM(t.Sminus) as sumMinus
		  FROM (SELECT t.nskv, 
			       t.nskvZ, 
			       t.d,
			       t.alpha, 
			       count(1) OVER (PARTITION BY t.nskv, t.nskvZ) as maxCount,
			       t.rankGid,
			       t.rankZak,
			       t.lx,
			       t.ly,
			       (SELECT COUNT(1) FROM portal.tempCorelation2 t1 WHERE t1.nskv = t.nskv AND t.nskvZ = t1.nskvZ AND t.rankGid < t1.rankGid AND t.rankZak < t1.rankZak) as Splus,
			       (SELECT COUNT(1) FROM portal.tempCorelation2 t2 WHERE t2.nskv = t.nskv AND t.nskvZ = t2.nskvZ AND t.rankGid < t2.rankGid AND t.rankZak > t2.rankZak) as Sminus,
			       SUM(t.lx-1) OVER (PARTITION BY t.nskv, t.nskvZ) as Tx,
			       SUM(t.ly-1) OVER (PARTITION BY t.nskv, t.nskvZ) as Ty
			  FROM portal.tempCorelation2 t) t
		GROUP BY t.nskv, t.nskvZ, t.d, t.alpha, t.maxCount, Tx, Ty) t
	WHERE (nSpirmen-0.5*T) != 0
	      AND (n*(n-1)-Tx)*(n*(n-1)-Ty) != 0;

	DROP TABLE portal.tempCorelation;
	DROP TABLE portal.tempCorelation2;

    RETURN return_code;
    
    EXCEPTION WHEN OTHERS THEN
         -- This should capture everything
        RAISE EXCEPTION 'Couldn t figure what to do with the error';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION portal.corelation(integer, date, date)
  OWNER TO postgres;

...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с поризводительностью запроса.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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