程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQLServer 優化SQL語句 in 和not in的替換計劃

SQLServer 優化SQL語句 in 和not in的替換計劃

編輯:MSSQL

SQLServer 優化SQL語句 in 和not in的替換計劃。本站提示廣大學習愛好者:(SQLServer 優化SQL語句 in 和not in的替換計劃)文章只能為提供參考,不一定能成為您想要的結果。以下是SQLServer 優化SQL語句 in 和not in的替換計劃正文


然則用IN的SQL機能老是比擬低的,從SQL履行的步調來剖析用IN的SQL與不消IN的SQL有以下差別:
SQL試圖將其轉換成多個表的銜接,假如轉換不勝利則先履行IN外面的子查詢,再查詢外層的表記載,假如轉換勝利則直接采取多個表的銜接方法查詢。因而可知用IN的SQL至多多了一個轉換的進程。普通的SQL都可以轉換勝利,但關於含有分組統計等方面的SQL就不克不及轉換了。 推舉在營業密集的SQL傍邊盡可能不采取IN操作符
NOT IN 此操作是強列推舉不應用的,由於它不克不及運用表的索引。推舉用NOT EXISTS 或(外銜接+斷定為空)計劃取代
  在數據庫中有兩個表,一個是以後表Info(id,PName,remark,impdate,upstate),一個是備份數據表bakInfo(id,PName,remark,impdate,upstate),將以後表數據備份到備份表去,就觸及到not in 和in 操作了:
  起首,添加10萬條測試數據

create procedure AddData
as
declare @id int
set @id=0
while(@id<100000)
begin
insert into dbo.Info(id,PName,remark,impdate,upstate)
values(@id,convert(varchar,@id)+'0','abc',getdate(),0)
set @id=@id+1
end
exec AddData

應用not in 和in操作:

SET STATISTICS TIME ON
GO
--備份數據
insert into bakInfo(id,PName,remark,impdate,upstate)
select id,PName,remark,impdate,upstate from dbo.Info
where id not in(select id from dbo.bakInfo)
GO
SET STATISTICS TIME OFF

此操作履行時光:

SQL Server 剖析和編譯時光:
CPU 時光 = 0 毫秒,占用時光 = 3 毫秒。
SQL Server 履行時光:
CPU 時光 = 453 毫秒,占用時光 = 43045 毫秒。
(100000 行受影響)
SQL Server 剖析和編譯時光:
CPU 時光 = 0 毫秒,占用時光 = 1 毫秒。
--更改以後表狀況
update Info set upstate=1 where id in(select id from dbo.bakInfo)

  此操作履行時光:

SQL Server 剖析和編譯時光:
CPU 時光 = 62 毫秒,占用時光 = 79 毫秒。
SQL Server 履行時光:
CPU 時光 = 188 毫秒,占用時光 = 318 毫秒。
(100000 行受影響)
SQL Server 剖析和編譯時光:
CPU 時光 = 0 毫秒,占用時光 = 1 毫秒。
--刪除以後表數據
delete from Info where upstate=1 and id in(select id from dbo.bakInfo)

  此操作履行時光:

SQL Server 剖析和編譯時光:
CPU 時光 = 183 毫秒,占用時光 = 183 毫秒。
SQL Server 履行時光:
CPU 時光 = 187 毫秒,占用時光 = 1506 毫秒。
(100000 行受影響)
SQL Server 剖析和編譯時光:
CPU 時光 = 0 毫秒,占用時光 = 1 毫秒。

  應用join銜接替換計劃:

SET STATISTICS TIME ON
GO
--備份數據
insert into bakInfo(id,PName,remark,impdate,upstate)
select id,PName,remark,impdate,upstate from
(SELECT Info.id,Info.PName, Info.remark, Info.impdate,Info.upstate, bakInfo.id AS bakID
FROM Info left JOIN
bakInfo ON Info.id = bakInfo.id ) as t
where t.bakID is null and t.upstate=0
GO
SET STATISTICS TIME OFF;

  此操作履行時光:

SQL Server 剖析和編譯時光:
CPU 時光 = 247 毫秒,占用時光 = 247 毫秒。
SQL Server 履行時光:
CPU 時光 = 406 毫秒,占用時光 = 475 毫秒。
(100000 行受影響)
SQL Server 剖析和編譯時光:
CPU 時光 = 0 毫秒,占用時光 = 1 毫秒。
--更改以後表狀況
update Info set upstate=1
FROM Info INNER JOIN
bakInfo ON Info.id = bakInfo.id

  此操作履行時光:

SQL Server 剖析和編譯時光:
CPU 時光 = 4 毫秒,占用時光 = 4 毫秒。
SQL Server 履行時光:
CPU 時光 = 219 毫秒,占用時光 = 259 毫秒。
(100000 行受影響)
SQL Server 剖析和編譯時光:
CPU 時光 = 0 毫秒,占用時光 = 1 毫秒。

--刪除以後表數據

delete from Info
FROM Info INNER JOIN
bakInfo ON Info.id = bakInfo.id
where Info.upstate=1

  此操作履行時光:

SQL Server 剖析和編譯時光:
CPU 時光 = 177 毫秒,占用時光 = 177 毫秒。
SQL Server 履行時光:
CPU 時光 = 219 毫秒,占用時光 = 550 毫秒。
(100000 行受影響)
SQL Server 剖析和編譯時光:
CPU 時光 = 0 毫秒,占用時光 = 1 毫秒。

  可以看出應用join計劃比應用not in 和in履行時光要短許多了
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved