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

歡迎訪問 生活随笔!

生活随笔

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

数据库

SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有问题?

發布時間:2023/12/15 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有问题? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

上一篇我們講完SQL動態查詢,本節我們繼續來講解SQL動態查詢中存在的問題。

SQL動態查詢條件篩選過濾

當我們創建存儲過程調用存儲過程時,若篩選條件有值則過濾,沒有值則返回所行記錄,類似如下查詢:

WHERE (SomeColumn=@col OR @col IS NULL)

這樣查詢會存在什么問題呢?性能會不會有問題呢,這個是我們本節需要深入探討的問題。

接下來我們創建如下測試表并插入測試數據,如下:

CREATE TABLE Test(SomeCol1 INT NOT NULL ,Somecol2 INT NOT NULL)INSERT TestSELECT number ,lowFROM master..spt_valuesWHERE TYPE = 'p'CREATE INDEX ix_col2 ON Test(Somecol2) GO

對于動態SQL條件篩選過濾我們利用WHERE 1 = 1來拼接。接下來我們使用一般SQL語句和動態查詢并比較其IO,如下:

SET STATISTICS IO ON GODECLARE @col INT SELECT @col = 1SELECT SomeCol2 FROM Test WHERE 1 =1 AND (SomeCol2=@col OR @col IS NULL)GODECLARE @col INT SELECT @col = 1DECLARE @SQL NVARCHAR(4000)SET @SQL = 'SELECT SomeCol2 FROM TestWHERE 1 =1'IF @col IS NOT NULL SET @SQL = @SQL + ' AND SomeCol2=@InnerParamcol 'EXEC sp_executesql @SQL,N'@InnerParamcol INT',@colSET STATISTICS IO OFF GO


我們能夠看到動態SQL查詢邏輯讀取只讀取2次,而另外一般SQL語句查詢邏輯讀取7次,同時我們看到SQL動態查詢計劃執行的是索引查找,而一般SQL語句則是索引掃描。

看來執行一般SQL語句不會走索引查找,將導致性能問題,在開頭我們就講過篩選條件有值則過濾,無值則查詢所有數據,那么我們完全可以借助ISNULL來查詢,下面我們用ISNULL來改變一般語句篩選條件,看看是否會走索引查找呢?

SET STATISTICS IO ON GODECLARE @col INT SELECT @col = 1SELECT SomeCol2 FROM dbo.Test WHERE 1 = 1 AND SomeCol2 = ISNULL(@col,SomeCol2)


我們看到結果依然是走索引掃描,沒有任何改變。是不是就沒有解決之道了呢?我們來改變一般SQL語句查詢方式,如下:

DECLARE @col INT SELECT @col = 1IF @Col IS NULLSELECT SomeCol2FROM TestWHERE 1 = 1 ELSESELECT SomeCol2FROM dbo.TestWHERE 1 = 1AND SomeCol2 = @colGO

如上只能是勉勉強強解決了問題,因為只是針對一個參數,如果有多個參數要進行IF...ELSE..,那可就傻逼了。從本質上解決這個問題我們需要利用可選項重新編譯。如下:

SET STATISTICS IO ON GODECLARE @col INT SELECT @col = 1SELECT SomeCol2 FROM dbo.Test WHERE 1 =1 AND (SomeCol2 = @col OR @col IS NULL) OPTION(RECOMPILE)GODECLARE @col INT SELECT @col = 1DECLARE @SQL NVARCHAR(4000)SET @SQL = 'SELECT SomeCol2 FROM dbo.TestWHERE 1 =1'IF @col IS NOT NULL SET @SQL = @SQL + ' AND SomeCol2 = @InnerParamcol 'EXEC sp_executesql @SQL,N'@InnerParamcol INT',@colSET STATISTICS IO OFF GO

總結

當利用條件篩選過濾數據時,如果條件有值則過濾,否則返回所有行記錄。如果執行一般SQL語句和動態SQL,那么動態SQL會走索引查找,而一般SQL語句將導致索引掃描,此時需要加上OPTION(RECOMPILE)才走索引查找。

轉載于:https://www.cnblogs.com/CreateMyself/p/8280460.html

總結

以上是生活随笔為你收集整理的SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有问题?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。