日期:2014-05-18  浏览次数:20472 次

百万级数据查询效率问题
问题是这样的,表A 140万条数据,表B 临时表 350条数据,
我现在用这样的查询语句, select * from A where exists (select 1 from B where B.batchno=A.batchno)
A,B表靠batchno字段关联,字段类型为varchar(50),其中A表的batchno建了索引
数据库为sql server 2000, 查询时间大概在23-30之间
我做了一些测试,如果B表在200条数据以下,查询时间在5秒以内,为什么到了350条速度会慢这么多?
有没有办法做些优化处理?

谢谢!

------解决方案--------------------
SQL code

select * from A where exists (select top 1 0 from B where B.batchno=A.batchno)

------解决方案--------------------
看一下执行计划。
------解决方案--------------------
引用楼主 zhwb36 的帖子:
问题是这样的,表A 140万条数据,表B 临时表 350条数据,
我现在用这样的查询语句, select * from A where exists (select 1 from B where B.batchno=A.batchno)
A,B表靠batchno字段关联,字段类型为varchar(50),其中A表的batchno建了索引
数据库为sql server 2000, 查询时间大概在23-30之间
我做了一些测试,如果B表在200条数据以下,查询时间在5秒以内,为什么到了350条速度会慢这么多?
有没有办法做些优化处理?

谢谢!

------解决方案--------------------
探讨
2楼的,我试了一下,效率并没有明显提高啊,哦对了,我忘记说了,在B表中的每一个batchno都是唯一的
其实我就是想在A表中找出所有含B表中batchno的记录,不一定是我这样的写法,有其它写法也行

------解决方案--------------------
强制索引
SQL code

select * from A where exists (select top 1 0 from B where with(index(indexname)) B.batchno=A.batchno)

------解决方案--------------------
加上
set statistics io on
看上i/o读是啥情况?
或是Ctrl+L看下执行计划是啥情况.
------解决方案--------------------
TRY:
SQL code


--select * from A where exists (select 1 from B where B.batchno=A.batchno) 

SELECT a.batchNo
FROM  A INNER LOOP JOIN B 
      ON a.batchNo=b.BatchNo

------解决方案--------------------
问题是这样的,表A 140万条数据,表B 临时表 350条数据, 
我现在用这样的查询语句, select * from A where exists (select 1 from B where B.batchno=A.batchno) 
A,B表靠batchno字段关联,字段类型为varchar(50),其中A表的batchno建了索引 
数据库为sql server 2000, 查询时间大概在23-30之间 
我做了一些测试,如果B表在200条数据以下,查询时间在5秒以内,为什么到了350条速度会慢这么多? 
有没有办法做些优化处理? 

谢谢!


其实楼主的目的是为了,看B表的数据有没有在A表存在,这个目的话,其实,你换个方法就OK了

因为,你的A表的索引,所以你去查A表的时候,会遍历A表,数据量太大,
当你换个方法的时候,效果就不一样了

SELECT A.* FROM B LEFT JOIN A ON B.batchno=A.batchno

当然这个结果集中会有空的记录,所以你再过滤一下,空的记录就OK了
------解决方案--------------------
不要用两个表的连接
先把B表中的batchno
用select batchno from B
查出来
组成字符串(batchno1,batchno2,batchno3,batch4,......)
再select * from A where batchno int(batchno1,batchno2,batchno3,batch4,......)

最近做的一个项目里要处理日志记录,日志表好几百万条,我用连接查询半天出不来
后来分开一个一个表查,把限制条件先保存就快多了