当WHERE子句谓词中使用的所有列都是索引的一部分时,DB2优化器将选择直接索引查找。
例如,如果我们有如下所示的ORDERS DB2表。
ORDER_ID | 订购日期 | 合计订单 |
Z22345 | 2020年10月30日 | 342 |
Z33412 | 2020年8月14日 | 543 |
Z56990 | 2020年10月19日 | 431 |
Z56902 | 2020年9月21日 | 6743 |
Z99781 | 2020/04/11 | 443 |
Z56112 | 2020年9月29日 | 889 |
在此表中,建立了一个索引,该索引具有名为ORDER_ID和ORDER_DATE的列。对于以下查询,DB2优化器将选择直接索引查找,因为SELECT语句中使用的列也是索引的一部分。
SELECT ORDER_ID, ORDER_DATE, INVOICE_ID FROM ORDERS WHERE ORDER_ID = ‘Z33412’ AND ORDER_DATE = ‘14-08-2020’
以上查询的结果如下。
ORDER_ID | 订购日期 |
Z33412 | 2020年8月14日 |
在上面的查询中,WHERE子句在作为主键一部分的两列上都有谓词,因此它们的索引应该已经存在。在这种情况下,优化器可以使用这些索引在索引空间中查找并从数据空间检索相应的数据(在这种情况下为INVOICE_ID)。
与其他访问方法相比,这种访问方法非常快,因为优化程序不必在数据页中查找所需的数据。所有信息都已在索引页中,这大大降低了SQL成本。
理想情况下,仅当我们只需要检查表中行/数据是否存在时,才使用这些类型的查询。