用临时表改善嵌套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语句性能提升100倍

【问题现象】线上mysql数据库爆出一个慢查询,DBA观察发现,查询时服务器IO飙升,IO占用率达到100%, 执行时间长达7s左右。 SQL语句如下:SELECT DISTINCT g.*, cp...

优化临时表使用,SQL语句性能提升100倍

【问题现象】 线上mysql数据库爆出一个慢查询,DBA观察发现,查询时服务器IO飙升,IO占用率达到100%, 执行时间长达7s左右。 SQL语句如下: SELECT DISTINCT...
  • ak619
  • ak619
  • 2015年08月03日 10:30
  • 134

Sql Server 关于整表插入另一个表部分列的语法以及select 语句直接插入临时表的语法 (转帖)

语法是这样的 :1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select*into b from a where11法二:selecttop0*into b f...

优化临时表使用,SQL语句性能提升100倍

一个真实的mysql优化案例,优化效果直接提升100倍

Atitit.mysql oracle with as模式临时表模式 CTE 语句的使用,减少子查询的结构性 mssql sql server..

Atitit.mysql  oracle with as模式临时表模式 CTE 语句的使用,减少子查询的结构性 mssql sql server..   1. with ... as (...) ...
  • attilax
  • attilax
  • 2014年12月10日 23:39
  • 2127

SQL语句查询结果集中的动态修改案例(临时表+游标)

本文转载:http://www.cnblogs.com/Charles2008/archive/2008/03/04/1090314.html 曾经一位朋友问我这样一个问题:怎样在查询出来的结果集中...

利用 MS-SQL TEMP 数据库 临时表 做 销售排行 的T-SQL复杂语句

利用 MS-SQL TEMP 数据库 临时表 做 销售排行 的T-SQL复杂语句 Declare @p1BegDate char(10) Declare @p2EndDate ch...

ok,sql,数据库临时语句

  • 2008年11月26日 17:44
  • 1KB
  • 下载

MySQL临时表的简单用法 在大数据量时有时会加快查询速度

当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用临时表改善嵌套SQL语句的执行速度
举报原因:
原因补充:

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