一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - SQL中WHERE變量IS NULL條件導致全表掃描問題的解決方法

SQL中WHERE變量IS NULL條件導致全表掃描問題的解決方法

2020-01-15 15:37MSSQL教程網 Sql Server

今天在評審接手的項目中的存儲過程時,發現存在大量的在條件里判斷變量是否NULL的寫法

代碼如下:


SET @SQL = 'SELECT * FROM Comment with(nolock) WHERE 1=1
    And (@ProjectIds Is Null or ProjectId = @ProjectIds)
    And (@Scores is null or Score =@Scores)'

 

 


印象中記得,以前在做Oracle開發時,這種寫法是會導致全表掃描的,用不上索引,不知道Sql Server里是否也是一樣呢,于是做一個簡單的測試
1、建立測試用的表結構和索引:

復制代碼代碼如下:


CREATE TABLE aaa(id int IDENTITY, NAME VARCHAR(12), age INT)
go
CREATE INDEX idx_age ON aaa (age)
GO

 

 

 

2、插入1萬條測試數據:

復制代碼代碼如下:


DECLARE @i INT;
SET @i=0;
WHILE @i<10000
BEGIN
  INSERT INTO aaa (name, age)VALUES(CAST(@i AS VARCHAR), @i)
  SET @i=@i+1;
END
GO


3、先開啟執行計劃顯示:
在SQL Server Management Studio的查詢窗口里,右擊窗口任意位置,選擇“包含實際的執行計劃”:


SQL中WHERE變量IS NULL條件導致全表掃描問題的解決方法

4、開始測試,用下面的SQL進行測試:

復制代碼代碼如下:


DECLARE @i INT;
SET @i=100
SELECT * FROM aaa WHERE (@i IS NULL OR age = @i)
SELECT * FROM aaa WHERE (age = @i OR @i IS NULL)
SELECT * FROM aaa WHERE age=isnull(@i, age) 
SELECT * FROM aaa WHERE age = @i


測試結果如下:
 

SQL中WHERE變量IS NULL條件導致全表掃描問題的解決方法

可以看到,即使@i有值,不管@i IS NULL是放在前面還是放在后面,都無法用到age的索引,另外age=ISNULL(@i,age)也用不上索引

最終結論,SQL Server跟ORACLE一樣,如果條件里加了 變量 IS NULL,都會導致全表掃描。

建議SQL改成:

復制代碼代碼如下:


DECLARE @i INT;
SET @i=100

 

DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT * FROM aaa'
IF @i IS NOT NULL
    SET @sql = @sql + ' WHERE age = @i'
EXEC sp_executesql @sql, N'@i int', @i


當然,如果只有一個條件,可以設計成2條SQL,比如:

復制代碼代碼如下:


DECLARE @i INT;
SET @i=100
IF @i IS NOT NULL
    SELECT * FROM aaa WHERE age = @i
ELSE 
    SELECT * FROM aaa

 

但是,如果條件多了,SQL數目也變得更多,所以建議用EXEC的方案

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: leslessexvideos日本 | 青草视频免费 | 末发育xxxxx仙踪林 | 精选国产AV精选一区二区三区 | 欧美午夜性春猛交bbb | 视频在线欧美 | 母爱成瘾在线观看 | 我和寂寞孕妇的性事 | 男男羞羞视频网站国产 | 久久热这里只有 精品 | 手机看片国产免费久久网 | 午夜福利体检 | 青青青在线视频 | 放荡女小洁的性日记 | 国产成人精品午夜在线播放 | 日本肉体xxxx69xxxx | 欧美日韩色图 | 亚洲美洲国产日产 | 四虎永久在线精品免费影视 | 欧美成年黄网站色高清视频 | 深夜成人 | 国产精品一二三 | 国产大片51精品免费观看 | 亚洲免费国产 | 3d蒂法精品啪啪一区二区免费 | 国产高清免费在线 | 免费在线中文字幕 | 国产成人在线免费观看 | 国产三及 | 国产欧美国产综合第一区 | 99成人国产精品视频 | 天天综合网天天做天天受 | chinese男同志videos | 国产免费不卡视频 | 春意影院午夜爽爽爽免费 | 美女露全身永久免费网站 | 天堂中文在线免费观看 | 亚洲精品AV无码永久无码 | 国产精品久久毛片完整版 | 无颜之月全集免费观看 | 特黄特色一级aa毛片免费观看 |