太不可思议了:内存表竟然比永久表慢12倍以上???SQL Server怎样优化的?

jjdelphi 2003-09-04 04:29:44
看看下面两个SQL语句,注意看最后的where条件
语句A:
select a.StudNo,b.TrainPlanNo,a.AYearTermNo,b.CurSortNo,b.CurPrpNo,Credit
from StudScore a,TPlan_SpectTrainPlanCur b,ClassStudTab c,Class d,TPlan_CurBasicInfo e
where a.StudNo=c.StudNo and a.CurNo=b.CurNo and b.TrainPlanNo=d.TrainPlanNo
and b.SpectDireNo=c.SpectDireNo and c.ClassNo=d.ClassNo and a.CurNo=e.CurNo
and a.ScoringModeNo=1 and floor(a.ExamScore)>=60 and a.AYearTermNo= 20001
and b.CurSortNO=3 and b.CurPrpNo=1 --注意这里,最后的两个条件来自同一个表
语句B:
drop table aaa --使用表aaa暂存
select *
into aaa
from
(select a.StudNo,b.TrainPlanNo,a.AYearTermNo,b.CurSortNo,b.CurPrpNo,Credit
from StudScore a,TPlan_SpectTrainPlanCur b,ClassStudTab c,Class d,TPlan_CurBasicInfo e
where a.StudNo=c.StudNo and a.CurNo=b.CurNo and b.TrainPlanNo=d.TrainPlanNo
and b.SpectDireNo=c.SpectDireNo and c.ClassNo=d.ClassNo and a.CurNo=e.CurNo
and a.ScoringModeNo=1 and floor(a.ExamScore)>=60 and a.AYearTermNo= 20001
and b.CurSortNO=3 ) z --先不使用b.CurPrp=1这个条件
--下面再从表aaa中使用b.CurPrp=1这个条件
select * from aaa
where CurPrpNo=1

语句A执行要12秒,语句B不到1秒!测试数据不是很多,最后检索数据有1035条。
究竟是为什么?
...全文
90 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
awjx 2003-09-19
  • 打赏
  • 举报
回复
帮你顶!
  • 打赏
  • 举报
回复
哥哥们我有些经常用的数据量很小的表,我想把它们一直放在内存里。光用sqlServer能实现吗
w_rose 2003-09-09
  • 打赏
  • 举报
回复
在显示第一条记录之前,服务器就已经查询完成。剩下的,只是客户端软件怎样取走数据的问题。你用ADO.net,也许就更公正一些,因为它不像ADO或者ODBC那样有非常多的游标、加锁方面的选择。
w_rose 2003-09-09
  • 打赏
  • 举报
回复
查询分析器骗你了。不信,你试试在两个查询上把select ... 改成select top 1 ...,这样,查询分析器在服务器上建立的不同的光标结构和以及他的客户端显示部件的影响可以排除。
jjdelphi 2003-09-04
  • 打赏
  • 举报
回复
zarge(鲨至):
'TPlan_SpectTrainPlanCur' 的 DBCC 结果。
对象 'TPlan_SpectTrainPlanCur' 有 194 行,这些行位于 5 页中。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
jjdelphi 2003-09-04
  • 打赏
  • 举报
回复
w_rose(w_rose) :
从查询分析器中执行SQL语句的。语句A要12秒才执行完,中间按取消按钮,一般停止在第980条记录上。
sysmaster(为什么我不懂):
我也感觉应该是语句B执行速度慢些,因为要创建表、删除表等物理操作,而语句A直接在内存中操作的。因为测试数据的原因,加不加最后一个条件,检索的结果数是一样的,都是1053条
zarge 2003-09-04
  • 打赏
  • 举报
回复
检查一下数据库
DBCC CHECKTABLE ('table_name')
w_rose 2003-09-04
  • 打赏
  • 举报
回复
“先是”-->“显示”
sysmaster 2003-09-04
  • 打赏
  • 举报
回复
因为你用A多了一个条件,那么你在产生一个临时结果时会有很少条记录,然后再找,B少了一个
条件,应产生多天A的记录数,找起来应慢.闷,喝水去!
w_rose 2003-09-04
  • 打赏
  • 举报
回复
“停在第980条记录”?????????

先是第一条记录之前,SQL Server就已经查询完成了呀?你用什么办法钻到铁扇公主肚子里。

或者,纯粹是“计算运行时间”的方法有根本错误。
sysmaster 2003-09-04
  • 打赏
  • 举报
回复
反了吧,我认为B应慢才对呀1
jjdelphi 2003-09-04
  • 打赏
  • 举报
回复
重启后无关。
语句A 执行的很长时间都停在第980条记录,中间停止几次最后的记录都是第980条
nboys 2003-09-04
  • 打赏
  • 举报
回复
先执行第二个,再执行第一个,看看
nboys 2003-09-04
  • 打赏
  • 举报
回复
先执行第二个,再执行第一个,看看结果
zarge 2003-09-04
  • 打赏
  • 举报
回复
应该不会差太远,
你重启SQL Server服务再执行试试
pengdali 2003-09-04
  • 打赏
  • 举报
回复
你关掉sqlserver再打开先执行第二个呢?
jjdelphi 2003-09-04
  • 打赏
  • 举报
回复
为什么可能是?
两个对比太大了
CurPrpNo不是索引的
cheny1234 2003-09-04
  • 打赏
  • 举报
回复
是不是索引的原因?

22,199

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧