从事数据库工作多年,目前看好分布式NeSQL/HTAP数据库在企业客户市场的发展。未来的主要方向是——致力于 NewSQL/HTAP 数据库的推广普及。
分类: Sybase
2014-01-03 13:17:55
2. 创建列表和索引
列表适用于如下一些场景:
* 通常只是在一个或少量列上执行计算操作
* 表在进行搜索时通常基于少量列上的值
* 表有很多列
* 表有很多行,并且通常进行的是列式操作(比如:聚集计算和where中字段值查找)
* 需要很高的压缩率。
我们来看一些列子
--例1
CREATE COLUMN TABLE tpch.nation
(n_nationkey INT NOT NULL,
n_name CHAR(25),
n_regionkey INT,
n_comment VARCHAR(152),
PRIMARY KEY(n_nationkey)
)
--例2(分区,只适用于列表,分区键必须是主键的一部分)
CREATE COLUMN TABLE tpch.lineitem
(l_orderkey INT NOT NULL,l_partkey INT,
l_suppkey INT,l_linenumber INT NOT NULL,
l_quantity DECIMAL(10,2),l_extendedprice DECIMAL(10,2),
l_discount DECIMAL(10,2),l_tax DECIMAL(10,2),
l_returnflag CHAR(1),l_linestatus CHAR(1),
l_shipdate DATE,l_commitdate DATE,l_receiptdate DATE,
l_shipinstruct CHAR(25),l_shipmode CHAR(10),
l_comment VARCHAR(44),
PRIMARY KEY INVERTED VALUE (l_orderkey,l_linenumber)
)
PARTITION BY HASH (l_orderkey,l_linenumber) PARTITIONS 4,
RANGE (l_shipdate) (
PARTITION '2011/01/01'<= VALUES <'2011/04/01',
PARTITION '2011/04/01'<= VALUES <'2011/07/01',
PARTITION '2011/07/01'<= VALUES <'2011/10/01',
PARTITION OTHERS)
注意:对于HANA来说,行表不支持分区,只有列表支持。列表的一个分区最多支持21亿条记录,为了在列表中存放更多的记录,需要使用分区。
在上面的创建列表的例子中,我们指定的“UNIQUE”或“PRIMARY KEY”约束,HANA会自动创建相应的索引。这些索引分为两种类型(仅适用于列表)
* INVERTED VALUE 适合于范围查询或like查询
* INVERTED HASH 使用HASH对组合唯一键或组合主键进行编码和压缩。对于等值查询(点查询),这种索引类型具有更好的性能;并且能够减少组合主键存储使用的内存数量。
如果不指定,缺省是 INVERTED VALUE。上面的INVERTED VALUE和INVERTED HASH 仅在UNIQUE和PRIMARY KEY约束中使用。下面是指定的示例
PRIMARY KEY INVERTED VALUE (l_orderkey,l_linenumber)
PRIMARY KEY INVERTED HASH (l_orderkey,l_linenumber)
UNIQUE INVERTED VALUE (l_orderkey,l_linenumber)
UNIQUE INVERTED HASH (l_orderkey,l_linenumber)
创建列表上的索引
列表的主键或唯一键定义的索引是主索引。在列表上还可以创建辅助索引。创建索引的基本语法如下:
CREATE INDEX
下面是一个示例:
CREATE INDEX idx_phone ON tpch.customer(c_phone)
3. 列表的延迟加载和预加载 (行表不支持)
SAP HANA 缺省情况下对列表采用的是延迟载机制。如果想在SAP HANA实例启动过程中对指定的列表数据进行加载,那么可以对表进行预加载设置。
示例1:
ALTER TABLE EMP PRELOAD ALL; --预加载所有列的所有数据
示例2:
ALTER TABLE EMP PRELOAD (EMPNO,ENAME); --预加载指定的列
示例3:
ALTER TABLE EMP PRELOAD NONE –清除表中所有字段的预加载标志
使用下面的查询可以查看表或字段的预加载标志:
SELECT IS_PRELOAD FROM SYS.TABLES WHERE TABLE_NAME=‘LINEITEM’
SELECT PRELOAD from SYS.TABLE_COLUMNS WHERE TABLE_NAME=‘LINEITEM'
4. 列表的加载和卸载
可以把指定的表从内存中卸载,释放其占用的内存。也可以把已经卸载的表重新转载的内存中。只能对COLUMN TABLE进行这些操作
示例1:
UNLOAD tpch.lineitem;
示例2:
LOAD tpch.customer DELTA ; --把列表的delta部分加载到内存
LOAD tpch.customer ALL; --把列表所有部分,包括delta加载到内存
5. 行表列表之间的转换
HANA支持行表转换为列表,或者列表转换为行表。示例如下:
ALTER TABLE accounts COLUMN THREADS 10 BATCH 10000 --行转列
ALTER TABLE accounts ROW THREADS 10 --列表转为行表