科学技术是第一生产力,实践是检验真理的唯一标准!
时间:2011-10-12 00:43来源:未知 作者:admin 点击:

求助:在家帮我解决条SQL语句吧

我有条SQL语句,是这样的 select top 10 ID,ConsumerNO,Name from client where CorporationNO=301731 and ID not in(select top 2025110 ID from client where CorporationNO=301731 order by ID desc)order by ID desc 我现在这个表里有2百多万条记录, 我在浏览1到

我有条SQL语句,是这样的
select top 10 ID,ConsumerNO,Name from client
where CorporationNO=301731 and ID not in(select top 2025110 ID from client where CorporationNO=301731
order by ID desc)order by ID desc
我现在这个表里有2百多万条记录,
我在浏览1到前几十万条记录是很快的,一下就出来,
但是一到后面,也就是快接近尾页了,那些数据就特别慢,我在查询分析器里试了下要11秒啊
我在这个表里建了这样的索引
CREATE INDEX client_Index ON client(CorporationNO,ConsumerNO)
不知哪里还没有搞好

 

这种语句越到后面就会越慢的。你试试在ID上建聚集索引,在CorporationNO上建非聚集索引看看

 

那我应该怎 么改呢?我原本的这条建索引语句,应该怎样改呢?请教下我吧
CREATE INDEX client_Index ON client(CorporationNO,ConsumerNO)
另外我的ID在建表时已设成 ID bigint IDENTITY Primary Key 了

 

或者你可以每次记录下该页面所显示的最小和最大的ID,然后使用下面的查询来显示上一页

select top 10 ID,ConsumerNO,Name from client
where CorporationNO=301731 and ID<最小的ID order by ID desc

如果要显示下一页,则使用:

select top 10 ID,ConsumerNO,Name from client
where CorporationNO=301731 and ID>最大的ID order by ID

 

解决这类问题根本就是努力在select top中添加一个限制性条件,来缩减扫描的范围

 

wyqjx的意思是找2025110条数据后面的10条吧,前面的2025110条数据怎么说都难绕,如果说把这些数据同时放到select里肯定会很累,如果用top,也不见得怎么样,像前面还提到ID在建表时已设成 ID bigint IDENTITY Primary Key ,所以既然前面取得数据可以是有序的,而且保证后面的id一定大于前面的,因此分批读取然后一一筛选应该效果不错,就像拓狼的方法,记录最末尾的id号,等于每次控制一个id段,直到取出前2025110条数据即可,这个id段的跨度可以通过测试取得一个性能的平衡点,至于建立索引,应该是有必要的,毕竟这没必要全表遍历,但是怎么建立我不清楚了,wyqjx试试看效果怎么样。把结果反馈过来,共同学习

(责任编辑:admin)

达思数据安全小贴士

数据丢失以后,还是有可能恢复回来,达思提醒各位数据丢失以后应该注意的问题:

1、保护好现场,不要对故障硬盘或分区写入新的数据;

2、尽量寻求专业人士或者机构帮您恢复数据,除非您自己懂得相应恢复技术;

3、可以打达思免费咨询电话:400-700-0017,工程师会给您专业的建议;

4、可以访问达思数据恢复技术网站:http://www.bnuol.com,寻求技术支持。

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片