会,oracle很智能的,注释不影响sql的执行计划,该走索引的还是会走索引的
② 分析SQL执行过程中,哪些SQL条件会走索引
这样回答你,以下几种情况sql中索引不会被用到
1、查询谓词没有使用索引的主要边界,换句话说就是select *,可能会导致不走索引。
比如,你查询的是SELECT * FROM T WHERE Y=XXX;假如你的T表上有一个包含Y值的组合索引,但是优化器会认为需要一行行的扫描会更有效,这个时候,优化器可能会选择TABLE ACCESS FULL,但是如果换成了SELECT Y FROM T WHERE Y = XXX,优化器会直接去索引中找到Y的值,因为从B树中就可以找到相应的值。
2、单键值的b树索引列上存在null值,导致COUNT(*)不能走索引。
如果在B树索引中有一个空值,那么查询诸如SELECT COUNT(*) FROM T 的时候,因为HASHSET中不能存储空值的,所以优化器不会走索引,有两种方式可以让索引有效,一种是SELECT COUNT(*) FROM T WHERE XXX IS NOT NULL或者把这个列的属性改为not null (不能为空)。
3、索引列上有函数运算,导致不走索引
如果在T表上有一个索引Y,但是你的查询语句是这样子SELECT * FROM T WHERE FUN(Y) = XXX。这个时候索引也不会被用到,因为你要查询的列中所有的行都需要被计算一遍,因此,如果要让这种sql语句的效率提高的话,在这个表上建立一个基于函数的索引,比如CREATE INDEX IDX FUNT ON T(FUN(Y));这种方式,等于Oracle会建立一个存储所有函数计算结果的值,再进行查询的时候就不需要进行计算了,因为很多函数存在不同返回值,因此必须标明这个函数是有固定返回值的。
4、隐式转换导致不走索引。
索引不适用于隐式转换的情况,比如你的SELECT * FROM T WHERE Y = 5 在Y上面有一个索引,但是Y列是VARCHAR2的,那么Oracle会将上面的5进行一个隐式的转换,SELECT * FROM T WHERE TO_NUMBER(Y) = 5,这个时候也是有可能用不到索引的。
5、表的数据库小或者需要选择大部分数据,不走索引
在Oracle的初始化参数中,有一个参数是一次读取的数据块的数目,比如你的表只有几个数据块大小,而且可以被Oracle一次性抓取,那么就没有使用索引的必要了,因为抓取索引还需要去根据rowid从数据块中获取相应的元素值,因此在表特别小的情况下,索引没有用到是情理当中的事情。
6、cbo优化器下统计信息不准确,导致不走索引
很长时间没有做表分析,或者重新收集表状态信息了,在数据字典中,表的统计信息是不准确的,这个情况下,可能会使用错误的索引,这个效率可能也是比较低的。
7、!=或者<>(不等于),可能导致不走索引,也可能走 INDEX FAST FULL SCAN
例如select id from test where id<>100
8、表字段的属性导致不走索引,字符型的索引列会导致优化器认为需要扫描索引大部分数据且聚簇因子很大,最终导致弃用索引扫描而改用全表扫描方式,
由于字符型和数值型的在insert的时候排序不同,字符类型导致了聚簇因子很大,原因是插入顺序与排序顺序不同。详细点说,就是按照数字类型插入(1..3200000),按字符类型('1'...'32000000')t排序,在对字符类型使用大于运算符时,会导致优化器认为需要扫描索引大部分数据且聚簇因子很大,最终导致弃用索引扫描而改用全表扫描方式。
③ db2如何确定sql有没有走索引
首先在创建完索引之后,先运行:
runstats on table schema.tablename and detailed indexes all
运行完统计后再分析你要执行的SQL语句,看索引能否用的上。
DB2是按照成本来进行语句执行的优化的,只要你正确的运行了统计,一般情况下,会优先选择使用索引。
也有部分情况下不会使用索引。比如某个cloumn,同时创建了在索引1和索引2中,那DB2到底会选择索引1和索引2,就要看他认为使用哪个索引的成本低了。
很多不使用索引的情况是因为你们有做完正确的统计。
所以首先建议你先针对该表做一下完整的统计,命令见上。
④ 什么样的sql不走索引
有几种情况:
where条件中如果使用了in关键字,肯定不会使用索引;
where条件中使用了like关键字,并且是以'%'开头的,肯定不会用索引;
having条件一般不会用索引
⑤ 一个简单的sql为什么没走索引
走不走索引是由Oracle自己决定的。
Oracle做决定是基于统计信息的。
用绑定变量,传入变量之前,SQL执行计划就必须已经就绪了,所以可能会出现判断错误的结果。
自己拼接SQL,Oracle解析的时候会判断这个变量,根据统计信息决定走什么样的执行计划。
还有,如果索引维护出现问题,使用索引可能会得出和常规查询不一样的(错误的)结果,这时无论如何都不会走索引。
如果“analyze表之后,带参数的sql也走索引了。但我发现一天以后这个毛病就又返了”
说明你的这个表每天都会发生不规范的变化,破坏了索引。
⑥ sql 自定义函数会使用索引吗
可以的
例如
select test_uf('参数')from 表
这样肯定是可以的
⑦ 为什么该SQL的执行计划不走索引
建议你收集两个表的统计信息,只要统计信息足够新,oracle就会自动选择最优的执行计划,走不走索引取决于最优的执行计划是否启用索引比不用索引成本更低。如果你要人为影响Oracle的执行计划的话,可以给语句加上提示 /*+ use_index (table_name index_name) */ 不过这个只是给oracle提供了一个建议,如果oracle有足够的统计信息,并且使用索引成本更高的话,那么oracle也不会去使用索引,当然如果oracle没有更好的选择的话,就会受提示的影响,改变执行计划。