我有一张表,TEST,数据量很大, 主键是ID(number),这张表按SQBM(varchar2)字段分区,以下三个SQL,哪个最快?还是都一样?
1、select * from TEST where ID=?
2、select * from TEST where ID=? and SQBM=?
3、select * from TEST where SQBM=? and ID=?
我用PL/SQL查询分析器看到效率一样,因为都是走主键的UNIQUEINDEX,但是公司的人说加上SQBM是有作用的,我迷糊了,请大虾指点,谢谢!
谢谢你,
1、SQBM字段上不存在INDEX,但是这张表按SQBM分区。
2、表上不存在(ID,SQBM)的组合INDEX。
3、这是oracle数据库,查询条件从右到左解析,也就是说,能够过滤大量数据的放最后比放前面效率高(但这里面有主键,我用PL\SQL查询分析器效率是一样的,但是公司的人说加上SQBM是有作用的,我想知道是我弄错了还是他弄错了)。
如果表上没有任何INDEX,那么你加SQBM这个条件是有用的,可以由遍历所有分区,变为只遍历SQBM指定值的一个分区。
如果你SQBM上没有任何INDEX,而ID上存在主键,则3个SQL都会走主键,那么加上SQBM条件不会有任何性能提升。因为SQL根本就不会遍历表结构,而是去遍历索引结构。查到相关ID值的INDEX叶节点就会直接指向数据了。也就跟分区没什么关系了。
我不知道你数据库什么版本,使用CBO方式的话,where条件顺序是不会影响性能的。只和你的执行计划有关。
你这是自己分析的呢还是实践得来的呢?我用程序试过,但是PC上哪数值总是变化,感觉不稳定,也不可靠
追答这是理论。未实验,你可以测试下,向大家公布答案。
追问那你这理论也不太靠谱,只是你个人的看法。
那我还认为主键唯一索引是全局索引,不会先定位分区,而是忽略SQBM、通过主键的全表唯一索引直接定位行rowid呢,一切都只是猜测而已。。。。。。
PL/SQL查询分析器3个SQL效率一样,如果SQBM没有作用,那我就只需要根据主键定位;减少java代码、提高中间件服务器效率。
我要的是在大型服务器长期运行大型项目的运行结果,要的是实践经验,我要是有测试环境,就不在这里问了。
仍然谢谢