SELECT sum(time_top) AS sum_top, sum(time_medium) AS sum_medium, sum(time_tail) AS sum_tail
FROM
(
SELECT CASE WHEN rn <= 20 THEN tt_percent ELSE 0 END AS time_top,
CASE WHEN rn > 20 AND rn <= 800 THEN tt_percent ELSE 0 END AS time_medium,
CASE WHEN rn > 800 THEN tt_percent ELSE 0 END AS time_tail
FROM (
SELECT total_time / (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query,
ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn
FROM pg_stat_statements
ORDER BY total_time DESC
) AS t
)
AS ts
Натиҷаи пурсиш се сутун аст, ки ҳар яки онҳо фоизи вақти коркарди дархостҳои ин гурӯҳро дар бар мегирад. Дар дохили дархост ду рақам мавҷуд аст (дар ҳолати ман он 20 ва 800 аст), ки дархостҳоро аз як гурӯҳ аз гурӯҳи дигар ҷудо мекунанд.
SELECT * FROM (
SELECT ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn, total_time / (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query
FROM pg_stat_statements
ORDER BY total_time DESC
) AS T
WHERE
rn <= 20 -- TOP
-- rn > 20 AND rn <= 800 -- MEDIUM
-- rn > 800 -- TAIL
Азнавсозии система, масалан, аз нав кор кардани мантиқи огоҳинома бо истифода аз брокери паём ба ҷои дархостҳои даврии пойгоҳи додаҳо
Илова ё тағир додани индексҳо
Навиштани дархостҳои ORM ба SQL-и пок
Навиштани танбали мантиқи боркунии маълумот
Кэшкунӣ тавассути ғайримуқаррарии маълумот. Масалан, мо пайвасти ҷадвал дорем Таҳвил -> Ҳисобнома -> Дархост -> Ариза. Яъне, ҳар як таҳвил бо барнома тавассути ҷадвалҳои дигар алоқаманд аст. Барои он ки ҳамаи ҷадвалҳоро дар ҳар як дархост пайваст накунем, мо истиноди дархостро дар ҷадвали таҳвил такрор кардем.
Кэшкунии ҷадвалҳои статикӣ бо китобҳои истинод ва кам иваз кардани ҷадвалҳо дар хотираи барнома.
Баъзан тағирот ба тарҳрезии таъсирбахш табдил ёфт, аммо онҳо 5-10% бори системаро таъмин мекарданд ва асоснок буданд. Бо мурури замон, ихроҷҳо хурдтар ва хурдтар шуданд ва аз нав тарҳрезии бештар ва ҷиддитар талаб карда шуд.
Баъд диккати худро ба гурУхи дуйуми дархостхо — гурухи дехконони миёна чалб намудем. Дар он саволҳои зиёде мавҷуданд ва ба назар чунин менамуд, ки барои таҳлили тамоми гурӯҳ вақти зиёд лозим аст. Бо вуҷуди ин, аксари дархостҳо барои оптимизатсия хеле содда буданд ва бисёр мушкилот даҳҳо маротиба дар вариантҳои гуногун такрор мешуданд. Инҳоянд мисолҳои баъзе оптимизатсияҳои маъмулӣ, ки мо ба даҳҳо дархостҳои шабеҳ татбиқ кардем ва ҳар як гурӯҳи дархостҳои оптимизатсияшуда пойгоҳи додаҳоро 3-5% холӣ карданд.
Ба ҷои тафтиши мавҷудияти сабтҳо бо истифода аз COUNT ва сканкунии пурраи ҷадвал, EXISTS истифода мешавад
Аз DISTINCT халос шуд (рецепт умумӣ вуҷуд надорад, аммо баъзан шумо метавонед бо 10-100 маротиба тезонидани дархост аз он халос шавед).
Масалан, ба ҷои дархост барои интихоби ҳамаи ронандагон аз ҷадвали калони интиқол (DELIVERY)
SELECT DISTINCT P.ID, P.FIRST_NAME, P.LAST_NAME
FROM DELIVERY D JOIN PERSON P ON D.DRIVER_ID = P.ID
дар ҷадвали нисбатан хурд PERSON дархост дод
SELECT P.ID, P.FIRST_NAME, P.LAST_NAME
FROM PERSON
WHERE EXISTS(SELECT D.ID FROM DELIVERY WHERE D.DRIVER_ID = P.ID)
Чунин ба назар мерасад, ки мо зерпурсити мутақобиларо истифода мебарем, аммо он суръатро беш аз 10 маротиба медиҳад.