SQL語句優化

用IN的時候
SELECT * FROM [hcempno] where empno in(SELECT [empno] FROM [compemp])

改用EXISTS
SELECT * FROM [hcempno] where exists(SELECT 1 FROM [compemp] where empno=[hcempno].empno )


數據量大的時候有明顯區別,但我的測試時和實際操作中並非如此。
以下方法得出測試時間:

select语句前加:
declare @d datetime
set @d=getdate()
并在select语句后加:
select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())  

yy 1753-9999 年份

qq 1-4 刻

mm 1-12 月

dy 1-366 日

dd 1-31 日

wk 1-54 週

dw 1-7 週幾

hh 0-23 小時

mi 0-59 分種

ss 0-59 秒

ms 0-999 毫秒

速度的快慢與數據結構有關,比如索引,還有就是實際情況。
但是exists 只會返回true或者false兩個值

以下網上找到的:
exists()后面的子查询被称做相关子查询 他是不返回列表的值的.只是返回一个ture或false的结果(这也是为什么子查询里是"select 1"的原因 当然也可以select任何东西)
其运行方式是先运行主查询一次 再去子查询里查询与其对应的结果 如果是ture则输出,反之则不输出.再根据主查询中的每一行去子查询里去查询.

in()后面的子查询 是返回结果集的,换句话说执行次序和exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出.


执行顺序如下:
1.首先执行一次外部查询
2.对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前行的值。
3.使用子查询的结果来确定外部查询的结果集。
如果外部查询返回100行,SQL 就将执行101次查询,一次执行外部查询,然后为外部查询返回的每一行执行一次子查询。但实际上,SQL的查询
优化器有可能会找到一种更好的方法来执行相关子查询,而不需要实际执行101次查询。

in()里面的子查询是返回一个结果集,如下语句
select a.code,a.name from table a
where a.code in(select b.code from table b where a.name like 'A')

select b.code from table b where a.name like 'A'这名返回的是一个结果集,在执行上面的语句时,首先从TABLE表中取一条记录,再看这条记录的CODE记录是否在子查询返回的结果集中。如当前取得是‘001’,子查询返回的结果集是
001
002
003
则条件条件。

而exists()返回是一个逻辑值,如果子查询有结果值则返回TRUE,否则返回FALSE
主查询检查返回的结果值决定是否要当前的记录行。

一般EXISTS的执行效率高一些
-----------------------------------------------------------------
Procedure中優化:
当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性

posted on 2006-11-03 09:56  ★金★  阅读(243)  评论(0编辑  收藏  举报

导航