2016-03-05 55 views
0

问题描述:Postgres的跨模型的查询使用UNION ALL

我创建的Postgres一个数据库,它有许多模式,比如:

s1,s2,s3, ..... s1000 

每个模式已创建一个表如:

CREATE TABLE s1.demos 
(
    id bigint NOT NULL DEFAULT s1.next_demos_id(), -- 分片Id 
    title character varying(255) NOT NULL, -- 标题 
    CONSTRAINT demos_pkey PRIMARY KEY (id) 
) 
CREATE TABLE s2.demos 
(
    id bigint NOT NULL DEFAULT s2.next_demos_id(), -- 分片Id 
    title character varying(255) NOT NULL, -- 标题 
    CONSTRAINT demos_pkey PRIMARY KEY (id) 
) 

我执行的是SQL使用UNION ALL选择两种模式的数据,如:

(SELECT * 
FROM s2.demos 
ORDER BY id ASC 
LIMIT 3) 
UNION ALL (SELECT * 
      FROM s1.demos 
      ORDER BY id ASC 
      LIMIT 3) 
ORDER BY id DESC 

它的结果是:

psql (9.5.0) 
Type "help" for help. 
migrate_development=# (SELECT * FROM s2.demos ORDER BY id ASC LIMIT 3) UNION ALL (SELECT * FROM s1.demos ORDER BY id ASC LIMIT 3) ORDER BY id DESC; 
id |  title 
----+---------------- 
21 | s2->1 's title 
13 | s1->3 's title 
12 | s1->2 's title 
11 | s1->1 's title 
10 | s2->3 's title 
    9 | s2->4 's title 
(6 rows) 

migrate_development=# 

两个演示表的数据,如:

migrate_development=# SELECT * FROM s1.demos; 
id |  title 
----+---------------- 
11 | s1->1 's title 
12 | s1->2 's title 
13 | s1->3 's title 
14 | s1->4 's title 
15 | s1->5 's title 
(5 rows) 

migrate_development=# SELECT * FROM s2.demos; 
id |  title 
----+---------------- 
21 | s2->1 's title 
22 | s2->2 's title 
10 | s2->3 's title 
    9 | s2->4 's title 
25 | s2->5 's title 
(5 rows) 

migrate_development=# 

问题

我知道我可以通过UNION ALL得到的所有模式的数据1000架构,但我想要其他方法?

PS。我也用Sphinx解决,,它的另一项服务,任何其他的敏捷方法

+0

我已经使用'inherit'如:'alter table s1.demos inherit public.demos; alter table s2.demos inherit public.demos;''选择tableoid,* from public.demos' – Fish

+0

insert,update,delete on child table direct。没有任何性能损失。但是如果在父表上插入UPDATE DELETE,并使用触发器,规则重定向行到子表,则会降低性能。 – Fish

回答

1

您可以使用inheritance postgresql feature

-- create schema for base table and table itself 
CREATE SCHEMA s; 
CREATE SEQUENCE demos_id_seq START 1; 

CREATE TABLE s.demos 
(
    id bigint NOT NULL DEFAULT nextval('demos_id_seq'), 
    title character varying(255) NOT NULL, 
    table_schema text NOT NULL, 
    CONSTRAINT demos_pkey PRIMARY KEY (id) 
); 

-- create descendant table 1 
CREATE SCHEMA s1; 
CREATE TABLE s1.demos (
    table_schema text NOT NULL DEFAULT 's1' 
) INHERITS (s.demos); 

-- create descendant table 1 
CREATE SCHEMA s2; 
CREATE TABLE s2.demos (
    table_schema text NOT NULL DEFAULT 's2' 
) INHERITS (s.demos); 

-- create descendant table 1 
CREATE SCHEMA s3; 
CREATE TABLE s3.demos (
    table_schema text NOT NULL DEFAULT 's3' 
) INHERITS (s.demos); 

-- can add table to s1000.demos 

-- insert some data for test queries 
insert into s1.demos (title) VALUES ('s1.1'), ('s1.2'), ('s1.3'), ('s1.4'), ('s1.5'); 
insert into s2.demos (title) VALUES ('s2.1'), ('s2.2'), ('s2.3'), ('s2.4'), ('s2.5'); 
insert into s3.demos (title) VALUES ('s3.1'), ('s3.2'), ('s3.3'), ('s3.4'), ('s3.5'); 

-- query for 3th top row from each descendant table 
SELECT * FROM (
    SELECT 
    ROW_NUMBER() OVER (PARTITION BY table_schema ORDER BY id asc) AS r, 
    t.* 
    FROM 
    s.demos t 
) x WHERE x.r <= 3; 

该查询返回的输出:?

 r | id | title | table_schema 
---+----+-------+-------------- 
1 | 1 | s1.1 | s1 
2 | 2 | s1.2 | s1 
3 | 3 | s1.3 | s1 
1 | 6 | s2.1 | s2 
2 | 7 | s2.2 | s2 
3 | 8 | s2.3 | s2 
1 | 11 | s3.1 | s3 
2 | 12 | s3.2 | s3 
3 | 13 | s3.3 | s3 
(9 rows) 
+0

谢谢:)我正在使用。 – Fish

+0

请注意,计划时间开始降低过去100个左右的孩子。 –

+0

我不知道这是因为我从来没有超过100个孩子的基表 –