题目:某些SELECT语句中的WHERE子句不使用索引,以下说法正确的是()
A、where语句中使用到"!=",将不使用索引
B、where语句中使用"||",将不使用索引
C、where语句中使用"+",将不使用索引
D、以上说法都正确
结果:D
解释:
A:"!="不会使用索引,因为索引只能告诉你什么存在于表中,而不能告诉你什么不存在于表中,例子如下:
不会使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT != 0;
使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT > 0;
B:"||"是字符连接函数,所有的函数都不会使用索引,例子如下:
不使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA';
使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = 'AMEX'
AND ACCOUNT_TYPE = 'A';
C:"+"是数学函数,所有的函数都不会使用索引,例子如下:
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT + 3000 > 5000;
使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT > 2000 ;
D:因为上面的三个都正确,所以D项正确
延伸:
相同的索引列不能互相比较,,否则将会启用全表扫描,例子如下:
不使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = NVL(ACC_NAME,ACCOUNT_NAME);
上面的是Oracle中的例子,NVL()函数中的第一个参数如果为null,就返回第二个参数
如果一定要对使用函数的列启用索引,ORACLE新的功能是 基于函数的索引(Function-Based Index) 也许是一个较好的方案。