日期:2014-05-17  浏览次数:20752 次

执行计划会对,返回结果记录的顺序有影响么
前两天发现一个问题,一个sql类似:select * from test where name<:f1<char[20]> and rownum<500 ,现网程序取回记录的顺序和本地sql取回的结果顺序不一致,很费解,怀疑是执行计划不一样,主要差别是,程序用了绑定变量,本地sql没有用绑定变量。而且在绑定变量情况下,当 rownum<200和rownum<500返回的结果顺序也不一致,查了半天也没头绪,高手帮忙解释下!!!

------解决方案--------------------
执行计划会根据条件中变量的值而改变
走索引的话,结果集的排列顺序和使用的索引有关
------解决方案--------------------
oracle表的记录的堆形式存放的,具体返回记录的顺序要通过排序来保证
如果数据一样,使用这种语句返回肯定是一样的,跟执行计划无关
SELECT *
FROM (SELECT * FROM test ORDER BY ord_col)
 WHERE NAME < 'sss' AND
rownum < 500

------解决方案--------------------
结果集的顺序应该跟执行计划无关。
要实现准确排序必须得用order by,否则你的应用就没有一点可扩展性,任何一点小的变动,甚至无意的操作都会使结果集的顺序改变。