日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQLServer 优化SQL语句 in 和not in的替代方案

發(fā)布時間:2023/11/30 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQLServer 优化SQL语句 in 和not in的替代方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

用IN的SQL性能總是比較低的,從SQL執(zhí)行的步驟來分析用IN的SQL與不用IN的SQL有以下區(qū)別:
SQL試圖將其轉(zhuǎn)換成多個表的連接,如果轉(zhuǎn)換不成功則先執(zhí)行IN里面的子查詢,再查詢外層的表記錄,如果轉(zhuǎn)換成功則直接采用多個表的連接方式查詢。由此可見用IN的SQL至少多了一個轉(zhuǎn)換的過程。一般的SQL都可以轉(zhuǎn)換成功,但對于含有分組統(tǒng)計等方面的SQL就不能轉(zhuǎn)換了。 推薦在業(yè)務(wù)密集的SQL當中盡量不采用IN操作符
NOT IN 此操作是強列推薦不使用的,因為它不能應(yīng)用表的索引。推薦用NOT EXISTS 或(外連接+判斷為空)方案代替
  在數(shù)據(jù)庫中有兩個表,一個是當前表Info(id,PName,remark,impdate,upstate),一個是備份數(shù)據(jù)表bakInfo(id,PName,remark,impdate,upstate),將當前表數(shù)據(jù)備份到備份表去,就涉及到not in 和in 操作了:
  首先,添加10萬條測試數(shù)據(jù)

代碼如下:
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
--備份數(shù)據(jù)
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


此操作執(zhí)行時間:

代碼如下:
SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 3 毫秒。
SQL Server 執(zhí)行時間:
CPU 時間 = 453 毫秒,占用時間 = 43045 毫秒。
(100000 行受影響)
SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 1 毫秒。
--更改當前表狀態(tài)
update Info set upstate=1 where id in(select id from dbo.bakInfo)


  此操作執(zhí)行時間:

復制代碼 代碼如下:
SQL Server 分析和編譯時間:
CPU 時間 = 62 毫秒,占用時間 = 79 毫秒。
SQL Server 執(zhí)行時間:
CPU 時間 = 188 毫秒,占用時間 = 318 毫秒。
(100000 行受影響)
SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 1 毫秒。
--刪除當前表數(shù)據(jù)
delete from Info where upstate=1 and id in(select id from dbo.bakInfo)


  此操作執(zhí)行時間:

復制代碼 代碼如下:
SQL Server 分析和編譯時間:
CPU 時間 = 183 毫秒,占用時間 = 183 毫秒。
SQL Server 執(zhí)行時間:
CPU 時間 = 187 毫秒,占用時間 = 1506 毫秒。
(100000 行受影響)
SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 1 毫秒。


  使用join連接替代方案:

復制代碼 代碼如下:
SET STATISTICS TIME ON
GO
--備份數(shù)據(jù)
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;


  此操作執(zhí)行時間:

復制代碼 代碼如下:
SQL Server 分析和編譯時間:
CPU 時間 = 247 毫秒,占用時間 = 247 毫秒。
SQL Server 執(zhí)行時間:
CPU 時間 = 406 毫秒,占用時間 = 475 毫秒。
(100000 行受影響)
SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 1 毫秒。
--更改當前表狀態(tài)
update Info set upstate=1
FROM Info INNER JOIN
bakInfo ON Info.id = bakInfo.id


  此操作執(zhí)行時間:

復制代碼 代碼如下:
SQL Server 分析和編譯時間:
CPU 時間 = 4 毫秒,占用時間 = 4 毫秒。
SQL Server 執(zhí)行時間:
CPU 時間 = 219 毫秒,占用時間 = 259 毫秒。
(100000 行受影響)
SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 1 毫秒。


--刪除當前表數(shù)據(jù)

復制代碼 代碼如下:
delete from Info
FROM Info INNER JOIN
bakInfo ON Info.id = bakInfo.id
where Info.upstate=1


  此操作執(zhí)行時間:

復制代碼 代碼如下:
SQL Server 分析和編譯時間:
CPU 時間 = 177 毫秒,占用時間 = 177 毫秒。
SQL Server 執(zhí)行時間:
CPU 時間 = 219 毫秒,占用時間 = 550 毫秒。
(100000 行受影響)
SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 1 毫秒。


  可以看出使用join方案比使用not in 和in執(zhí)行時間要短很多了

轉(zhuǎn)載于:https://www.cnblogs.com/qianxingdewoniu/archive/2012/11/20/2779807.html

總結(jié)

以上是生活随笔為你收集整理的SQLServer 优化SQL语句 in 和not in的替代方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。