关于SQLSERVER的默认排序问题
想请教大家一下,SQLSERVER的SELECT TOP和DELETE TOP的默认排序是怎样的,为什么在同一张表里用这两句操作,查询和删除的却是不一样的数据?
------最佳解决方案--------------------影响排序的几个方面(个人总结而已,非官方):
1、where条件,由于数据的分布where条件不同,排序的结果也不一定一样。
2、有无聚集索引,聚集索引的定义语句。
3、order by的列
如果没有聚集索引且没有where条件,那么top的数据是没有保障的。因为一个表是一个“集合”,集合不存在顺序概念。如果要指定顺序,可以使用以下方法:
1、top中使用with tie,具体使用到联机丛书查找即可。
2、建立聚集索引,使表具有可排序性。
3、order by显式调用,不要使用过多默认行为,除非你很清晰地了解SQLServer的内部机制。
插一句题外话,我发现很多开发同事写top的时候省略了括号,但是在后续版本里面这个是建议加上的。对于某些功能实现,括号成了必须,如传入一个变量来实现top多少。这个时候没有括号会报错。
------其他解决方案--------------------那你自己写上查询和删除的条件吧,就一样了。
------其他解决方案--------------------
我的查询和删除是没有where和order by条件的,因为这样会降低效率,但我们需要的是高效率的查询并删除。
------其他解决方案--------------------
我的表中是有主键的,查询时会按主键排序,但删除时却不是按主键排序,查询与删除的仍然不是同一部分数据,请指教……
------其他解决方案--------------------把你的语句贴出来看看。最好把表结构也弄出来
------其他解决方案--------------------表结构很简单,就是一个自增的id主键,加两栏数据,现在的目的是想把这张表的部分数据转移到其他表,用了
INSERT INTO DATA2 SELECT TOP 1000 * FROM DATA1
DELETE TOP(1000) FROM DATA1
然后发现取到的数据和被删掉的数据是不一样的
------其他解决方案--------------------联机丛书上对DELETE 的描述中有这么一句话:与 INSERT、UPDATE 或 DELETE 一起使用的 TOP 表达式中被引用行将不按任何顺序排列。
------其他解决方案--------------------
晕了,难道一定要按条件删除?可是我原表里有两千多万数据,遍历起来很慢的
------其他解决方案--------------------你到底要删除什么?为什么要用top啊?不能通过where来控制吗?
------其他解决方案--------------------
就是说用where很慢啊
------其他解决方案--------------------那是你索引有问题或者写法有问题。用top其实开销更大,因为要排序,排序是非常消耗资源的
------其他解决方案--------------------
不是说delete top是不排序的吗?
------其他解决方案--------------------你要先了解你的delete操作是否一定要排序?我说的不限于delete,包括select的。