这是我做的网站,做网站官网好处,济南城乡建设局,下沙网站制作驱动表普遍认为是由SQL语句的写法决定的#xff0c;简单的说#xff0c;就是FROM语句后面的表列表中的最后一个。由于SQL语句是从后向前进行分析#xff0c;Oracle会根据FROM语句从后到前将各个表依次连接起来。SQL CREATE TABLE T1 AS SELECT * FROM USER_TABLES;表已创…驱动表普遍认为是由SQL语句的写法决定的简单的说就是FROM语句后面的表列表中的最后一个。由于SQL语句是从后向前进行分析Oracle会根据FROM语句从后到前将各个表依次连接起来。SQL CREATE TABLE T1 AS SELECT * FROM USER_TABLES;表已创建。SQL CREATE TABLE T2 AS SELECT * FROM USER_INDEXES;表已创建。SQL SET AUTOT ON EXP SQL SELECT COUNT(*) FROM T1, T2 2 WHERE T1.TABLE_NAME T2.TABLE_NAME;COUNT(*) ---------- 37Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT ptimizerCHOOSE 1 0 SORT (AGGREGATE) 2 1 MERGE JOIN 3 2 SORT (JOIN) 4 3 TABLE ACCESS (FULL) OF T2 5 2 SORT (JOIN) 6 5 TABLE ACCESS (FULL) OF T1SQL SELECT COUNT(*) FROM T2, T1 2 WHERE T1.TABLE_NAME T2.TABLE_NAME;COUNT(*) ---------- 37Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT ptimizerCHOOSE 1 0 SORT (AGGREGATE) 2 1 MERGE JOIN 3 2 SORT (JOIN) 4 3 TABLE ACCESS (FULL) OF T1 5 2 SORT (JOIN) 6 5 TABLE ACCESS (FULL) OF T2根据这个例子可以看出SQL语句的写法对于驱动表的影响。然而实际上驱动表和连接顺序的选择要比上面的观点复杂的多下面对稍微调整一下这个例子。SQL ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY (TABLE_NAME);表已更改。SQL SELECT COUNT(*) FROM T1, T2 2 WHERE T1.TABLE_NAME T2.TABLE_NAME;COUNT(*) ---------- 37Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT ptimizerCHOOSE 1 0 SORT (AGGREGATE) 2 1 NESTED LOOPS 3 2 TABLE ACCESS (FULL) OF T2 4 2 INDEX (UNIQUE SCAN) OF PK_T1 (UNIQUE)SQL SELECT COUNT(*) FROM T2, T1 2 WHERE T1.TABLE_NAME T2.TABLE_NAME;COUNT(*) ---------- 37Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT ptimizerCHOOSE 1 0 SORT (AGGREGATE) 2 1 NESTED LOOPS 3 2 TABLE ACCESS (FULL) OF T2 4 2 INDEX (UNIQUE SCAN) OF PK_T1 (UNIQUE)仅仅是给T1增加了一个主键就发现不管SQL语句怎么写驱动表都是T2。即使是RBO确定表连接顺序的规则也是比较复杂的1.优化器产生一系列连接顺序每次均把不同的表作为驱动表。而且优化器根据下面的算法产生每个连接顺序。为了确定连接顺序中各个表的位置优化器根据RBO执行计划的排名在剩余的表中找到表访问路径排名最高的表然后不断的重复这个过程依次确定连接顺序中每个表的前后顺序。对于连接顺序中的每张表优化器根据执行计划的排名选择一种连接方式将当前表和前面的表或数据源连接在一起。2.优化器在执行计划的结果集中进行选择。优化器的目标是最大程度的选择内部表采用索引扫描方式的NESTED LOOPS连接操作。通常情况下优化器在选择执行计划时不会考虑表在FROM语句中出现的顺序。优化器依次根据下面的规则来作出选择优化器选择执行计划使得内部表为全表扫描的NESTED LOOPS连接尽可能的少如果采用上面的条件出现了平局的情况则优化器选择尽可能少出现SORT MERGE操作的执行计划如果仍然出现平局的情况则优化器将选择表访问路径中排名最高的表作为驱动表如果这时仍然是平局则优化器会把FROM语句中最后出现的表最为驱动表。