/*創建索引序列,自增id,也可以直接聲明id類型爲serial
CREATE SEQUENCE "xu"."t_sys_log_main_id_seq"
INCREMENT 1
MINVALUE 1
MAXVALUE 99999999
START 1
CACHE 1;
ALTER TABLE "xu"."t_sys_log_main_id_seq" OWNER TO "postgres";
*/
/*創建父表
CREATE TABLE "xu"."t_sys_log_main" (
"id" int4 DEFAULT nextval(
"account_affiliation_code" varchar(100) COLLATE "default" NOT NULL,
"account_affiliation" varchar(50) COLLATE "default" NOT NULL,
"operation_time" timestamp(6) NOT NULL,
"operation_key" varchar(2) COLLATE "default" NOT NULL,
"operation_value" varchar(30) COLLATE "default" NOT NULL,
"operation_loginid" varchar(100) COLLATE "default" NOT NULL,
"operation_message" varchar(300) COLLATE "default" NOT NULL,
"operation_ip" varchar(30) COLLATE "default" NOT NULL
)
WITH (OIDS=FALSE)
;
COMMENT ON TABLE "xu"."t_sys_log_main" IS
COMMENT ON COLUMN "xu"."t_sys_log_main"."account_affiliation_code" IS
COMMENT ON COLUMN "xu"."t_sys_log_main"."account_affiliation" IS
COMMENT ON COLUMN "xu"."t_sys_log_main"."operation_time" IS
COMMENT ON COLUMN "xu"."t_sys_log_main"."operation_key" IS
COMMENT ON COLUMN "xu"."t_sys_log_main"."operation_value" IS
COMMENT ON COLUMN "xu"."t_sys_log_main"."operation_loginid" IS
COMMENT ON COLUMN "xu"."t_sys_log_main"."operation_message" IS
COMMENT ON COLUMN "xu"."t_sys_log_main"."operation_ip" IS
ALTER TABLE "xu"."t_sys_log_main" ADD PRIMARY KEY ("id");
*/
/*創建分區表,分區表從父表繼承,數據類型和字段數沒有變化,主要以時間爲分區鍵,也可以使用其他關鍵字分區。
create table xu.t_sys_log_y2016m09
(CHECK (operation_time >= DATE
AND NEW .operation_time < DATE
) THEN
INSERT INTO xu.t_sys_log_y2016m09
VALUES
(NEW .*) ;
ELSEIF (
NEW .operation_time >= DATE
AND NEW .operation_time < DATE
) THEN
INSERT INTO xu.t_sys_log_y2016m10
VALUES
(NEW .*) ;
ELSEIF (
NEW .operation_time >= DATE
AND NEW .operation_time < DATE
) THEN
INSERT INTO xu.t_sys_log_y2016m11
VALUES
(NEW .*) ;
ELSEIF (
NEW .operation_time >= DATE
AND NEW .operation_time < DATE
) THEN
INSERT INTO xu.t_sys_log_y2016m12
VALUES
(NEW .*) ;
ELSE
RAISE EXCEPTION
END
IF ; RETURN NULL ;
END ; $$ LANGUAGE plpgsql;
*/
/*
創建觸發器,觸發函數。
CREATE TRIGGER sys_log_insert_trigger BEFORE INSERT ON xu.t_sys_log_main
FOR EACH ROW
EXECUTE PROCEDURE sys_log_insert_trigger();
*/
/*
插入數據。
INSERT INTO xu.t_sys_log_main VALUES
(1,
INSERT INTO xu.t_sys_log_main VALUES
(1,
INSERT INTO xu.t_sys_log_main VALUES
(1,
INSERT INTO xu.t_sys_log_main VALUES
(1,
INSERT INTO xu.t_sys_log_main VALUES
(1,
INSERT INTO xu.t_sys_log_main VALUES
(1,
*/
select * from t_sys_log_main;
select
avg(expense)
from
(select
client_key,
sum(expense) as expense
from
almart
where
date_key = date '2015-12-13'
group by 1
);
--查詢非分區表
select
avg(expense)
from
(select
client_key,
sum(expense) as expense
from
almart_all
where
date_key = date '2015-12-13'
group by 1
) foo;
--創建主表
CREATE TABLE tbl_partition
(
id integer,
name text,
data numeric,
gather_time timestamp
);
CREATE OR REPLACE FUNCTION auto_insert_into_tbl_partition()
RETURNS trigger AS
$BODY$
DECLARE
time_column_name text ;
curMM varchar(6);
isExist boolean;
startTime text;
endTime text;
strSQL text;
BEGIN
-- 調用前,必須首先初始化(時間字段名):time_column_name [直接從調用參數中獲取!!]
time_column_name := TG_ARGV[0];
EXECUTE 'SELECT $1.'||time_column_name INTO strSQL USING NEW;
curMM := to_char( strSQL::timestamp , 'YYYYMM' );
select count(*) INTO isExist from pg_class where relname = (TG_RELNAME||'_'||curMM);
-- 若不存在, 則插入前需 先創建子分區
IF ( isExist = false ) THEN
-- 創建子分區表
startTime := curMM||'01 00:00:00.000';
endTime := to_char( startTime::timestamp + interval '1 month', 'YYYY-MM-DD HH24:MI:SS.MS');
strSQL := 'CREATE TABLE IF NOT EXISTS '||TG_RELNAME||'_'||curMM||
' ( CHECK('||time_column_name||'>='''|| startTime ||''' AND '
||time_column_name||'< '''|| endTime ||''' )
) INHERITS ('||TG_RELNAME||') ;' ;
EXECUTE strSQL;
strSQL := 'CREATE INDEX '||TG_RELNAME||'_'||curMM||'_INDEX_'||time_column_name||' ON '
||TG_RELNAME||'_'||curMM||' ('||time_column_name||');' ;
EXECUTE strSQL;
END IF;
strSQL := 'INSERT INTO '||TG_RELNAME||'_'||curMM||' SELECT $1.*' ;
EXECUTE strSQL USING NEW;
RETURN NULL;
END
$BODY$
LANGUAGE plpgsql;
---調度觸發器
CREATE TRIGGER insert_tbl_partition_trigger
BEFORE INSERT
ON tbl_partition
FOR EACH ROW
EXECUTE PROCEDURE auto_insert_into_tbl_partition('gather_time');
--插入數據
INSERT INTO public.tbl_partition(
id, name, data, gather_time)
VALUES (2, '大海都是水', 123, '2018-08-12 14:23:15.012');
select pg_size_pretty(pg_database_size('postgres'));
/*
CREATE TABLE xu.almart
(
date_key date,
hour_key smallint,
client_key integer,
item_key integer,
account integer,
expense numeric
);
*/
/*
CREATE TABLE xu.almart_2015_12_10 () inherits (xu.almart);
CREATE TABLE xu.almart_2015_12_11 () inherits (xu.almart);
CREATE TABLE xu.almart_2015_12_12 () inherits (xu.almart);
CREATE TABLE xu.almart_2015_12_13 () inherits (xu.almart);
*/
/*
ALTER TABLE xu.almart_2015_12_10
ADD CONSTRAINT almart_2015_12_10_check_date_key
CHECK (date_Key =
ALTER TABLE xu.almart_2015_12_11
ADD CONSTRAINT almart_2015_12_10_check_date_key
CHECK (date_Key =
ALTER TABLE xu.almart_2015_12_12
ADD CONSTRAINT almart_2015_12_10_check_date_key
CHECK (date_Key =
ALTER TABLE xu.almart_2015_12_13
ADD CONSTRAINT almart_2015_12_10_check_date_key
CHECK (date_Key =
*/
/*
CREATE INDEX almart_date_key_2015_12_10
ON xu.almart_2015_12_10 (date_key);
CREATE INDEX almart_date_key_2015_12_11
ON xu.almart_2015_12_11 (date_key);
CREATE INDEX almart_date_key_2015_12_12
ON xu.almart_2015_12_12 (date_key);
CREATE INDEX almart_date_key_2015_12_13
ON xu.almart_2015_12_13 (date_key);
*/
--創建分區函數
/*
CREATE OR REPLACE FUNCTION almart_partition_trigger()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.date_key = DATE
THEN
INSERT INTO xu.almart_2015_12_10 VALUES (NEW.*);
ELSIF NEW.date_key = DATE
THEN
INSERT INTO xu.almart_2015_12_11 VALUES (NEW.*);
ELSIF NEW.date_key = DATE
THEN
INSERT INTO xu.almart_2015_12_12 VALUES (NEW.*);
ELSIF NEW.date_key = DATE
THEN
INSERT INTO xu.almart_2015_12_13 VALUES (NEW.*);
ELSIF NEW.date_key = DATE
THEN
INSERT INTO xu.almart_2015_12_14 VALUES (NEW.*);
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
*/
--掛載分區Trigger
/*
CREATE TRIGGER insert_almart_partition_trigger
BEFORE INSERT ON xu.almart
FOR EACH ROW EXECUTE PROCEDURE almart_partition_trigger();
*/
/*
CREATE TABLE xu.almart_all
(
date_key date,
hour_key smallint,
client_key integer,
item_key integer,
account integer,
expense numeric
);
*/
/*
INSERT INTO xu.almart_all
select
(select
array_agg(i::date)
from generate_series(
)[floor(random()*4)+1] as date_key,
floor(random()*24) as hour_key,
floor(random()*1000000)+1 as client_key,
floor(random()*100000)+1 as item_key,
floor(random()*20)+1 as account,
floor(random()*10000)+1 as expense
from
generate_series(1,300000000,1);
*/
select count(*) from xu.almart
INSERT INTO xu.almart SELECT * FROM xu.almart_all;