校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > SQL中WHERE變量IS NULL條件導致全表掃描問題的解決方法

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

熱門標簽:陽光創信ai外呼獲客系統助力 云南全自動外呼系統公司 競圣地圖標注服務 安陽天音防封電銷卡 外呼系統的話術 智能外呼系統需要多少錢 智能語音車載電話機器人 衛星地圖標注距離 貴州外呼回撥系統是什么

復制代碼 代碼如下:

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 @i10000
BEGIN
  INSERT INTO aaa (name, age)VALUES(CAST(@i AS VARCHAR), @i)
  SET @i=@i+1;
END
GO

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

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

測試結果如下:

可以看到,即使@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的方案

您可能感興趣的文章:
  • MySQL Where 條件語句介紹和運算符小結
  • MYSQL WHERE語句優化
  • MySQL 存儲過程傳參數實現where id in(1,2,3,...)示例
  • MySQL左聯多表查詢where條件寫法示例
  • MySQL 聯合索引與Where子句的優化 提高數據庫運行效率
  • sql語句中where 1=1的作用
  • MySQL中union和join語句使用區別的辨析教程
  • SQL語句的并集UNION 交集JOIN(內連接,外連接)等介紹
  • 解析sql語句中left_join、inner_join中的on與where的區別
  • 解析mysql left( right ) join使用on與where篩選的差異
  • SQL中JOIN和UNION區別、用法及示例介紹
  • sql join on 用法
  • SQL where條件和jion on條件的詳解及區別

標簽:鄂爾多斯 欽州 湘潭 周口 河源 寧夏 營口 預約服務

巨人網絡通訊聲明:本文標題《SQL中WHERE變量IS NULL條件導致全表掃描問題的解決方法》,本文關鍵詞  SQL,中,WHERE,變量,NULL,條件,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL中WHERE變量IS NULL條件導致全表掃描問題的解決方法》相關的同類信息!
  • 本頁收集關于SQL中WHERE變量IS NULL條件導致全表掃描問題的解決方法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 海兴县| 万源市| 漯河市| 建水县| 铜梁县| 博白县| 汾阳市| 苏尼特右旗| 刚察县| 林西县| 育儿| 徐水县| 大厂| 孟津县| 泰来县| 翁牛特旗| 定边县| 新余市| 康定县| 金溪县| 湖口县| 东阳市| 新乡县| 乐至县| 民县| 南乐县| 建湖县| 峨边| 陆良县| 西充县| 汽车| 叶城县| 寻甸| 榕江县| 屏南县| 莒南县| 榆中县| 邵武市| 防城港市| 长海县| 台安县|