如何優雅的使用 參數 is null而不導致全表掃描(破壞索引)

来源:https://www.cnblogs.com/robots/archive/2019/04/08/10671802.html
-Advertisement-
Play Games

相信大家在很多實際業務中(特別是後臺系統)會使用到各種篩選條件來篩選結果集 首先添加測試數據 1.有使用EXEC來避免全表掃描 或者條件少的情況下 2.使用IS NULL來實現 第一種方案,不會破壞索引,但冗餘的代碼看起來讓人難受 第二種方案,會導致全表掃描(破壞索引) 以上是網上查閱的資料,方案二 ...


 

相信大家在很多實際業務中(特別是後臺系統)會使用到各種篩選條件來篩選結果集

首先添加測試數據

CREATE TABLE TempList(Id int IDENTITY,Name VARCHAR(12),  Age INT)
go
CREATE INDEX idx_age ON TempList (Age)
GO


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

 

 

1.有使用EXEC來避免全表掃描

DECLARE @age INT=666;

DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT * FROM TempList'

IF @age IS NOT NULL
    SET @sql = @sql + ' WHERE Age = @age'
    
EXEC sp_executesql @sql, N'@age int', @age

或者條件少的情況下

DECLARE @age INT=666;

IF @age IS NOT NULL
    SELECT * FROM TempList WHERE Age = @age
ELSE 
    SELECT * FROM TempList

2.使用IS NULL來實現

DECLARE @age INT=666;

SELECT * FROM TempList WHERE (@age IS NULL OR Age = @age)

SELECT * FROM TempList WHERE (Age = @age OR @age IS NULL)

SELECT * FROM TempList WHERE Age=isnull(@age, Age) 

 

第一種方案,不會破壞索引,但冗餘的代碼看起來讓人難受

第二種方案,會導致全表掃描(破壞索引)

 

以上是網上查閱的資料,方案二不符合SARG,問題在OR,如果我不使用OR,用AND呢

DECLARE @age INT=666;

SELECT * FROM TempList WHERE @age IS NOT NULL and Age = @age

 

 

版權聲明:本文原創發表於 博客園,作者為 托大人 本文歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則視為侵權。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前linux回滾了下,然後就連不上xshell和filezille了,後臺安全配置哪裡也都打開了埠號了,還是不行。然後我就想重啟下ssh服務 ,執行service sshd restart 提示139行地址錯誤,按照提示我打開sshd_config文件並找到139行,才發現 這裡多了一個Addr ...
  • 轉自:https://blog.csdn.net/u012993732/article/details/48626921 調用 Doskey.exe,它撤回 Windows XP 命令、編輯命令行並創建巨集。 MS-DOS命令語法 doskey {/reinstall | /listsize=size ...
  • DNS服務 DNS:Domain Name Service //協議 實現:BIND(Berkeley Internet Name Domain) 監聽埠: UDP:53 TCP:53 名稱解析:將一種格式的信息轉化為另外一種格式,以某關鍵字為標準查找某一資料庫的過程passwd <--> nss ...
  • 驅動問題,名為“Insyde Airplane Mode HID Mini-Driver”的驅動,這個驅動是專門用來快捷管理飛行模式的。 卸載完成後重啟,無限開關飛行模式問題得到解決! ...
  • 用戶進程的記憶體頁分為兩種: file backed pages(文件背景頁) anonymous pages(匿名頁) 比如進程的代碼段、映射的文件都是file backed,而進程的堆、棧都是不與文件相對應的、就屬於匿名頁。 file backed pages在記憶體不足的時候可以直接寫回對應的硬碟 ...
  • 問題描述:在升級Exchange 2013 CU22檢查群集節點狀態的過程中發現群集組處於失敗狀態,具體報錯信息如下:警告:資料庫可用性組”***”見證處於失敗狀態。資料庫可用性組要求見證伺服器保持仲裁。請使用 set-DatabaseAvailabilityGroup cmdlet重新創建此見證服... ...
  • 在之前寫過一篇博客"關係資料庫如何快速查詢表的記錄數",裡面介紹了使用sp_spaceused查看表的記錄數是否正確的問題,具體如下: 關於問題3:有多個索引的表,是否記錄數會存在不一致的情況? 答案:個人測試以及統計來看,暫時發現多個索引的情況下,sys.partitions中的rows記錄數都是... ...
  • windows系統無法改成 lower_case_table_names=0, 因為windows預設是1,就算改也只能改成2,以下截自 MySQL 8.0 Reference Manual 然後,當我們按照網上方法把 my.ini中的lower_case_table_names強行改成2之後,會發 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...