以下SQL语句为什么执行很慢

mingleiz 2002-12-26 10:16:06
我写了以下SQL语句

select * from cstest where
base_id in
(select top 10 base_id from cstest where base_id in
(select top 60000 base_id from cstest order by base_id asc)
order by base_id desc)
order by base_id asc

base_id 是cstest表中的关键字索引字段

以上SQL执行中有如下问题:

当TOP 60000的值是TOP 50000以下时执行时间不到一秒,
而TOP 60000以上则执行时间5分钟都不能结束。




...全文
143 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdnqwee 2002-12-27
  • 打赏
  • 举报
回复

我发现cceo的方法还是挺快的。但下面语句是错的,系统提示“除非同时指定了 TOP,否则 ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。”
select top 60000 base_id into #a from cstest order by base_id asc
create index ind_a_base_id on #a(base_id)

select top 10 * from cstest where
base_id in (select base_id from #a order by base_id desc)
order by base_id asc

应改为
select * from cstest where
base_id in (select top 10 base_id from #a order by base_id desc)
order by base_id asc

不知对否?请多指教。另外问一下如何查看一个临时表的大小?先谢了。
mingleiz 2002-12-27
  • 打赏
  • 举报
回复
对不起,我刚刚说错了,因为aa字段是主键,开始的时候聚集索引应该是有的,后来我建了一个非聚集索引,600000条记录以下查询时不到1秒,600000条以上30秒未有结果
CCEO 2002-12-27
  • 打赏
  • 举报
回复
这个问题是这样的,你的语句总有一个极限,过了极限很容易出不来,如果能保证不到极限,就可以用(加内存能提高极限)。
mingleiz 2002-12-27
  • 打赏
  • 举报
回复
对不起,我刚刚说错了,因为aa字段是主键,开始的时候聚集索引应该是有的,后来我建了一个非聚集索引,600000条记录以下查询时不到1秒,600000条以上30秒未有结果
tjan 2002-12-27
  • 打赏
  • 举报
回复
祝贺楼主解决:)
mingleiz 2002-12-27
  • 打赏
  • 举报
回复
非常感谢大家帮助,由于领导吩咐其他事项,我未能及时回帖,对不起。

我的服务器不错,HP LH6000 双志强7000CPU,1G内存。Win2000 企业版,SQL 2000 企业版。


开始我确实未加聚集索引,60000条记录以下查询时不到1秒,60000条以上5分钟没有结果。

后来建立了聚集索引,600000条记录以下查询时不到1秒,600000条以上有结果。

cceo的方法我做了测试,可以800000条记录以下查询时不到1秒,1000000条记录用时14秒。
CCEO 2002-12-27
  • 打赏
  • 举报
回复
楼祝原话:base_id 是cstest表中的关键字索引字段
估计按缺省应该是聚集索引,聚集索引和非聚集索引的影响不大。

xpilot 2002-12-27
  • 打赏
  • 举报
回复
一个语句中有两个子查询,而且是嵌套,这样执行一次起码有2到3次表扫描,如果表数据量比较大的话,当然了是慢了.建议条件许可的情况下,改成联接查询!
tjan 2002-12-27
  • 打赏
  • 举报
回复
我的机器配置是:P4 1.2G,256M RAM,Win2000 企业版,SQL 2000 企业版

我感觉楼主好像没有聚集索引,而只有唯一索引。

楼主去哪里了?
cainiao000 2002-12-26
  • 打赏
  • 举报
回复
支持CrazyFor的简化
CrazyFor 2002-12-26
  • 打赏
  • 举报
回复
简化一下:
select top 10 * from cstest order by base_id asc
hjhing 2002-12-26
  • 打赏
  • 举报
回复
select top 10 *
from
(select top 60000 * from cstest order by base_id asc)
order by base_id desc) A
order by base_id
hjhing 2002-12-26
  • 打赏
  • 举报
回复
select top 10 *
from
(select top 60000 base_id from cstest order by base_id asc)
order by base_id desc) A
order by base_id
CoolAbu 2002-12-26
  • 打赏
  • 举报
回复
Nod...

Studying...
CCEO 2002-12-26
  • 打赏
  • 举报
回复
原因:
(select top 60000 base_id from cstest order by base_id asc)
是个临时表,临时表没有索引。

修改方法:
select top 60000 base_id into #a from cstest order by base_id asc
create index ind_a_base_id on #a(base_id)

select * from cstest where
base_id in
(select top 10 base_id from cstest where base_id in
#a
order by base_id desc)
order by base_id asc
CCEO 2002-12-26
  • 打赏
  • 举报
回复
服务器配置(主要是内存)决定什么时候会出不来!

tjan(安安) 的服务器配置一定很高,不好做这个测试。
而楼主的服务器配置比我的还要低。

楼主提问完后,就没有在露面了?

原因分析就不贴了,明眼人都能看出来。

CCEO 2002-12-26
  • 打赏
  • 举报
回复
测试过程:

环境:
PIII900 128M
win2000+sql server2000企业版
table name :t_data
CLUSTERED PRIMARY KEY :id
Rows:441000

语句1:
select * from t_data where
id in
(select top 10 id from t_data where id in
(select top 60000 id from t_data order by id asc)
order by id desc)
order by id asc

时间:390ms

语句2:
select * from t_data where
id in
(select top 10 id from t_data where id in
(select top 100000 id from t_data order by id asc)
order by id desc)
order by id asc

时间:4s

语句3:
select * from t_data where
id in
(select top 10 id from t_data where id in
(select top 150000 id from t_data order by id asc)
order by id desc)
order by id asc

时间:5s

语句4:
select * from t_data where
id in
(select top 10 id from t_data where id in
(select top 200000 id from t_data order by id asc)
order by id desc)
order by id asc

时间:6s

语句5:
select * from t_data where
id in
(select top 10 id from t_data where id in
(select top 250000 id from t_data order by id asc)
order by id desc)
order by id asc

时间:过了15m没有出来,中断

语句6:
select * from t_data where
id in
(select top 10 id from t_data where id in
(select top 300000 id from t_data order by id asc)
order by id desc)
order by id asc

时间:过了20m没有出来,中断

语句7:
select top 60000 id into #a from t_data order by id asc

create index ind_a_base_id on #a(id)

select * from t_data where
id in (select top 10 id from #a order by id desc)
order by id asc

时间:20s

语句8:
select top 100000 id into #a from t_data order by id asc

create index ind_a_base_id on #a(id)

select * from t_data where
id in (select top 10 id from #a order by id desc)
order by id asc

时间:21s

语句9:
select top 150000 id into #a from t_data order by id asc

create index ind_a_base_id on #a(id)

select * from t_data where
id in (select top 10 id from #a order by id desc)
order by id asc

时间:23s

语句10:
select top 200000 id into #a from t_data order by id asc

create index ind_a_base_id on #a(id)

select * from t_data where
id in (select top 10 id from #a order by id desc)
order by id asc

时间:24s

语句11:
select top 250000 id into #a from t_data order by id asc

create index ind_a_base_id on #a(id)

select * from t_data where
id in (select top 10 id from #a order by id desc)
order by id asc

时间:26s

语句12:
select top 300000 id into #a from t_data order by id asc

create index ind_a_base_id on #a(id)

select * from t_data where
id in (select top 10 id from #a order by id desc)
order by id asc

时间:28s

语句13:
select top 400000 id into #a from t_data order by id asc

create index ind_a_base_id on #a(id)

select * from t_data where
id in (select top 10 id from #a order by id desc)
order by id asc

时间:29s

语句14:
select * from t_data where
id in
(select top 10 id from t_data where id in
(select top 250000 id from t_data order by id asc)
order by id desc)
order by id asc

时间:过了25m没有出来,还没有中断



fongming 2002-12-26
  • 打赏
  • 举报
回复
关注
tjan 2002-12-26
  • 打赏
  • 举报
回复
奇怪!我把 60000 换成 600000 ,执行时间也不到 3 秒啊,我的表是12000000 条记录,在 base_id 上面是聚集索引,不知道楼主的是否聚集索引?
CCEO 2002-12-26
  • 打赏
  • 举报
回复
ok!

等晚上有空试一下!

加载更多回复(8)

22,206

社区成员

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

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