IT-Academy

Načítanie tabuľky do vyrovnávacej pamäte

Aug 23rd, 2019
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. URL na aktualizované prezentácie + kniha: https://1drv.ms/u/s!AlrLrycbTQ1azqJfINoN_tzGyCVYoQ?e=kYRI55
  2.  
  3. -- Načítanie tabuľky do vyrovnávacej pamäte
  4.  
  5.  -- Vytvor tbl1
  6. CREATE TABLE tbl_ItemTransactions_1
  7.  (
  8.      TranID SERIAL
  9.      ,TransactionDate TIMESTAMPTZ
  10.      ,TransactionName TEXT
  11.  );
  12.  
  13.  -- Vloz data do tbl1
  14. INSERT INTO tbl_ItemTransactions_1
  15. (TransactionDate, TransactionName)
  16. SELECT x, 'dbrnd'
  17. FROM generate_series('2010-01-01 00:00:00'::timestamptz, '2018-02-01 00:00:00'::timestamptz,'1 minutes'::interval) a(x);
  18.  
  19.  -- Vytvor tbl2
  20. CREATE TABLE tbl_ItemTransactions_2
  21.  (
  22.      TranID SERIAL
  23.      ,TransactionDate TIMESTAMPTZ
  24.      ,TransactionName TEXT
  25.  );
  26.  
  27.  -- Vloz data do tbl2  
  28. INSERT INTO tbl_ItemTransactions_2
  29. (TransactionDate, TransactionName)
  30. SELECT x, 'dbrnd'
  31. FROM generate_series('2010-01-01 00:00:00'::timestamptz, '2018-02-01 00:00:00'::timestamptz,'1 minutes'::interval) a(x);
  32.  
  33. -- Nacitaj rozsirenie pg_prewarm    
  34. CREATE EXTENSION pg_prewarm;
  35.  
  36. -- Teraz použite na tabuľku tbl_ItemTransactions_1 prefetch pg_prewarm:
  37. SELECT pg_prewarm('tbl_ItemTransactions_1');
  38.  
  39. -- Analyzuj tb1
  40. EXPLAIN ANALYZE SELECT * FROM tbl_ItemTransactions_1;
  41.  
  42. Planning time: 0.130 ms
  43. Execution time: 356.237 ms
  44.  
  45. -- Analyzuj tb2
  46. EXPLAIN ANALYZE SELECT *FROM tbl_ItemTransactions_2;
  47.  
  48. Planning time: 0.210 ms
  49. Execution time: 752.010 ms
  50.  
  51.  
  52. -- 2.
  53. -- Kontrola stavu zdieľanej vyrovnávacej pamäte
  54.  
  55. -- Nacitaj rozsirenie pg_buffercache   
  56. CREATE EXTENSION pg_buffercache;
  57. Script to check the status of Shared Buffer:
  58.  
  59. -- Spustu dopyt pre kontrolu Shared Buffer:
  60. -- https://www.postgresql.org/docs/current/pgbuffercache.html#id-1.11.7.33.8
  61. SELECT
  62.     c.relname,
  63.     count(*) AS buffers
  64. FROM pg_buffercache b
  65. INNER JOIN pg_class c
  66.    ON b.relfilenode = pg_relation_filenode(c.oid)
  67.         AND b.reldatabase IN (0, (SELECT oid FROM pg_database
  68. WHERE datname = current_database()))
  69. GROUP BY c.relname
  70. ORDER BY 2 DESC;
  71.  
  72.  
  73. --3. Clear Cache a Session
  74.  
  75. -- Ako funguje DISCARD
  76. -- Pomocou DISCARD môžete uvoľniť interné zdroje databázových relácií.
  77. -- Zahodiť temp, plán dopytov bežiacich sessions.
  78.  
  79. SET SESSION AUTHORIZATION DEFAULT;
  80. RESET ALL;
  81. DEALLOCATE ALL;
  82. CLOSE ALL;
  83. UNLISTEN *;
  84. SELECT pg_advisory_unlock_all();
  85.  
  86. -- Uvoľniť všetky interné plány dotazov uložené v pamäti cache.
  87. -- Release all internal cached query plans
  88. DISCARD PLANS;
  89.  
  90. -- Zahodiť všetky dočasné tabuľky, ktoré sú vytvorené v aktuálnej relácii/session.
  91. DISCARD TEMP;
  92.  
  93. -- DISCARD ALL: Pomocou tohto môžete obnoviť pôvodnú reláciu. Tento príkaz nemôžete vykonať v rámci transakčného bloku.
  94.  
  95. -- 4. Nájdenie relácie/session, ktoré blokujú ďalšie relácie/sessions v PostgreSQL
  96.  
  97. -- Namiesto hľadania blokovaných relácií alebo procesov je niekedy lepšie nájsť tie relácie, ktoré sú základom blokovania.
  98. -- PostgreSQL DBA môže pomocou tohto skriptu nájsť príčinu blokovaných transakcií.
  99.  
  100. SELECT
  101.     pl.pid as blocked_pid
  102.     ,psa.usename as blocked_user
  103.     ,pl2.pid as blocking_pid
  104.     ,psa2.usename as blocking_user
  105.     ,psa.query as blocked_statement
  106. FROM pg_catalog.pg_locks pl
  107. JOIN pg_catalog.pg_stat_activity psa
  108.     ON pl.pid = psa.pid
  109. JOIN pg_catalog.pg_locks pl2
  110. JOIN pg_catalog.pg_stat_activity psa2
  111.     ON pl2.pid = psa2.pid
  112.     ON pl.transactionid = pl2.transactionid
  113.         AND pl.pid != pl2.pid
  114. WHERE NOT pl.granted;
  115.  
  116. --5. TOP 10 najdlhšie bežiacich dopytov pomocou pg_stat_statements
  117.  
  118. SELECT
  119.     pd.datname
  120.     ,pss.query AS SQLQuery
  121.     ,pss.rows AS TotalRowCount
  122.     ,(pss.total_time / 1000 / 60) AS TotalMinute
  123.     ,((pss.total_time / 1000 / 60)/calls) as TotalAverageTime      
  124. FROM pg_stat_statements AS pss
  125. INNER JOIN pg_database AS pd
  126.     ON pss.dbid=pd.oid
  127. ORDER BY 1 DESC
  128. LIMIT 10;
  129.  
  130. -- 6. Nevyužívane indexy
  131. SELECT
  132. PSUI.indexrelid::regclass AS IndexName
  133. ,PSUI.relid::regclass AS TableName
  134. FROM pg_stat_user_indexes AS PSUI    
  135. JOIN pg_index AS PI
  136.     ON PSUI.IndexRelid = PI.IndexRelid
  137. WHERE PSUI.idx_scan = 0
  138. AND PI.indisunique IS FALSE;
  139.  
  140. -- 7. Duplicitné indexy
  141. SELECT
  142.     indrelid::regclass AS TableName
  143.     ,array_agg(indexrelid::regclass) AS Indexes
  144. FROM pg_index
  145. GROUP BY
  146.     indrelid
  147.     ,indkey
  148. HAVING COUNT(*) > 1;
  149.  
  150. -- Je zapnute AutoVacuum
  151. show autovacuum;
  152.  
  153. /* VACUUM obnovuje úložisko obsadené mŕtvymi n-ticami/dead tuples.
  154. V architektúre MCVV sa vymažú tuples, ktoré sa fyzicky neodstránia. Sú prítomné na disku, kým nie je dokončený VACUUM.
  155.  
  156. Ak na svojej tabuľke vykonávate časté UPDATE / DELETE, musíte nájsť fragmentáciu a vykonať na nej VACUUM. VACUUM nevyžaduje exkluzívny zámok tabuľky */
  157. VACUUM Table_Name;
  158.  
  159. /* Nech už VACUUM získa priestor, ktorý si tento priestor môže vyžiadať, použije ho na ďalšie ukladanie. VACUUM FULL prepíše celú tabuľku údajmi a uvoľní všetok fragmentovaný priestor starej tabuľky.
  160.  
  161. Mali by sme sa vyhnúť VACUUM FULL, pretože zmenšuje celú tabuľku a zapisuje všetko do nového diskového bloku, ktorý vyžaduje viac zdrojov a miesto na disku na dokončenie tejto operácie.
  162.  
  163. Ak nájdete veľké množstvo mŕtvych riadkov, mali by ste v tejto tabuľke spustiť VACUUM FULL.
  164. VACUUM FULL vyžaduje exkluzívny zámok na stole a tiež vyžaduje voľné miesto na disku rovnako ako veľkosť vašej tabuľky. */
  165. VACUUM FULL Table_Name;
  166.  
  167. /* Po vykonaní VACUUM alebo VACUUM FULL musíte vykonať tento príkaz na aktualizáciu štatistík. Aktualizácia ANALYZE vyžaduje štatistiku a výsledky ukladá do katalógu systému pg_statistic.
  168.  
  169. Plánovač dotazov používa tieto štatistické informácie o databáze na prípravu efektívneho plánu vykonávania dotazov.
  170. Môžete tiež spustiť VACUUM ANALYZE, ktorý vykoná prvý VACUUM a potom vykoná ANALYZE.
  171. */
  172. ANALYZE Table_Name;
  173. VACUUM ANALYZE Table_Name;
  174.  
  175. -- Kontrola stavu AutoVacuum pre všetky tabuľky
  176. SELECT
  177.     schemaname
  178.     ,relname
  179.     ,n_live_tup
  180.     ,n_dead_tup
  181.     ,last_autovacuum
  182. FROM pg_stat_all_tables
  183. ORDER BY n_dead_tup
  184.     /(n_live_tup
  185.       * current_setting('autovacuum_vacuum_scale_factor')::float8
  186.       + current_setting('autovacuum_vacuum_threshold')::float8)
  187.      DESC;
  188.  
  189. -- Vykonajte VACUUM FULL bez miesta na disku
  190. /* VACUUM FULL získava všetok voľný priestor uvoľnený programom VACUUM fyzickým odstránením mŕtvych riadkov.
  191.  
  192. Táto metóda tiež vyžaduje viac miesta na disku, pretože zapíše novú kópiu tabuľky a neuvoľní starú kópiu, kým sa operácia neskončí. */
  193.  
  194. /* Aby sme tento problém vyriešili, potrebujeme ďalšie úložisko, ako ktorákoľvek iná sieťová jednotka alebo prenosný pevný disk.
  195. Nezabudnite, že VACUUM FULL vyžaduje exkluzívny zámok pre tabuľku, takže počas tejto operácie nebude vaša tabuľka prístupná. */
  196.  
  197. -- Vytvorte nový tabuľkový priestor:
  198. CREATE TABLESPACE temptablespace LOCATION '/path/../';
  199.  
  200. -- Skontrolujte aktuálny tabuľkový priestor tabuľky:
  201. SELECT tablespace FROM pg_tables WHERE tablename = 'mybigtable';
  202.  
  203. -- Ak je NULL, má predvolený tabuľkový priestor.
  204.  
  205. -- Presuňte tabuľku do nového tabuľkového priestoru:
  206. ALTER TABLE mybigtable SET TABLESPACE temptablespace;
  207.  
  208. -- Vykonajte VACUUM FULL:
  209. VACUUM FULL mybigtable;
  210.  
  211. -- Presunúť tabuľku do starého tabuľkového priestoru: (presun na pg_default)
  212. ALTER TABLE mybigtable SET TABLESPACE pg_default;
  213.  
  214. -- Dropnite tento dočasný tabuľkový priestor:
  215. DROP TABLESPACE temptablespace;
  216.  
  217. --X1 Nájdenie celkového počtu živých a mŕtvych tíc (riadkov) tabuľky
  218.  
  219. -- Systémové funkcie a pg_class
  220. SELECT
  221.     relname AS ObjectName
  222.     ,pg_stat_get_live_tuples(c.oid) AS LiveTuples
  223.     ,pg_stat_get_dead_tuples(c.oid) AS DeadTuples
  224. FROM pg_class c;
  225.  
  226. -- pg_stat_user_tables
  227. SELECT
  228.     relname AS TableName
  229.     ,n_live_tup AS LiveTuples
  230.     ,n_dead_tup AS DeadTuples
  231. FROM pg_stat_user_tables;
  232.  
  233.  
  234.  
  235. -- XX 3. Non Superuser môže zrusit/killnut svoje vlastné spustené dopyty
  236. -- Vytvor schemu
  237. CREATE SCHEMA query_admin;
  238. -- Vytvorte funkciu, ktorá zabije dopyt používateľa
  239. CREATE OR REPLACE FUNCTION query_admin.kill_process(userpid integer)
  240. RETURNS boolean AS $body$
  241. DECLARE
  242.     qry boolean;
  243. BEGIN
  244.     qry := (SELECT pg_catalog.pg_cancel_backend(pid)
  245.             FROM pg_stat_activity
  246.             WHERE usename=(select session_user)
  247.             AND pid=userpid);
  248.     RETURN qry;
  249. END;
  250. $body$
  251. LANGUAGE plpgsql
  252. SECURITY DEFINER
  253. VOLATILE
  254. RETURNS NULL ON NULL INPUT;
  255.  
  256. -- Udeľte povolenie na Public, aby k nemu mal prístup každý používateľ:
  257. GRANT USAGE ON SCHEMA query_admin TO public;
  258. GRANT EXECUTE ON FUNCTION query_admin.kill_process(pid integer) TO public;
  259.  
  260. -- Používateľ môže skontrolovať svoje bežiace dotazy process_id pomocou dotazu nižšie:
  261.  
  262. SELECT * FROM pg_stat_activity
  263. WHERE usename = 'user_name';
  264.  
  265. -- Ukážka vykonania kill_process()
  266. SELECT * FROM query_admin.kill_process(process_id);
  267. SELECT * FROM query_admin.kill_process(14526);
Add Comment
Please, Sign In to add comment