注册 登录
编程论坛 SQL Server论坛

为什么用Convert函数提取的时间段越小,查询数据的速度越慢,甚至无反应

发布于 2010-04-27 08:56, 1352 次点击
字段“时间”的值为时间数据,格式是2010-04-22 15:33:29之类的数据

我想查询table1里面从4月21日到4月22日的数据,使用下面的语句,很快10秒后就得出结果:
Select * from table1
where convert(varchar(10),时间,23) >='2010-04-21' and convert(varchar(10),时间,23) <='2010-04-22'

但我左接一个table2之后,就变得很慢,2个小时也出不了结果,不知道为什么:
Select * from
(Select * from table1
where convert(varchar(10),时间,23) >='2010-04-21' and convert(varchar(10),时间,23) <='2010-04-22') aa
left join table2
on aa.号码=table2.号码

上面提取的时间段是21、22日两天。如果我用上面同样的语句,把时间段设置为4月1日-4月22日,10多秒就出结果了,很奇怪。

请问高手这个问题是什么原因造成的?
Table1的数据有20万条记录,table2有800万条记录
8 回复
#2
czyzhuo2010-04-27 09:22
因为table2的数据明显多很多,所以多出10多秒很正常了
这就涉及到数据查询优化的问题
要优化一下数据库和SQL语句,对查询速度都会有所提高
#3
2010-04-27 09:33
正是想请教,如何优化,请高手指导。2个小时都不出结果,是不是陷入了某种死循环了?

[ 本帖最后由 盖茨比 于 2010-4-27 09:34 编辑 ]
#4
aei1352010-04-27 11:53
Select * from
(Select * from table1
where 时间>='2010-04-21 00:00:00' and 时间<'2010-04-23 00:00:00') aa
left join table2
on aa.号码=table2.号码
#5
cnfarer2010-04-27 13:48
4楼的效率明显要高
#6
2010-04-27 14:23
以下是引用aei135在2010-4-27 11:53:55的发言:

Select * from
(Select * from table1
where 时间>='2010-04-21 00:00:00' and 时间<'2010-04-23 00:00:00') aa
left join table2
on aa.号码=table2.号码

能运行,但同样的情况,很久都不出结果
#7
cnfarer2010-04-27 19:24
试试:
Select * from table2 where 号码 in (Select distinct 号码 from table1 where 时间>='2010-04-21 00:00:00' and 时间<'2010-04-23 00:00:00')
#8
2010-04-29 09:47
以下是引用cnfarer在2010-4-27 19:24:11的发言:

试试:
Select * from table2 where 号码 in (Select distinct 号码 from table1 where 时间>='2010-04-21 00:00:00' and 时间<'2010-04-23 00:00:00')
这个做法,不符合要取的信息,因为table1里有号码相同的记录,但不能合并。table2只是辅助。。。不过这个思路,是个好主意,速度慢可能就在于join。我再想想别的方法
#9
cnfarer2010-05-01 08:55
回复 8楼 盖茨比
这个可以用于筛选table2,然后再与table1进行Join,可能会快得多!
另外不知道你的索引是怎么建的,合适的索引会给查询带来很高的效率!
1