首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

发现用CTE性能很差?解决办法

2012-04-12 
发现用CTE性能很差?SQL code--Create table Num27000 (n int)--declare @i int 0--while(@i27000)--begi

发现用CTE性能很差?

SQL code
--Create table Num27000 (n int)--declare @i int =0--while(@i<27000)--begin--set @i=@i+1--insert into [Num27000]--select @i--end--create table level1(l1 int) -- have about 7k rows--create table level2(l2 int) -- have about 2w rows--;with cte7k as --(select n,m=n%4 from Num27000)--insert into level1--select n from cte7k where m=1--;with cte2w as --(select n,m=n%4 from Num27000)--insert into level2--select n from cte2w where m<>1select b.l2,(select max(l1) from level1 where l1<b.l2) from level2 b--about 20s--create table numspan(st int,en int)--;with cte1 as--(select rn=row_number() over (order by l1),l1 from level1)--,cte2 as--(select a.l1 as st,b.l1 as en from cte1 a inner join cte1 b on a.rn=b.rn-1)--insert into numspan--select * from cte2select t2.l2,t1.st from level2 t2 inner join numspan t1on t2.l2 between t1.st and t1.en--about 2swith cteA as(select rn=row_number() over (order by l1),l1 from level1),cteB as(select a.l1 as st,b.l1 as en from cteA a inner join cteA b on a.rn=b.rn-1)select t2.l2,t1.st from level2 t2 inner join cteB t1on t2.l2 between t1.st and t1.en--about 7min


一张表有7000行,一张表有20000行,就是取交集的操作,偶尔发现CTE的性能超级差,用时7分钟。
如果建新表的话,只要2s就能完成查询。什么道理?

[解决办法]
你试试直接用子查询,不用CTE看看MS选什么执行计划。

[解决办法]
你与其说cte慢 不如说子查询慢。。。
最后那个cte 和下面的是执行计划应该是一样的
你自己看下。

SQL code
select t2.l2,t1.st from level2 t2 inner join(select a.l1 as st,b.l1 as en from (select rn=row_number() over (order by l1),l1 from level1) a inner join (select rn=row_number() over (order by l1),l1 from level1) b  on a.rn=b.rn-1)t1on t2.l2 between t1.st and t1.en 

热点排行