PostgreSQL 创建表分区


创建表分区步骤如下:
1. 创建主表
CREATE TABLE users ( uid int not null primary key, name varchar(20));
2. 创建分区表(必须继承上面的主表)
CREATE TABLE users_0 ( check (uid >= 0 and uid< 100) ) INHERITS (users);
CREATE TABLE users_1 ( check (uid >= 100)) INHERITS (users);
3. 在分区表上建立索引,其实这步可以省略的哦
CREATE INDEX users_0_uidindex on users_0(uid);
CREATE INDEX users_1_uidindex on users_1(uid);
4. 创建规则RULE
CREATE RULE users_insert_0 AS
ON INSERT TO users WHERE
(uid >= 0 and uid < 100)
DO INSTEAD
INSERT INTO users_0 VALUES (NEW.uid,NEW.name);
CREATE RULE users_insert_1 AS
ON INSERT TO users WHERE
(uid >= 100)
DO INSTEAD
INSERT INTO users_1 VALUES (NEW.uid,NEW.name);
下面就可以测试写入数据啦:
postgres=# INSERT INTO users VALUES (100,'smallfish');
INSERT 0 0
postgres=# INSERT INTO users VALUES (20,'aaaaa');
INSERT 0 0
postgres=# select * from users;
uid | name
-----+-----------
20 | aaaaa
100 | smallfish
(2 笔资料列)
postgres=# select * from users_0;
uid | name
-----+-------
20 | aaaaa
(1 笔资料列)
postgres=# select * from users_1;
uid | name
-----+-----------
100 | smallfish
(1 笔资料列)
到这里表分区已经可以算完了,不过还有个地方需要修改下,先看count查询把。
postgres=# EXPLAIN SELECT count(*) FROM users where uid<100;
QUERY PLAN
---------------------------------------------------------------------------------------------
Aggregate (cost=62.75..62.76 rows=1 width=0)
-> Append (cost=6.52..60.55 rows=879 width=0)
-> Bitmap Heap Scan on users (cost=6.52..20.18 rows=293 width=0)
Recheck Cond: (uid < 100)
-> Bitmap Index Scan on users_pkey (cost=0.00..6.45 rows=293 width=0)
Index Cond: (uid < 100)
-> Bitmap Heap Scan on users_0 users (cost=6.52..20.18 rows=293 width=0)
Recheck Cond: (uid < 100)
-> Bitmap Index Scan on users_0_uidindex (cost=0.00..6.45 rows=293 width=0)
Index Cond: (uid < 100)
-> Bitmap Heap Scan on users_1 users (cost=6.52..20.18 rows=293 width=0)
Recheck Cond: (uid < 100)
-> Bitmap Index Scan on users_1_uidindex (cost=0.00..6.45 rows=293 width=0)
Index Cond: (uid < 100)
(14 笔资料列)
按照本来想法,uid小于100,理论上应该只是查询users_0表,通过EXPLAIN可以看到其他他扫描了所有分区的表。
postgres=# SET constraint_exclusion = on;
SET
postgres=# EXPLAIN SELECT count(*) FROM users where uid<100;
QUERY PLAN
---------------------------------------------------------------------------------------------
Aggregate (cost=41.83..41.84 rows=1 width=0)
-> Append (cost=6.52..40.37 rows=586 width=0)
-> Bitmap Heap Scan on users (cost=6.52..20.18 rows=293 width=0)
Recheck Cond: (uid < 100)
-> Bitmap Index Scan on users_pkey (cost=0.00..6.45 rows=293 width=0)
Index Cond: (uid < 100)
-> Bitmap Heap Scan on users_0 users (cost=6.52..20.18 rows=293 width=0)
Recheck Cond: (uid < 100)
-> Bitmap Index Scan on users_0_uidindex (cost=0.00..6.45 rows=293 width=0)
Index Cond: (uid < 100)
(10 笔资料列)
到这里整个过程都OK啦!



相关阅读:
基于jQuery实现的向下滑动二级菜单效果代码
js删除Array数组中指定元素的两种方法
再谈Javascript中的异步以及如何异步
C#定义并实现单链表实例解析
C#数据绑定控件中的DataSource属性浅谈
Windows8网络配置出错导致不能上网如何重新启用以太网
js实现下拉框选择要显示图片的方法
Jquery读取URL参数小例子
Mac硬盘数据找回技巧解决资料读取不了问题
Thinkphp和onethink实现微信支付插件
Linux下安装使用Mutt邮件客户端并配置邮件警报功能
C#中GraphicsPath的AddString方法用法实例
Win10系统在应用商店安装软件时提示错误代码0x80070005的解决方法
C++检查某个文件或目录是否存在的函数
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 CMS SQL jQuery C# C++ java Android IOS oracle MongoDB PostgreSQL SQLite 交通频道 海西-蓬莱 宿迁-曲靖 阿勒泰-惠州 天门-喀什 莱西-玉溪 泰州-桓台 合肥-海盐 杭州-昭通 乐清-宿州 潮州-玉环 眉山-唐山 洛阳-河源 石嘴山-唐山 南京-乌海 攀枝花-大丰 张家港-泉州 白山-章丘 海安-大连 宜宾-马鞍山 平顶山-衡阳 启东-黄山 桐庐-四平 武威-韶关 宣城-嘉善 遵化-济南 达州-普兰店 成都-铜陵 崇左-枣庄 苏州-新泰 济南-肥城 昌都-淮南 佛山-宁乡 七台河-周口 如东-邯郸 淮安-达州 义乌-平度 黄石-那曲 呼和浩特-来宾 北海-崇左 阿克苏-嵊州 偃师-湛江 乌兰浩特-岳阳 白银-襄阳 临沧-和田 东营-云浮 安康-九江 邢台-济南 仪征-武汉 长沙-南安 宜都-眉山 文山-绥化 玉环-昆山 淮安-宁波 潮州-广安 巴中-玉环 上虞-北海 莆田-保定 肇庆-韶关 新余-安顺 白山-鄂州 包头-黄冈 平凉-林芝 张掖-海北 聊城-林芝 武汉-瓦房店 兖州-临夏 梧州-莱芜 玉林-亳州 揭阳-临沂 韶关-大石桥 达州-嘉兴 南阳-永康 太原-临沂 长治-温岭 北海-大连 长沙-三河 义乌-嘉兴 咸宁-清远 鹤壁-武汉 钦州-淮北 影壁山-黄泥崴子 熊岳城-一面坡 中卫-旬阳北 潜江-镇江 青州市-郴州西 上海虹桥-济南西 满归-阿龙山 长寿北-瓦屋山 沙坨子-中台子 商丘-青铜峡 影壁山-十里坪 金华-祁阳 吴桥-郴州 枣庄西-尚志 建宁县北-利川 上海-渭南 甘谷-渭南镇 湘潭-来宾 绥阳-大雁 枣庄西-亚布力 衡阳东-萧县北 贵港-北海 延安-固始 商丘南-建阳 定远-宜兴 黄羊滩-中宁 广水-阳谷 婺源-饶平 南昌西-信丰 东戴河-北京 普兰店-郑州 揭阳-娄底 浩良河-肃宁 四平东-定州东 上海-广安 甘洛-西昌 东淤地-五台山 景德镇-玉山 武威-山丹 邢台东-北京西 深州-文水 沁县-晋城 金沟屯-猴山 阳谷-沈阳北 横道河子-北京 嘉兴-双峰北 下坑子-大板 东方红-阿城 桃村-禹城 汉口-济南 土牧尔台-呼和浩特 杭州东-炎陵 蚌埠南-杭州东 兰考-东莞东 定南-合肥 青岛北-亳州 高头-龙门河 沈阳-沈阳西 凯里-凯里西 茂名-渭南 黑河-富裕 讷河-索图罕 木里图-泡子 三河县-长春 肃宁-蕲春 北京-敖力布告 滕州东-德清 枝江北-湖州 水地-四合 莱西-磁窑 峰高铺-朱杨溪 揭阳-遂溪 铁岭-银川 保定-长沙 长发屯-青山 武夷山-怀化 白音胡硕-哈日努拉 横道河子-亚河 佳木斯-武夷山 惠州-永定

Copyright © 2016 phpStudy |