用临时表改善嵌套SQL语句的执行速度

标签: sql table 数据库 编译器 优化
2424人阅读 评论(0) 收藏 举报
分类:

用临时表改善嵌套SQL语句的执行速度

左直拳

 

 

这两天检查一条嵌套SQL语句,发觉非常耗时。形如:

SELECT KeyId,COUNT(1) AS Num

FROM Table1

WHERE 1=1

AND CreateDate>='2007-09-21'

AND KeyId IN(SELECT KeyId FROM Table2 WHERE Id=1611)

GROUP BY KeyId

 

究其原因,大约该SQL语句执行的步骤是从Table1中每拿出一条记录,都要执行

IN(SELECT KeyId FROM Table2 WHERE Id=1611) 一番

 

靠,数据库也太弱智了吧。学编译方法时就知道,编译器会自动优化代码,将一些计算从循环中提取出来,数据库怎么就不能先查找出

(SELECT KeyId FROM Table2 WHERE Id=1611)

的结果,然后再代入整条SQL语句中执行呢?

 

先是这样修改:

SELECT a.KeyId,COUNT(1) AS Num

FROM Table1 a

, (SELECT KeyId FROM Table2 WHERE Id=1611) AS b

WHERE 1=1

AND a.CreateDate>='2007-09-21'

AND a.KeyId=b.KeyId

GROUP BY a.KeyId

 

结果发现没什么改进,有时甚至效果更坏。

 

把心一横,祭出临时表来:

SELECT KeyId INTO t# FROM Table2 WHERE Id=1611;

 

SELECT a.KeyId,COUNT(1) AS Num

FROM Table1 a

, t# AS b

WHERE 1=1

AND a.CreateDate>='2007-09-21'

AND a.KeyId=b.KeyId

GROUP BY a.KeyId

 

DROP TABLE #t;

 

结果速度改善非常明显。不必担心并发操作时临时表会有冲突,说这个会话创建了一个t#,那个会话也创建了一个t#。临时表就好象局部变量,只在某个会话里有意义。

 
查看评论

SQL 的from中嵌套的子查询的临时表名的作用域问题

代码如下: --下面代码中的临时表名T2在where里的子查询语句里面不能识别??????? WITH    T2 ( department, avg_salary )       --这个未完待续 ...
  • hemeinvyiqiluoben
  • hemeinvyiqiluoben
  • 2013-08-11 12:55:34
  • 6739

运用sql语句创建临时表

首先我们来熟悉下临时表的概念: 临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。 临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时...
  • winbobob
  • winbobob
  • 2014-04-10 13:57:21
  • 2610

SQL语句创建临时表

1.INSERT INTO SELECT语句 语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from ...
  • anlidengshiwei
  • anlidengshiwei
  • 2014-12-18 18:07:31
  • 1084

不创建表结构,直接放入临时表结果(包括存储过程,直接sql语句)

首先介绍一下临时表的分类:临时表有两种    1,加#只有该会话可见,并且该会话结束后SQL   SERVER自动删除    2,加##全局。所有会话结束后SQL   SERVER   删除它  全局...
  • camel0564
  • camel0564
  • 2007-11-14 10:40:00
  • 3930

SQL的将EXEC()动态执行的结果集放到一张临时表

1.创建一个本地临时表 2.将动态执行的结果集插入到临时表, 3.对临时表进行操作 CREATE TABLE #TEMP (  SupportID INT,  Keywo...
  • u013538542
  • u013538542
  • 2015-05-27 17:18:02
  • 1385

将存储过程执行的结果保存到临时表

将存储过程执行的结果保存到临时表 1、创建一个字段名称和数量与存储过程的执行结果一致的临时表; 2、insert into #t1 EXEC Porc1 'a' 示例...
  • sage425
  • sage425
  • 2015-02-12 15:26:09
  • 2721

SQL本地临时表EXEC问题

举列子说明问题: 例1   select * into #tab from users  select * from #tab  drop table #tab 结果: 例2 使用全局临时表...
  • Erike_zhang
  • Erike_zhang
  • 2013-12-03 13:52:52
  • 1275

oracle创建临时表及SQL语句拼接

--创建表语句 CREATE TABLE CX_DUAN(OPTY_NAME VARCHAR2(400),   -- 项目名称                      TYPE VARCHAR2...
  • zxliujunjun
  • zxliujunjun
  • 2016-12-13 15:47:44
  • 1542

动态执行Sql语句与临时表的问题(对象名无效)

exec(selectIDENTITY(int,1,1)  as ID,fnum,into  #yuecu  from  store_store where  +@Parameter)  select...
  • zhycy
  • zhycy
  • 2009-12-01 15:07:00
  • 1032

sql嵌套查询优化

1.嵌套查询优化 优化前 SELECT q.id, q.title, q.question, q.person_name, q.department_n...
  • ZQUSwansea
  • ZQUSwansea
  • 2018-01-04 23:36:44
  • 167
    个人资料
    持之以恒
    等级:
    访问量: 260万+
    积分: 3万+
    排名: 156
    最新评论