第三章 分布式数据库的查询处理和优化
1 基本概念
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。
SQL-92标准所定义的FROM子句的连接语法格式为:
FROM join_table join_type join_table
[ON (join_condition)]
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。 join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 数据行。交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接。
下面就是交叉连接:
INPUT:
SELECT * FROM TABLE1
OUTPUT:
ROW REMARKS
========== =======
row 1 Table 1
row 2 Table 1
row 3 Table 1
row 4 Table 1
INPUT:
SELECT * FROM TABLE2
OUTPUT:
ROW REMARKS
========== ========
row 1 table 2
row 2 table 2
row 3 table 2
row 4 table 2
To join these two tables, type this:
INPUT:
SELECT * FROM TABLE1,TABLE2
OUTPUT:
ROW REMARKS ROW REMARKS
========== ========== ========== ========
row 1 Table 1 row 1 table 2
row 1 Table 1 row 2 table 2
row 1 Table 1 row 3 table 2
row 1 Table 1 row 4 table 2
row 2 Table 1 row 1 table 2
row 2 Table 1 row 2 table 2
row 2 Table 1 row 3 table 2
row 2 Table 1 row 4 table 2
row 3 Table 1 row 1 table 2
row 3 Table 1 row 2 table 2
row 3 Table 1 row 3 table 2
row 3 Table 1 row 4 table 2
row 4 Table 1 row 1 table 2
row 4 Table 1 row 2 table 2
row 4 Table 1 row 3 table 2
row 4 Table 1 row 4 table 2
2 各种连接查询实例
基本表:
(1)CUSTOMER表
INPUT:
SELECT * FROM CUSTOMER
OUTPUT:
NAME ADDRESS STATE ZIP PHONE REMARKS
========== ========== ====== ========== ========= ==========
TRUE WHEEL 55O HUSKER NE 58702 555-4545 NONE
BIKE SPEC CPT SHRIVE LA 45678 555-1234 NONE
LE SHOPPE HOMETOWN KS 54678 555-1278 NONE
AAA BIKE 10 OLDTOWN NE 56784 555-3421 JOHN-MGR
JACKS BIKE 24 EGLIN FL 34567 555-2314 NONE
(2) PART表
INPUT:
SELECT * FROM PART
OUTPUT:
PARTNUM DESCRIPTION PRICE
=========== ==================== ===========
54 PEDALS 54.25
42 SEATS 24.50
46 TIRES 15.25
23 MOUNTAIN BIKE 350.45
76 ROAD BIKE 530.00
10 TANDEM 1200.00
(3) ORDERINFO表
INPUT:
SELECT * FROM ORDERINFO
OUTPUT:
ORDEREDON NAME PARTNUM QUANTITY REMARKS
=========== ========== =========== =========== =======
15-MAY-1996 TRUE WHEEL 23 6 PAID
19-MAY-1996 TRUE WHEEL 76 3 PAID
2-SEP-1996 TRUE WHEEL 10 1 PAID
30-JUN-1996 TRUE WHEEL 42 8 PAID
30-JUN-1996 BIKE SPEC 54 10 PAID
30-MAY-1996 BIKE SPEC 10 2 PAID
30-MAY-1996 BIKE SPEC 23 8 PAID
17-JAN-1996 BIKE SPEC 76 11 PAID
17-JAN-1996 LE SHOPPE 76 5 PAID
1-JUN-1996 LE SHOPPE 10 3 PAID
1-JUN-1996 AAA BIKE 10 1 PAID
1-JUL-1996 AAA BIKE 76 4 PAID
1-JUL-1996 AAA BIKE 46 14 PAID
11-JUL-1996 JACKS BIKE 76 14 PAID
2.1 交叉连接
SELECT O.ORDEREDON, O.NAME, O.PARTNUM, P.PARTNUM, P.DESCRIPTION
FROM ORDERINFO O, PART P
结果如图3.1,可见结果与交叉连接相同。结果为84(14*6)行。
图3.1
2.2 等值连接
SELECT O.ORDEREDON, O.NAME, O.PARTNUM, P.PARTNUM, P.DESCRIPTION
FROM ORDERS O, PART P
WHERE O.PARTNUM = P.PARTNUM
结果如图3.2
图3.2
自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 结果集合中所包括的列,并删除连接表中的重复列。
2.3 不等值连接
SELECT O.NAME, O.PARTNUM, P.PARTNUM, O.QUANTITY * P.PRICE TOTAL
FROM ORDERS O, PART P
WHERE O.PARTNUM > P.PARTNUM
2.4 内连接
SELECT P.PARTNUM, P.DESCRIPTION,P.PRICE,O.NAME, O.PARTNUM
FROM PART P
JOIN ORDERINFO O ON O.PARTNUM = 54
如图3.3
图3.3
2.5 右连接
SELECT P.PARTNUM, P.DESCRIPTION,P.PRICE,O.NAME, O.PARTNUM
FROM PART P
RIGHT OUTER JOIN ORDERINFO O ON O.PARTNUM = 54
如图3.4,右连接补全右表
图3.4
2.6 左连接
SELECT P.PARTNUM, P.DESCRIPTION,P.PRICE,
O.NAME, O.PARTNUM
FROM PART P
LEFT OUTER JOIN ORDERINFO O ON O.PARTNUM = 10
图3.5,左边补全。
图3.5
2.7 自连接
INPUT:
SELECT * FROM TABLE1, TABLE1
OUTPUT:
ROW REMARKS ROW REMARKS
========== ========== ========== ========
row 1 Table 1 row 1 Table 1
row 1 Table 1 row 2 Table 1
row 1 Table 1 row 3 Table 1
row 1 Table 1 row 4 Table 1
row 2 Table 1 row 1 Table 1
row 2 Table 1 row 2 Table 1
row 2 Table 1 row 3 Table 1
row 2 Table 1 row 4 Table 1
row 3 Table 1 row 1 Table 1
row 3 Table 1 row 2 Table 1
row 3 Table 1 row 3 Table 1
row 3 Table 1 row 4 Table 1
row 4 Table 1 row 1 Table 1
row 4 Table 1 row 2 Table 1
...
自连接的上述写法在实际应用中不一定能。比如微软SQLSERVER有其自身的规定,详见帮助文档。上述写法在其中是不可以的。
2.8 半连接
SELECT P.PARTNUM, P.DESCRIPTION,P.PRICE,O.NAME
FROM PART P
JOIN ORDERINFO O ON O.PARTNUM = 54
如图3.6
图 3.6
3 查询处理和优化
3.1 基于关系代数等价变换的优化算法
一般策略:
1.选择、投影运算应尽可能先做,以减少中间结果
2.在执行连接前对数据库数据做适当的预处理,如排序、索引等以减少扫描次数,提高连接速度
3. 同时执行一串投影、选择操作,且尽可能与其前后的双目运算结合起来,以避免重复扫描关系和减少中间数据
4. 找出公共子表达式等
3.2 基于半连接/直接连算法的查询优化
采用半连接对连接操作的查询优化,其目的是减少(降低)通讯量,但会导致通讯次数的增加和本地处理时间的增加。
若传输费用是主要的,则采用半连接方案。
若局部处理费用是主要的,则采用直接连接方案。
四种处理直接连接查询优化算法
(1) 利用站点依赖信息的算法
(2) 分片和复制算法
(3) 站点依赖和数据复制结合
(4) Hash划分算法
3.3 Bloom Filter
压缩方式:为了减小通讯开销,数据必须经压缩后再发送。目前Bloom Filter是最常见的压缩方式。Bloom Filter是一种基于哈希的数据结构,它能够提取出一个较小集合中的内容信息,并以较高的成功率进行匹配。如果两个结点上的倒排表需要求交,结点A 可以压缩其倒排表并发送Bloom Filter到另一个结点B。结点B将bloom filter与其上存储的倒排表求交,再将结果压缩并返回A。结点A就可以对结果进行整理后返回给用户。[19]
4 小结
本章主要讲解了分布式的查询优化。缺泛分布式数据库系统,对其中的内容可以理解,不太容易验证。