日期:2014-05-18 浏览次数:20472 次
select * from A where exists (select top 1 0 from B where B.batchno=A.batchno)
------解决方案--------------------
看一下执行计划。
------解决方案--------------------
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:
--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,......)
最近做的一个项目里要处理日志记录,日志表好几百万条,我用连接查询半天出不来
后来分开一个一个表查,把限制条件先保存就快多了