Empathy optymalizacja postgre_sql

1,951 views

Published on

Published in: Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,951
On SlideShare
0
From Embeds
0
Number of Embeds
78
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Empathy optymalizacja postgre_sql

  1. 1. Jak optymalizować bazy danych w aplikacjach internetowych. Na przykładzie PostgreSQL. Wojciech Bublik
  2. 2. O Empathy Internet Software House 2000 rok założenia 30 osób zatrudnienie www.empathy.pl
  3. 3. O czym będę mówił? 1. Tuning konfiguracji serwera 2. O czym powinni pamiętać programiści 3. Optymalizacja zapytań na podstawie analizy bazy danych 4. Inne możliwości optymalizacji… www.empathy.pl
  4. 4. Tuning konfiguracji serwera postgresql.conf max_connections shared_buffers temp_buffers max_prepared_transactions work_mem maintenance_work_mem checkpoint_segments effective_cache_size www.empathy.pl
  5. 5. Tuning konfiguracji serwera Konfiguracja systemu: /etc/sysctl.conf http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html kern.ipc.shmall kern.ipc.shmmax kern.ipc.semmap www.empathy.pl
  6. 6. Tuning konfiguracji serwera Konfiguracja sprzętowa 1. Szybkie dyski twarde – duży cache, RAID 2. Wiele procesorów – każde połączenie to oddzielny proces 3. Duża ilość pamięci RAM www.empathy.pl
  7. 7. Optymalizacja zapytań O czym programiści powinni pamiętać 1. Indeksy CREATE INDEX idx_test1 ON mtcs_attributes (fk_attribute_class_id); CREATE INDEX idx_test2 ON opr_cttrx (ctt_amnt, ctt_sysdate) WITH (fillfactor = 70); CREATE INDEX idx_test3 ON opr_pptrx USING btree (ppt_date) WHERE ppt_acc = 5504100; www.empathy.pl
  8. 8. Optymalizacja zapytań O czym programiści powinni pamiętać 2. Pola w wynikach zapytania www.empathy.pl
  9. 9. Optymalizacja zapytań O czym programiści powinni pamiętać 3. Minimalizowanie ilości zapytań SQL 1. SELECT true FROM eicrm_company WHERE cmp_id = 1234; UPDATE eicrm_company SET cmp_name = ‘xyz’, cmp_short_name = ‘xyz’ WHERE cmp_id = 1234; INSERT INTO eicrm_company (cmp_name, cmp_short_name) VALUES (‘xyz’,’xyz’); 2. UPDATE eicrm_company SET cmp_name = ‘xyz’, cmp_short_name = ‘xyz’ WHERE cmp_id = 1234 RETURNING cmp_id; INSERT INTO eicrm_company (cmp_name, cmp_short_name) VALUES (‘xyz’,’xyz’) RETURNING cmp_id; www.empathy.pl
  10. 10. Optymalizacja zapytań O czym programiści powinni pamiętać 3. Przetwarzanie dużych ilości danych • Transakcje, • Prepared Statements, • Multi-row insert, • Copy www.empathy.pl
  11. 11. Optymalizacja zapytań O czym programiści powinni pamiętać 4. Postać normalna? Nie za wszelką cenę. CREATE TABLE eicrm_company ( cmp_id serial NOT NULL, cmp_short_name character varying(64) NOT NULL, cmp_name character varying(256) NOT NULL, cmp_nip character varying(10) ); CREATE TABLE eicrm_phone ( CREATE TABLE eicrm_address phn_id serial NOT NULL, ( phn_cmp_id integer, adr_id serial NOT NULL, phn_no character varying(16), adr_cmp_id integer, phn_type smallint, adr_street character varying(256), ); adr_street_no integer, CREATE TABLE eicrm_www adr_street_place_no character varying(8), ( adr_city character varying(256), www_id serial NOT NULL, adr_postal_code character varying(6) www_cmp_id integer, ); www_address character varying(64) ); www.empathy.pl
  12. 12. Optymalizacja zapytań O czym programiści powinni pamiętać 5. Widoki • Przejrzystość zapytań SQL • Pomocnicza warstwa logiki w bazie danych • Możliwość optymalizacji zapytań bez zmian w kodzie aplikacji • Możliwość konwersji na zmaterializowane widoki www.empathy.pl
  13. 13. Optymalizacja zapytań O czym programiści powinni pamiętać 6. Warto próbować różnych sposobów COST: 8173 CZAS WYKONANIA: 108 ms SELECT eis_product_group.pgr_id, max(eis_product_group.pgr_name) FROM eis_product_group LEFT OUTER JOIN tmp_prd_list_view ON (eis_product_group.pgr_id = tmp_prd_list_view.pgr_id) GROUP BY eis_product_group.pgr_id HAVING count(tmp_prd_list_view.pgr_id) > 0 COST: 9940 CZAS WYKONANIA: 108 ms SELECT DISTINCT eis_product_group.pgr_id, eis_product_group.pgr_name FROM eis_product_group INNER JOIN tmp_prd_list_view ON (eis_product_group.pgr_id = tmp_prd_list_view.pgr_id) COST: 9340 CZAS WYKONANIA: 108 ms SELECT eis_product_group.pgr_id, eis_product_group.pgr_name FROM eis_product_group WHERE pgr_id IN (SELECT DISTINCT pgr_id FROM tmp_prd_list_view) www.empathy.pl
  14. 14. Optymalizacja zapytań O czym programiści powinni pamiętać 6. Warto próbować różnych sposobów COST: 14 CZAS WYKONANIA: 13 ms SELECT eis_product_group.pgr_id, eis_product_group.pgr_name FROM eis_product_group WHERE pgr_id IN (SELECT pgr_id FROM tmp_prd_list_view) COST: 89 CZAS WYKONANIA: 21 ms SELECT eis_product_group.pgr_id, eis_product_group.pgr_name FROM eis_product_group WHERE EXISTS (SELECT 1 FROM tmp_prd_list_view WHERE tmp_prd_list_view.pgr_id = eis_product_group.pgr_id) www.empathy.pl
  15. 15. Optymalizacja zapytań Analiza bazy danych Analiza bazy danych 1. Analiza statystyk serwera track_counts (stats_start_collector, stats_row_level), pg_stat_user_tables, pg_stat_user_indexes 2. Analiza logów log_min_duration_statement, pgFouine www.empathy.pl
  16. 16. Optymalizacja zapytań Analiza bazy danych Analiza statystyk serwera postgresql.conf: track_counts (stats_start_collector, stats_row_level) SELECT * FROM pg_stat_user_tables; SELECT * FROM pg_stat_user_indexes; www.empathy.pl
  17. 17. Optymalizacja zapytań Analiza bazy danych - analiza statystyk serwera www.empathy.pl
  18. 18. Optymalizacja zapytań Analiza bazy danych - analiza statystyk serwera www.empathy.pl
  19. 19. Optymalizacja zapytań Analiza bazy danych Analiza logów serwera postgresql.conf: log_statement, log_min_duration_statement www.empathy.pl
  20. 20. Optymalizacja zapytań Analiza bazy danych - analiza logów serwera pgFouine (http://pgfouine.projects.postgresql.org) php pgfouine.php -file postgresql.log > sample_default.html www.empathy.pl
  21. 21. Optymalizacja zapytań Analiza bazy danych - analiza logów serwera www.empathy.pl
  22. 22. Optymalizacja zapytań Analiza bazy danych - analiza logów serwera www.empathy.pl
  23. 23. Optymalizacja zapytań Analiza bazy danych - analiza logów serwera www.empathy.pl
  24. 24. Optymalizacja zapytań Explain, przykład optymalizacji SQL SELECT eicrm_user.usr_id, eicrm_user.usr_status, eicrm_user.usr_fname, eicrm_user.usr_lname, eicrm_user.usr_street_prefix, eicrm_user.usr_street, eicrm_user.usr_street_no, eicrm_user.usr_street_place_no, eicrm_user.usr_city, eicrm_user.usr_postal_code, eicrm_user.usr_post, eicrm_user.usr_email, eicrm_user.usr_phone_no, eicrm_user.usr_mobilephone_no, eicrm_user_type.utp_name,eicrm_company.cmp_city, eicrm_company.cmp_street, eicrm_company.cmp_name, ( SELECT pnc_name FROM eicrm_province WHERE eicrm_user.usr_pnc_id = eicrm_province.pnc_id ) as pnc_name FROM eicrm_user JOIN eicrm_user_user_type ON eicrm_user_user_type.uut_usr_id = eicrm_user.usr_id JOIN eicrm_user_type ON eicrm_user_user_type.uut_utp_id = eicrm_user_type.utp_id LEFT OUTER JOIN eicrm_user_company ON eicrm_user_company.ucm_usr_id = eicrm_user.usr_id LEFT OUTER JOIN eicrm_company ON eicrm_company.cmp_id = eicrm_user_company.ucm_cmp_id WHERE eicrm_user_user_type.uut_utp_id = 13 AND eicrm_user.usr_lname = 'Kowalski' AND eicrm_user.usr_city = 'Kraków' LIMIT 100 www.empathy.pl
  25. 25. Optymalizacja zapytań Explain, przykład optymalizacji SQL Bez warunków, bez limit 100 www.empathy.pl
  26. 26. Optymalizacja zapytań Explain, przykład optymalizacji SQL Bez warunków, z limit 100 www.empathy.pl
  27. 27. Optymalizacja zapytań Explain, przykład optymalizacji SQL Z warunkami eicrm_user.usr_lname = 'Kowalski' eicrm_user.usr_city = 'Kraków' bez indeksu na warunkach www.empathy.pl
  28. 28. Optymalizacja zapytań Explain, przykład optymalizacji SQL Z warunkami eicrm_user.usr_lname = 'Kowalski' eicrm_user.usr_city = 'Kraków' z indeksem usr_lname, usr_city www.empathy.pl
  29. 29. Optymalizacja zapytań Explain, przykład optymalizacji SQL Z warunkami eicrm_user.usr_lname = 'Kowalski' eicrm_user.usr_city = 'Kraków' z indeksami usr_lname oraz usr_city www.empathy.pl
  30. 30. Optymalizacja zapytań Inne możliwości optymalizacji Zmaterializowane widoki http://tech.jonathangardner.net/wiki/PostgreSQL/Materialized_Views • Tabela na podstawie wyników zapytania SQL zawierająca snapshot danych • Odświeżana cyklicznie lub z poziomu triggerów w tabelach • Możliwości indeksowania zmaterializowanego widoku • Proste i skuteczne rozwiązanie dające bardzo duży wzrost wydajności • Zagrożenia! Kopia nie odzwierciedla aktualnego stanu bazy danych. www.empathy.pl
  31. 31. Optymalizacja zapytań Inne możliwości optymalizacji Partycjonowanie tabel constraint_exclusion = on • Podział dużej tabeli na wiele mniejszych • Bardzo duży wzrost wydajności zapytań – zapytania skierowane na tabele z odpowiednim fragmentem danych • Ułatwione zarządzanie danymi – przechowywanie danych na wielu tablespace • Niezależne blokowanie tabel • Brak unikalności klucza głównego www.empathy.pl
  32. 32. Optymalizacja zapytań Inne możliwości optymalizacji Partycjonowanie tabel CREATE TABLE opr_okktr_201001 ( CREATE TABLE opr_okktr CONSTRAINT opr_okktr_201001_date_check ( CHECK ( okk_id serial NOT NULL, okk_date >= '2010-01-01'::date okk_trnref character varying(25), AND okk_date date NOT NULL, okk_date < '2010-02-01'::date okk_datelocal date, ) okk_crdno character varying(19), ) INHERITS (opr_okktr); okk_acc bigint NOT NULL, okk_amnt numeric(14,2), okk_curr_id smallint, CREATE TABLE opr_okktr_201002 okk_amntset numeric(14,2), ( okk_currset_id smallint, CONSTRAINT opr_okktr_201002_date_check okk_dateset date, CHECK ( okk_amntbill numeric(14,2), okk_date >= '2010-02-01'::date okk_currbill_id smallint, AND okk_ctt_id integer, okk_date < '2010-03-01'::date okk_ref text, ) CONSTRAINT okk_id PRIMARY KEY (okk_id), ) INHERITS (opr_okktr); ); www.empathy.pl
  33. 33. Optymalizacja zapytań Inne możliwości optymalizacji Partycjonowanie tabel CREATE OR REPLACE RULE opr_okktr_ins201001 AS ON INSERT TO opr_okktr WHERE new.okk_date >= '2010-01-01'::date AND new.okk_date < '2010-02-01'::date DO INSTEAD INSERT INTO opr_okktr_201001 (okk_id, okk_trnref, okk_date, okk_datelocal, okk_crdno, okk_acc, okk_amnt, okk_curr_id, okk_amntset, okk_currset_id, okk_dateset, okk_amntbill, okk_currbill_id, okk_ctt_id, okk_ref) VALUES (new.okk_id, new.okk_trnref, new.okk_date, new.okk_datelocal, new.okk_crdno, new.okk_acc, new.okk_amnt, new.okk_curr_id, new.okk_amntset, new.okk_currset_id, new.okk_dateset, new.okk_amntbill, new.okk_currbill_id, new.okk_ctt_id, new.okk_ref); www.empathy.pl
  34. 34. Optymalizacja zapytań Inne możliwości optymalizacji Partycjonowanie tabel www.empathy.pl
  35. 35. Optymalizacja zapytań Inne możliwości optymalizacji Partycjonowanie tabel www.empathy.pl
  36. 36. Gdzie nas znaleźć Nasz blog www.imagineblog.pl www.empathy.pl
  37. 37. Konkurs Facebook 1. Wejdź na www.empathy.pl/facebook 2. „Polub” naszą stronę 3. Skomentuj wpis ze zdjęciem z Tech.Spodka 4. Hasło: „Konkurs” 5. Wygraj nagrodę:) www.empathy.pl
  38. 38. Dziękuję :) w.bublik@empathy.pl www.empathy.pl

×