Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle11g Oracle索引组织表(IOT)按主键后缀排序优于按主键前缀排序_Oracle11g_Database Performance_Query Performance - Fatal编程技术网

Oracle11g Oracle索引组织表(IOT)按主键后缀排序优于按主键前缀排序

Oracle11g Oracle索引组织表(IOT)按主键后缀排序优于按主键前缀排序,oracle11g,database-performance,query-performance,Oracle11g,Database Performance,Query Performance,对于一个有550m行的表,我使用索引组织表(IOT)。主键由两列(id1和id2)组成,这两列也是指向其他两个表的外键(id1 FK指向表1,id2 FK指向表2) 在使用物联网时,根据Oracle文档(),按主键前缀排序应该比按主键后缀排序快。实际上,行是根据主键和组成主键的列的顺序排序的 然而,以下是我在将IOT与其他两个表合并时得到的解释计划,我尝试按id1或id2订购。我希望通过按id1排序得到更好的成本。但事实并非如此 id1使用的值对应于表1中总共489000行中的58000行。id

对于一个有550m行的表,我使用索引组织表(IOT)。主键由两列(id1和id2)组成,这两列也是指向其他两个表的外键(id1 FK指向表1,id2 FK指向表2)

在使用物联网时,根据Oracle文档(),按主键前缀排序应该比按主键后缀排序快。实际上,行是根据主键和组成主键的列的顺序排序的

然而,以下是我在将IOT与其他两个表合并时得到的解释计划,我尝试按id1或id2订购。我希望通过按id1排序得到更好的成本。但事实并非如此

id1使用的值对应于表1中总共489000行中的58000行。id2使用的值对应于表2中总共248900行中的760行

SQL查询:

SELECT a.id1, a.id2, a.some_column
FROM iot_table a
INNER JOIN table1 t1 ON t1.id = a.id1
INNER JOIN table2 t2 ON t2.id = a.id2
WHERE t1.col_x = x AND t2.col_y = y
ORDER BY {a.id1|a.id2};
按id1解释计划顺序:

--------------------------------------------------------------------------------------------------------                                                                                                                                                                                                     
| Id  | Operation                      | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                                                                                                     
--------------------------------------------------------------------------------------------------------                                                                                                                                                                                                     
|   0 | SELECT STATEMENT               |                       |       |       | 11243 (100)|          |                                                                                                                                                                                                     
|   1 |  NESTED LOOPS                  |                       |  1311K|    42M| 11243   (1)| 00:01:44 |                                                                                                                                                                                                     
|   2 |   MERGE JOIN CARTESIAN         |                       |    46M|   842M| 11173   (1)| 00:01:43 |                                                                                                                                                                                                     
|*  3 |    TABLE ACCESS BY INDEX ROWID | TABLE1                | 58152 |   511K|  4745   (1)| 00:00:44 |                                                                                                                                                                                                     
|   4 |     INDEX FULL SCAN            | TABLE1_ID1_IDX        |   488K|       |    15   (0)| 00:00:01 |                                                                                                                                                                                                     
|   5 |    BUFFER SORT                 |                       |   799 |  7990 |  6429   (1)| 00:01:00 |                                                                                                                                                                                                     
|   6 |     TABLE ACCESS BY INDEX ROWID| TABLE2                |   799 |  7990 |     1   (0)| 00:00:01 |                                                                                                                                                                                                     
|*  7 |      INDEX RANGE SCAN          | TABLE2_COL_Y_IDX      |   799 |       |     1   (0)| 00:00:01 |                                                                                                                                                                                                     
|*  8 |   INDEX UNIQUE SCAN            | IOT_TABLE_PK          |     1 |    15 |     1   (0)| 00:00:01 |                                                                                                                                                                                                     
-------------------------------------------------------------------------------------------------------- 

按id2说明计划顺序:

--------------------------------------------------------------------------------------------------------                                                                                                                                                                                                     
| Id  | Operation                      | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                                                                                                     
--------------------------------------------------------------------------------------------------------                                                                                                                                                                                                     
|   0 | SELECT STATEMENT               |                       |       |       |  5159 (100)|          |                                                                                                                                                                                                     
|   1 |  NESTED LOOPS                  |                       |  1311K|    42M|  5159   (2)| 00:00:48 |                                                                                                                                                                                                     
|   2 |   MERGE JOIN CARTESIAN         |                       |    46M|   842M|  5089   (1)| 00:00:47 |                                                                                                                                                                                                     
|*  3 |    TABLE ACCESS BY INDEX ROWID | TABLE2                |   799 |  7990 |  2512   (1)| 00:00:24 |                                                                                                                                                                                                     
|   4 |     INDEX FULL SCAN            | TABLE2_ID2_IDX        |   248K|       |    28   (0)| 00:00:01 |                                                                                                                                                                                                     
|   5 |    BUFFER SORT                 |                       | 58152 |   511K|  2577   (2)| 00:00:24 |                                                                                                                                                                                                     
|   6 |     TABLE ACCESS BY INDEX ROWID| TABLE1                | 58152 |   511K|     3   (0)| 00:00:01 |                                                                                                                                                                                                     
|*  7 |      INDEX RANGE SCAN          | TABLE1_COL_X_IDX      | 58152 |       |     1   (0)| 00:00:01 |                                                                                                                                                                                                     
|*  8 |   INDEX UNIQUE SCAN            | IOT_TABLE_PK          |     1 |    15 |     1   (0)| 00:00:01 |                                                                                                                                                                                                     
-------------------------------------------------------------------------------------------------------- 
我想知道为什么按id1排序的成本最低,而行应该主要根据此列进行排序,Oracle只需按原样浏览IOT B*-树

谢谢你的帮助


我使用Oracle 11.2 g,并且统计数据是最新的。

如果删除其中一个连接,行为将变得正常:按主键的第一部分排序效率更高。我仍然不明白发生了什么。如果我只是删除ORDERBY子句,行将按id2排序。这与在这个查询中按id2排序更好的事实是一致的。但为什么在这个查询中,行是按id2“自然”排序的,而在IOT本身和所有其他只涉及1个连接或根本不涉及连接的查询中,行是按id1排序的?