技术开发 频道

行式数据库PostgreSQL 9.04版本评测

  3.测试数据和查询语句的产生步骤

  主要步骤参照本系列第一篇文章《Oracle 11g R2企业版评测》。然后需要针对PostgreSQL的特性作修改。

  PostgreSQLr对SQL语句的特殊要求只有1点:

  日期间隔的表达式。不支持interval 'n' year/month等SQL 92写法,要改为interval 'n year'和interval 'n month'。

  将修改完成后的22个查询语句保存为mssql_tpch.sql文件。同时在文件开始处加入\timing

  以显示SQL运行时间。

  4.数据压缩测试

  PostgreSQL的压缩功能和其他数据库有所区别。数据库并没有显式的表压缩命令。只有一个TOAST技术与压缩有关。

  因为PostgreSQL的页面大小是固定的(通常是8Kb),并且不允许元组跨越多个页面,因此不可能直接存储非常大的字段值。在 PostgreSQL 7.1 之前,代码里有一个硬限制,限制了一个表中一个数据行存储的数据的总大小为刚好略小于一个页面。从版本 7.1 以及以后的版本开始,这个限制被克服了,方法是允许大的字段值被压缩和/或打碎成多个物理行。这些事情对用户都是透明的,只是在后端代码上有一些小的影响。这个技术的简称是TOAST(超尺寸字段存储技术-The Oversized-Attribute Storage Technique)。

  TOAST技术只有在变长的且记录长度可能超过1个页面时才会启用,对于tpch测试数据,最长的记录不超过1KB,因此不存在这种可能性。

  5.数据查询

  由于原始没有添加主键和外键的表执行查询的速度相当慢,比如第2个查询,基本不可能在可接受的时间内获得结果,因此,不进行原始表的测试,只测试添加主键和外键后的结果。由于PostgreSQL在添加外键时并不创建相应列上的索引,而索引对查询影响较大,故分别测试只添加外键和添加外键列上的索引二种情况。

  添加主键和外键的步骤如下:

pgdb=# \i /user1/postgresql/data/dss.ri

psql:
/user1/postgresql/data/dss.ri:18: NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "region_pkey" for table "region"
ALTER TABLE
Time:
92.402 ms
psql:
/user1/postgresql/data/dss.ri:22: NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "nation_pkey" for table "nation"
ALTER TABLE
Time:
1.972 ms
psql:
/user1/postgresql/data/dss.ri:31: NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "part_pkey" for table "part"
ALTER TABLE
Time:
3782.712 ms
psql:
/user1/postgresql/data/dss.ri:37: NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "supplier_pkey" for table "supplier"
ALTER TABLE
Time:
111.763 ms
psql:
/user1/postgresql/data/dss.ri:46: NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "partsupp_pkey" for table "partsupp"
ALTER TABLE
Time:
15464.902 ms
psql:
/user1/postgresql/data/dss.ri:52: NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "customer_pkey" for table "customer"
ALTER TABLE
Time:
2647.225 ms
psql:
/user1/postgresql/data/dss.ri:61: NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "lineitem_pkey" for table "lineitem"
ALTER TABLE
Time:
111591.310 ms
psql:
/user1/postgresql/data/dss.ri:67: NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "orders_pkey" for table "orders"
ALTER TABLE
Time:
25732.725 ms

pgdb
=# VACUUM ANALYZE;
VACUUM
Time:
5025.876 ms

--原始脚本创建外键约束的SQL格式不符合PostgreSQL的要求,修改后重新执行
pgdb=# ALTER TABLE NATION
pgdb
-# ADD CONSTRAINT NATION_FK1 FOREIGN KEY (N_REGIONKEY) references REGION;
ALTER TABLE
Time:
52.767 ms
pgdb
=# ALTER TABLE SUPPLIER
pgdb
-# ADD CONSTRAINT SUPPLIER_FK1 FOREIGN KEY  (S_NATIONKEY) references NATION;
ALTER TABLE
Time:
48.209 ms
pgdb
=# ALTER TABLE CUSTOMER
pgdb
-# ADD CONSTRAINT CUSTOMER_FK1 FOREIGN KEY  (C_NATIONKEY) references NATION;
ALTER TABLE
Time:
700.381 ms
pgdb
=# ALTER TABLE PARTSUPP
pgdb
-# ADD CONSTRAINT PARTSUPP_FK2 FOREIGN KEY (PS_PARTKEY) references PART;
ALTER TABLE
Time:
8117.485 ms
pgdb
=# ALTER TABLE ORDERS
pgdb
-# ADD CONSTRAINT ORDERS_FK1 FOREIGN KEY  (O_CUSTKEY) references CUSTOMER;
ALTER TABLE
Time:
20213.284 ms
pgdb
=# ALTER TABLE LINEITEM
pgdb
-# ADD CONSTRAINT LINEITEM_FK1 FOREIGN KEY (L_ORDERKEY)  references ORDERS;
ALTER TABLE
Time:
60656.277 ms
pgdb
=# ALTER TABLE LINEITEM
pgdb
-# ADD CONSTRAINT LINEITEM_FK2 FOREIGN KEY (L_PARTKEY,L_SUPPKEY) references
pgdb
-#         PARTSUPP;
ALTER TABLE
Time:
204054.318 ms
pgdb
=# VACUUM ANALYZE;
VACUUM
Time:
5153.792 ms

   尽管创建了主键,还是有2个查询,第17和第20个查询语句无法在可接受的时间内执行完成,为了得到全部查询结果,我们在主键列上创建索引。

0