Разница между страницами «Партиционирование» и «Участник:FireWolf»

Материал из Home Wiki
(Различия между страницами)
Перейти к навигации Перейти к поиску
м
 
(Новая страница: «[https://www.wolf-a.ru Вольф Александр]»)
 
Строка 1: Строка 1:
= Функции =
[https://www.wolf-a.ru Вольф Александр]
<syntaxhighlight lang="plsql">
CREATE OR REPLACE FUNCTION move_data_month(dd timestamp without time zone)
 
  RETURNS text AS
 
$BODY$
 
DECLARE
 
     dd ALIAS FOR $1;
 
     dname text;
 
     dname1 text;
 
     rn text;
 
BEGIN
 
    select into dname1 extract(month from ($1-interval '1 month'));
 
    if char_length(dname1) = 1 then
 
        select into dname1 '0' || extract(month from ($1-interval '1 month'));
 
    end if;
 
    DROP TABLE IF EXISTS  payments_log_move;
 
    CREATE TABLE payments_log_move ( ) INHERITS (payments_log);
 
    ALTER TABLE payments_log_move NO INHERIT payments_log;
 
    INSERT INTO payments_log_move select * from payments_log where "time" >= $1 - interval '1 month' AND "time" < $1;
 
    DELETE FROM payments_log WHERE "time" >= $1 - interval '1 month' AND "time" < $1;
 
    SELECT INTO dname 'payments_log_y' || extract(year from ($1-interval '1 month')) || 'm' || dname1;
 
    
 
    SELECT INTO rn (SELECT count(relname) FROM pg_class WHERE relname = dname);
 
    if rn = '0' THEN
 
        EXECUTE 'CREATE TABLE ' || dname || '( ) INHERITS (payments_log)';
 
    end if;
 
    EXECUTE 'INSERT INTO ' || dname || ' select * from payments_log_move';
 
    return 'OK ' || dd || ' <> ' ||dname;
 
END;
 
$BODY$
 
  LANGUAGE plpgsql
 
;
</syntaxhighlight>
 
select move_data_month('2016-01-01'::timestamp);
 
select * from payments_log_y2013m04;
 
<syntaxhighlight lang="plsql">
CREATE OR REPLACE FUNCTION move_data_year(dd timestamp without time zone)
 
  RETURNS text AS
 
$BODY$
 
DECLARE
 
     dd ALIAS FOR $1;
 
     dname text;
 
     dname1 text;
 
     rn text;
 
BEGIN
 
    DROP TABLE IF EXISTS  payments_log_move;
 
    CREATE TABLE payments_log_move ( ) INHERITS (payments_log);
 
    ALTER TABLE payments_log_move NO INHERIT payments_log;
 
    INSERT INTO payments_log_move select * from payments_log where "time" >= $1 - interval '1 year' AND "time" < $1;
 
    DELETE FROM payments_log WHERE "time" >= $1 - interval '1 year' AND "time" < $1;
 
    SELECT INTO dname 'payments_log_y' || extract(year from ($1-interval '1 year'));
 
    SELECT INTO rn (SELECT count(relname) FROM pg_class WHERE relname = dname);
 
    if rn = '0' THEN
 
        EXECUTE 'CREATE TABLE ' || dname || '( ) INHERITS (payments_log)';
 
    end if;
 
    EXECUTE 'INSERT INTO ' || dname || ' select * from payments_log_move';
 
    return 'OK ' || dd || ' <> ' ||dname;
 
END;
 
$BODY$
 
  LANGUAGE plpgsql
 
;
</syntaxhighlight>
 
<syntaxhighlight lang="plsql">
CREATE OR REPLACE FUNCTION index_part_data(year character varying)
 
  RETURNS text AS
 
$BODY$
 
DECLARE
 
     year ALIAS FOR $1;
 
     dname text;
 
     rn text;
 
BEGIN
 
    SELECT INTO dname 'payments_log_y' || year;
 
    SELECT INTO rn (SELECT count(relname) FROM pg_class WHERE relname = dname);
 
    if rn = '0' THEN
 
        return 'NO SUCH TABLE ' || dname;
 
    end if;
 
    EXECUTE 'CREATE INDEX pl' || year || '_idx_identifier_id_service ON payments_log_y' || year ||
 
        ' USING btree (identifier COLLATE pg_catalog."default", id_service)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_idx_pl_external_time ON payments_log_y' || year ||
 
        ' USING btree (external_time)';
 
    EXECUTE 'CREATE UNIQUE INDEX pl' || year || '_id_apparat_id_trans_idx ON payments_log_y' || year ||
 
        ' USING btree (id_apparat, id_trans)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_id_apparat_idx ON payments_log_y' || year ||
 
        ' USING btree (id_apparat)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_id_region_idx ON payments_log_y' || year ||
 
        ' USING btree (id_region)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_id_service_idx ON payments_log_y' || year ||
 
        ' USING btree (id_service)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_identifier_idx ON payments_log_y' || year ||
 
        ' USING btree (identifier COLLATE pg_catalog."default")';
 
    EXECUTE 'CREATE INDEX pl' || year || '_time_app_idx ON payments_log_y' || year ||
 
        ' USING btree (time_app)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_time_idx ON payments_log_y' || year ||
 
        ' USING btree ("time")';
 
    EXECUTE 'CREATE INDEX pl' || year || '_time_proc_idx ON payments_log_y' || year ||
 
        ' USING btree (time_proc)';
 
    EXECUTE 'CREATE UNIQUE INDEX payments_log_y' || year || '_id_idx ON payments_log_y' || year ||
 
        ' USING btree (id)';
 
    return 'DONE INDEXES ON ' || dname;
 
END;
 
$BODY$
 
  LANGUAGE plpgsql
 
;
</syntaxhighlight>
 
select index_part_data('2010');
 
= Анализ запросов =
1. в базе
 
create extension pg_stat_statements;
 
2. в конфиге
 
<syntaxhighlight lang="text">
shared_preload_libraries = 'pg_stat_statements'
 
pg_stat_statements.max = 1000
 
pg_stat_statements.track = all
</syntaxhighlight>
 
<syntaxhighlight lang="sql">
select total_time/calls as AVG_COST,* from pg_stat_statements where total_time/calls > 10 and calls > 10 order by AVG_COST desc;
</syntaxhighlight>
 
= Оптимизация =
<syntaxhighlight lang="sql">
CREATE INDEX idx_events_class_date
 
ON events
 
USING btree
 
(id_class_events, date);
</syntaxhighlight>
 
ip-appcheck
<syntaxhighlight lang="sql">
CREATE INDEX idx_events_ip_appcheck707 ON events USING btree (id_apparat, id_class_events) WHERE id_class_events=707;
 
CREATE INDEX idx_events_ip_appcheck708 ON events USING btree (id_apparat, id_class_events) WHERE id_class_events=708;
</syntaxhighlight>
 
[[Категория:Работа]]

Версия 07:38, 10 января 2017