目录
并发控制
金仓分析型数据库使用一种多版本模型来维护数据一致性,即多版本并发控制(MVCC)。 MVCC 为每一个数据库会话实现了事务隔离,并且每一个查询事务会看到一个数据的快照。 这保证该事务会看到一致的不受其他并发事务影响的数据。因为MVCC不会为并发控制使用显式锁,锁竞争被最小化并且数据库在多用户环境中维持了合理的性能。为查询(读取)数据获得的 锁不与为写数据获得的锁冲突。数据库提供了多种锁模式来控制对表中数据的并发访问。对于不能轻易适应于MVCC行为的应用,可以使用 LOCK 命令来获取显式锁。 不过,MVCC的正确使用通常能提供更好的性能。
锁模式
|
相关的SQL命令
|
冲突模式
|
ACCESS SHARE
|
SELECT
|
ACCESS EXCLUSIVE
|
ROW SHARE
|
SELECT FOR SHARE,SE
LECT...FOR UPDATE
|
EXCLUSIVE,ACCESS EXCLUSIVE
|
ROW EXCLUSIVE
|
INSERT,COPY
|
SHARE,SHARE ROW EXCLUSIVE, EXCLUSIVE,ACCESS EXCLUSIVE
|
SHARE UPDATE EXCLUSIVE
|
VACUUM,ANALYZE
|
SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE,EXCLUSIVE, ACCESS EXCLUSIVE
|
SHARE
|
CREATE INDEX
|
ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE
|
SHARE ROW EXCLUSIVE
|
ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE
| |
EXCLUSIVE
|
DELETE, UPDATE, SELE
CT...FOR UPDATE
|
ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE,EXCLUSIVE, ACCESS EXCLUSIVE
|
ACCESS EXCLUSIVE
|
ALTER TABLE, DROP TABLE, TRUNCATE,
REINDEX, CLUSTER,
VACUUM FULL
|
ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE ,SHARE UPDATE EXCLUSIVE, SHARE, SHARE
ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE
|
当分布式死锁检测开启时,运行在堆表上的 DELETE, UPDATE和 SELECT...FOR UPDATE 的锁模式是 ROW EXCLUSIVE的。
插入行
使用 INSERT 命令在一个表中创建行。 这个命令要求该表的名称和表中每一个列的值, 可以选择性地以任意顺序指定列名。 如果没有指定列名,以那些列在表中的顺序列出数据值,用逗号分隔它们。
例如,指定要插入的列名和值:
INSERT INTO products (name, price, product_no) VALUES ('Cheese', 9.99, 1);
通常,数据值都是常量,但也可以使用标量表达式。例如:
INSERT INTO films SELECT * FROM tmp_films WHERE date_prod <'2016-05-07';
可以在单个命令中插入多行。例如:
INSERT INTO products (product_no, name, price) VALUES
(1, 'Cheese', 9.99),
(2, 'Bread', 1.99),
(3, 'Milk', 2.99);
要插入数据到一个分区表,应指定根分区表,即用 CREATE TABLE 命令创建 的表。 也可以在一个INSERT 命令中指定该分区表的一个叶子子表。如果数据对于指定的叶子子表无效,会返回一个错误。 不支持在INSERT 命令中指定一个不是叶子子表的子表。要插入大量数据,使用外部表或者COPY 命令。对于插入大量行,这些装载机制比INSERT 更加有效。
追加优化表的存储模型是为批量数据装载而优化。不推荐对追加优化表的单行 INSERT 语句。对于追加优化表,数据库支持最多127个并发INSERT 事务插入到一个追加优化表。
更新现有行
UPDATE 命令在一个表中更新行。可以更新一个表中所有的行、所有行的一个子集或者单个行。可以单独更新每一列而不影响其他列。
- 要更新的表和列的名称
-
这些列的新值
-
指定要更新的行的一个或者更多条件
例如,下面的命令把所有价格为5 的产品更新为价格为 10:
UPDATE products SET price = 10 WHERE price = 5;
删除行
DELETE命令从一个表中删除行。指定一个WHERE子句可以删除满足特定条件的行。 如果不指定WHERE 子句,该表中所有的行都会被删除。 其结果是一个合法的但为空的表。例如,从产品表中删除所有价格为10的行:
DELETE FROM products WHERE price = 10;
DELETE FROM products;
截断一个表
使用TRUNCATE命令可以快速地移除一个表中的所有行。例如:
TRUNCATE mytable;
清理数据库
虽然新事务看不到被删除或者被更新的数据行,但是它们仍然在磁盘上占用物理空间。周期性地运行VACUUM命令可以移除这些过期的行。例如:
VACUUM mytable;