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

转载 2007年09月30日 23:30:00
这两天检查一条嵌套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语句创建临时表

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

关于with as 作为查询片段的使用和与临时表#Table的比较

http://bbs.csdn.net/topics/300131856 一.WITH AS的含义     WITH AS短语,也叫做子查询部分(subquery factoring),可以让你...
  • dahaizhiliang
  • dahaizhiliang
  • 2013年05月04日 15:49
  • 1290

sql的临时表使用小结

转载地址:http://www.cnblogs.com/jeffwongishandsome/archive/2009/08/05/1526466.html 数据表的创建方法 1、创建...
  • Micro_Ryan
  • Micro_Ryan
  • 2015年10月08日 14:45
  • 7645

sql复杂嵌套查询

最近在做各类小应用,用到了MYSQL,有时候会用到一些比较复杂的嵌套查询,在研究怎么通过SQL实现这些。 假设下面这张表(stu)描述学生的基本信息: id name grade 1 ...
  • dreamer2020
  • dreamer2020
  • 2016年05月01日 04:01
  • 9256

SQL嵌套语句执行顺序

SELECT 字段 FROM 表名 WHERE 条件表达式那他们是按什么顺序执行的呢? 分析器会先看语句的第一个词, 当它发现第一个词是SELECT关键字时候, 他会跳到FROM关键字, 然后通过FR...
  • u012934551
  • u012934551
  • 2016年04月09日 18:27
  • 2299

sql子查询 嵌套SELECT语句

嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值。子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在sele...
  • wangqi0079
  • wangqi0079
  • 2013年08月23日 15:13
  • 5785

利用SELECT INTO创建临时表

SELECT INTO创建临时表 SQL Server临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#)  打头;它们仅对当前的用户...
  • u014328353
  • u014328353
  • 2017年03月16日 17:27
  • 424

sqlserver 存储过程 临时表 时间计算 循环 问题

今天要做统计网站访问量的功能。结果存储过程不会,各种系统函数也不会用。客户那边还没网络。着实憋气了。 下面是查到的一些东西 一 、临时表的使用 表名前使用一个#号,临时表是局部的,使用两个#号,临时...
  • luckysiesteven
  • luckysiesteven
  • 2015年02月02日 22:10
  • 1346

PL/SQL 集合 -- 嵌套表

-- Start 嵌套表(Nested Tables) 其实就是一个没有最大容量的数组。 DECLARE -- 定义一个嵌套表类型 GRADE,元素类型是 VARCHAR2 TYPE GRA...
  • shangboerds
  • shangboerds
  • 2015年01月04日 09:08
  • 2177

如何加快sql执行速度?

1、升级硬件  2、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。 3、扩大服务器的内存 4、增加服务器CPU个数 5、对于大的数据库不要设置数据库自动增长,它会...
  • weiqubo
  • weiqubo
  • 2013年05月23日 14:12
  • 5070
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用临时表改善嵌套SQL语句的执行速度
举报原因:
原因补充:

(最多只允许输入30个字)