随笔分类 -  Postgresql

摘要:一、角色与用户的区别角色就相当于岗位:角色可以是经理,助理。用户就是具体的人:比如陈XX经理,朱XX助理,王XX助理。在PostgreSQL 里没有区分用户和角色的概念,"CREATE USER" 为 "CREATE ROLE" 的别名,这两个命令几乎是完全相同的,唯一的区别是"CREATE USER" 命令创建的用户默认带有LOGIN属性,而"CREATE ROLE" 命令创建的用户默认不带LOGIN属性(CREATE USERis equivalent toCREATE ROLEexcept thatCREAT 阅读全文
posted @ 2013-04-26 16:21 Merlin_Tang 阅读(24172) 评论(0) 推荐(4) 编辑
摘要:一、简介PostgreSQL 提供了多个系统管理函数来查看表,索引,表空间及数据库的大小,下面详细介绍一下。二、数据库对象尺寸函数函数名返回类型描述pg_column_size(any)int存储一个指定的数值需要的字节数(可能压缩过)pg_database_size(oid)bigint指定OID的数据库使用的磁盘空间pg_database_size(name)bigint指定名称的数据库使用的磁盘空间pg_indexes_size(regclass)bigint关联指定表OID或表名的表索引的使用总磁盘空间pg_relation_size(relation regclass, fork t 阅读全文
posted @ 2013-04-19 09:56 Merlin_Tang 阅读(52898) 评论(4) 推荐(6) 编辑
摘要:去重的方法一般是找到重复数据中的一条,以某一唯一条件去掉其他重复值。Oracle去重的方法很多,常用的是根据 rowid 进行去重。PostgreSQL 库如何去除单表重复数据呢?可以通过 ctid 进行,下面是实验过程。一、创建测试表david=# create table emp (david(# id int,david(# name varchar);CREATE TABLEdavid=# 二、插入测试数据david=# insert into emp values (1, 'david');INSERT 0 1david=# insert into emp value 阅读全文
posted @ 2013-04-15 14:47 Merlin_Tang 阅读(27686) 评论(3) 推荐(3) 编辑
摘要:PostgreSQL的常用时间函数使用整理如下:一、获取系统时间函数1.1 获取当前完整时间select now();david=# select now(); now ------------------------------- 2013-04-12 15:39:40.399711+08(1 row)david=# current_timestamp 同 now() 函数等效。david=# select current_timestamp; now ------------------... 阅读全文
posted @ 2013-04-15 11:56 Merlin_Tang 阅读(274899) 评论(3) 推荐(4) 编辑
摘要:一、简介序列对象(也叫序列生成器)就是用CREATE SEQUENCE 创建的特殊的单行表。一个序列对象通常用于为行或者表生成唯一的标识符。二、创建序列方法一:直接在表中指定字段类型为serial 类型david=# create table tbl_xulie (david(# id serial,david(# name text);NOTICE: CREATE TABLE will create implicit sequence "tbl_xulie_id_seq" for serial column "tbl_xulie.id"CREATE T 阅读全文
posted @ 2013-04-10 15:52 Merlin_Tang 阅读(134703) 评论(5) 推荐(12) 编辑
摘要:一、简介 在数据库日渐庞大的今天,为了方便对数据库数据的管理,比如按时间,按地区去统计一些数据时,基数过于庞大,多有不便。很多商业数据库都提供分区的概念,按不同的维度去存放数据,便于后期的管理,PostgreSQL也不例外。 PostgresSQL分区的意思是把逻辑上的一个大表分割成物理上的几块儿。分区不仅能带来访问速度的提升,关键的是,它能带来管理和维护上的方便。 分区的具体好处是:某些类型的查询性能可以得到极大提升。更新的性能也可以得到提升,因为表的每块的索引要比在整个数据集上的索引要小。如果索引不能全部放在内存里,那么在索引上的读和写都会产生更多的磁盘访问。批量删除可以用简单的删除... 阅读全文
posted @ 2013-04-09 11:14 Merlin_Tang 阅读(78460) 评论(8) 推荐(14) 编辑
摘要:一、简介PostgreSQL 中有一个很有用处的内置函数generate_series,可以按不同的规则产生一系列的填充数据。二、语法函数参数类型返回类型描述generate_series(start, stop) int 或 bigint setof int 或 setof bigint(与参数类型相同) 生成一个数值序列,从start 到 stop,步进为一generate_series(start, stop, step) int 或 bigintsetof int 或 setof bigint(与参数类型相同) 生成一个数值序列,从start 到 stop,步进为stepgenerat 阅读全文
posted @ 2013-04-03 14:50 Merlin_Tang 阅读(34978) 评论(3) 推荐(4) 编辑
摘要:一、概述: PL/pgSQL函数在第一次被调用时,其函数内的源代码(文本)将被解析为二进制指令树,但是函数内的表达式和SQL命令只有在首次用到它们的时 候,PL/pgSQL解释器才会为其创建一个准备好的执行规划,随后对该表达式或SQL命令的访问都将使用该规划。如果在一个条件语句中,有部分SQL命 令或表达式没有被用到,那么PL/pgSQL解释器在本次调用中将不会为其准备执行规划,这样的好处是可以有效地减少为PL/pgSQL函数里的语句生成 分析和执行规划的总时间,然而缺点是某些表达式或SQL命令中的错误只有在其被执行到的时候才能发现。 由于PL/pgSQL在函数里为一个命令制定了执行计划,.. 阅读全文
posted @ 2012-08-21 12:05 Merlin_Tang 阅读(2838) 评论(1) 推荐(0) 编辑
摘要:一、基本概念: SQL函数可以包含任意数量的查询,但是函数只返回最后一个查询(必须是SELECT)的结果。在简单情况下,返回最后一条查询结果的第一行。如果最后 一个查询不返回任何行,那么该函数将返回NULL值。如果需要该函数返回最后一条SELECT语句的所有行,可以将函数的返回值定义为集合,即SETOF sometype。 SQL函数的函数体应该是用分号分隔的SQL语句列表,其中最后一条语句之后的分号是可选的。除非函数声明为返回void,否则最后一条语句必须是 SELECT。事实上,在SQL函数中,不仅可以包含SELECT查询语句,也可以包含INSERT、UPDATE和DELETE等其... 阅读全文
posted @ 2012-08-21 12:04 Merlin_Tang 阅读(1711) 评论(0) 推荐(0) 编辑
摘要:零、口令文件: 在给出其它PostgreSQL客户端命令之前,我们需要先介绍一下PostgreSQL中的口令文件。之所以在这里提前说明该文件,是因为我们在后面的示例代码中会大量应用该文件,从而保证我们的脚本能够自动化完成。换句话说,如果在客户端命令执行时没有提供该文件,PostgreSQL的所有客户端命令均会被口令输入提示中断。 在当前用户的HOME目录下,我们需要手工创建文件名为 .pgpass的口令文件,这样就可以在我们连接PostgreSQL服务器时,客户端命令自动读取该文件已获得登录时所需要的口令信息。该文件的格式如下: hostname:port:database:username: 阅读全文
posted @ 2012-08-21 12:03 Merlin_Tang 阅读(5372) 评论(0) 推荐(0) 编辑
摘要:一、pg_tables: 该视图提供了对有关数据库中每个表的有用信息地访问。名字类型引用描述schemanamenamepg_namespace.nspname包含表的模式名字。tablenamenamepg_class.relname表的名字。tableownernamepg_authid.rolname表的所有者的名字。tablespacenamepg_tablespace.spcname包含表的表空间名字(如果是数据库缺省,则为 NULL)。hasindexesboolpg_class.relhasindex如果表拥有(或者最近拥有)任何索引,则为真。hasrulesboolpg_cla 阅读全文
posted @ 2012-08-21 12:02 Merlin_Tang 阅读(2324) 评论(0) 推荐(0) 编辑
摘要:一、pg_class: 该系统表记录了数据表、索引(仍然需要参阅pg_index)、序列、视图、复合类型和一些特殊关系类型的元数据。注意:不是所有字段对所有对象类型都有意义。名字类型引用描述relnamename数据类型名字。relnamespaceoidpg_namespace.oid包含这个对象的名字空间(模式)的OI。reltypeoidpg_type.oid对应这个表的行类型的数据类型。relowneroidpg_authid.oid对象的所有者。relamoidpg_am.oid对于索引对象,表示该索引的类型(B-tree,hash)。relfilenodeoid对象存储在磁盘上的文 阅读全文
posted @ 2012-08-21 12:01 Merlin_Tang 阅读(4211) 评论(0) 推荐(1) 编辑
摘要:一、恢复磁盘空间 在PostgreSQL中,使用delete和update语句删除或更新的数据行并没有被实际删除,而只是在旧版本数据行的物理地址上将该行的状态置为已删除或已过期。因此当数据表中的数据变化极为频繁时,那么在一段时间之后该表所占用的空间将会变得很大,然而数据量却可能变化不大。要解决该问题,需要定期对数据变化频繁的数据表执行VACUUM操作。 VACUUM命令存在两种形式,VACUUM和VACUUM FULL,它们之间的区别见如下表格:无VACUUMVACUUMVACUUM FULL删除大量数据之后只是将删除数据的状态置为已删除,该空间不能记录被重新使用。如果删除的记录位于表的末.. 阅读全文
posted @ 2012-08-21 12:00 Merlin_Tang 阅读(3554) 评论(0) 推荐(0) 编辑
摘要:一、概述: 数据库可以被看成是SQL对象(数据库对象)的命名集合,通常而言,每个数据库对象(表、函数等)只属于一个数据库。不过对于部分系统表而言,如 pg_database,是属于整个集群的。更准确地说,数据库是模式的集合,而模式包含表、函数等SQL对象。因此完整的对象层次应该是这样的:服务器、数据库、模式、表或其他类型的对象。 在与数据库服务器建立连接时,该连接只能与一个数据库形成关联,不允许在一个会话中进行多个数据库的访问。如以postgres用户登录,该用户可以访问的缺省数据库为postgres,在登录后如果执行下面的SQL语句将会收到PostgreSQL给出的相关错误信息。 po... 阅读全文
posted @ 2012-08-21 12:00 Merlin_Tang 阅读(3061) 评论(0) 推荐(1) 编辑
摘要:PostgreSQL是通过角色来管理数据库访问权限的,我们可以将一个角色看成是一个数据库用户,或者一组数据库用户。角色可以拥有数据库对象,如表、索引,也可以把这些对象上的权限赋予其它角色,以控制哪些用户对哪些对象拥有哪些权限。 一、数据库角色: 1. 创建角色: CREATE ROLE role_name; 2. 删除角色: DROP ROLE role_name; 3. 查询角色: 检查系统表pg_roles,如: SELECT rolname FROM pg_roles; 也可以在psql中执行\du命令列出所有角色。 二、角色属性: 一个数据库角色可以有一系列属性,这些属性定义他的... 阅读全文
posted @ 2012-08-21 11:59 Merlin_Tang 阅读(1822) 评论(0) 推荐(0) 编辑
摘要:一、服务器进程的启动和关闭: 下面是pg_ctl命令的使用方法和常用选项,需要指出的是,该命令是postgres命令的封装体,因此在使用上比直接使用postgres更加方便。 pg_ctl init[db] [-D DATADIR] [-s] [-o "OPTIONS"] pg_ctl start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o "OPTIONS"] pg_ctl stop [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE] pg_c 阅读全文
posted @ 2012-08-11 15:21 Merlin_Tang 阅读(1390) 评论(0) 推荐(0) 编辑
摘要:一、使用EXPLAIN: PostgreSQL为每个查询都生成一个查询规划,因为选择正确的查询路径对性能的影响是极为关键的。PostgreSQL本身已经包含了一个规划器用于寻找最优规划,我们可以通过使用EXPLAIN命令来查看规划器为每个查询生成的查询规划。 PostgreSQL中生成的查询规划是由1到n个规划节点构成的规划树,其中最底层的节点为表扫描节点,用于从数据表中返回检索出的数据行。然而,不同的扫描节点类型代表着不同的表访问模式,如:顺序扫描、索引扫描,以及位图索引扫描等。如果查询仍然需要连接、聚集、排序,或者是对原始行的其它操作,那么就会在扫描节点"之上"有其它额 阅读全文
posted @ 2012-08-11 14:37 Merlin_Tang 阅读(3838) 评论(0) 推荐(0) 编辑
摘要:在SQL的标准中事物隔离级别分为以下四种: 1. 读未提交(Read uncommitted) 2. 读已提交(Read committed) 3. 可重复读(Repeatable read) 4. 可串行化(Serializable) 然而PostgreSQL在9.1之前的版本中只是实现了其中两种,即读已提交和可串行化,如果在实际应用中选择了另外两种,那么PostgreSQL 将会自动向更严格的隔离级别调整。在PostgreSQL v9.1的版本中提供了三种实现方式,即在原有的基础上增加了可重复读。在这篇博客中我们将只是针对2)和4)进行说明和比较,因为在9.1中,3)和 4)的差别... 阅读全文
posted @ 2012-08-11 12:45 Merlin_Tang 阅读(1190) 评论(0) 推荐(0) 编辑
摘要:一、索引的类型: PostgreSQL提供了多种索引类型:B-Tree、Hash、GiST和GIN,由于它们使用了不同的算法,因此每种索引类型都有其适合的查询类型,缺省时,CREATE INDEX命令将创建B-Tree索引。 1. B-Tree: CREATE TABLE test1 ( id integer, content varchar ); CREATE INDEX test1_id_index ON test1 (id); B-Tree索引主要用于等于和范围查询,特别是当索引列包含操作符" <、<=、=、>=和>"作为查询条件时,Postg 阅读全文
posted @ 2012-08-11 12:44 Merlin_Tang 阅读(2028) 评论(0) 推荐(0) 编辑
摘要:一、逻辑操作符: 常用的逻辑操作符有:AND、OR和NOT。其语义与其它编程语言中的逻辑操作符完全相同。二、比较操作符: 下面是PostgreSQL中提供的比较操作符列表:操作符描述 <小于 >大于 <=小于或等于 >=大于或等于 =等于 !=不等于 比较操作符可以用于所有可以比较的数据类型。所有比较操作符都是双目操作符,且返回boolean类型。除了比较操作符以外,我们还可以使用BETWEEN语句,如: a BETWEEN x AND y 等效于 a >= x AND a <= y a NOT BETWEEN x AND y 等效于 a < x OR 阅读全文
posted @ 2012-08-11 12:41 Merlin_Tang 阅读(21734) 评论(0) 推荐(0) 编辑