通常我們會遇到這樣的情況,一張表中包含上百萬條的資料,但是每次我們只查詢一小部分的資料。
比如一列只有少部分null值,每次我們都需要將null值找出來進行處理。或者我們有狀態標誌位,需要取flag對資料處理。 由於資料大部分是重複的,所以對於整個列做索引代價是非常大的,而且對查詢效能提公升可能不大。
慶幸的是微軟提供了filtered index。filtered index引使用篩選謂詞對錶中的部分行進行索引,與全表索引相比,設計良好的篩選索引可以提高查詢效能、減少索引維護開銷並可降低索引儲存開銷。
下面是我做的乙個測試:
create table [dbo].[test](
[test1] [varchar](100) null,
[test2] [varchar](100) null,
[test3] [varchar](100) null,
[test4] [varchar](100) null,
[test5] [varchar](100) null,
[flag] [char](1) null
) on [primary]
flag列只有n和y兩個值。然後插入100w資料,flag為n,插入5000條flag為y,然後對錶進行查詢:
select flag from test where flag ='y'---用了7秒鐘返回資料
檢視執行計畫提示缺失索引,建議的建立指令碼如下:
create nonclustered index [ix_filter_flag]
on [dbo].[test] ([flag])
因為我們只針對於flag為y的資料查詢,如果使用建議指令碼建立索引對效能不會有大的提公升而且會增加資料庫的負擔。 所以我選擇用flitered index:
create nonclustered index [ix_filter_flag]
on [dbo].[test] ([flag])
where flag='y' ;
建立完成後執行上面的語句,發現使用了index seek,時間不超過一秒中就返回了所有結果。
但是如果想查詢flag為n的,仍然是table scan:
當然我們可能還需要查詢其他的字段,建立索引的時候還可以配合include使用。
使用filtered index還有一些限制,更多資訊可以參考msdn:
使用GraphEdit使用
1 註冊元件。其實乙個filter就是乙個com元件,所以使用之前需要註冊,可以有兩種方法對元件進行註冊。1.直接使用命令。命令列下輸入 regsvr32 hqtlystd.ax 編譯之後你會在工程目錄下的debug中找到hqtlystd.ax,這個就是要用的filter 即可註冊成功。2.vc6....
MySQL使用學習使用 mysql學習使用
1 mysql學習 1 安裝 ubuntu下直接安裝 apt get install mysql server 2 檢查伺服器是否啟動 sudo netstat tap grep mysql,如果啟動成功,出現以下資訊 tcp00localhost.localdomain mysql listen ...
學習使用CSDN markdown使用
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...