2009-06-01 39 views
3

我對我的表格(「用戶」)使用視圖(「UsersActive」)。該視圖只有一個篩選器,它檢查DateTime Users.DeletedOn是否爲NULL;它基本上包含所有未被刪除的用戶。SQL:查看錶 - 對View的查詢是否仍然使用表索引?

如果我現在對視圖執行Linq查詢而不是表,他們仍然會使用表索引還是需要爲視圖創建特殊索引?在我的理解中查看是什麼都沒有,但一個預定義的查詢,並應工作一樣,如果我是這樣直接查詢:WHERE DeletedON = NULL

是我的假設

SELECT * FROM用戶底層表的索引仍然會被正確使用?

+0

Yoyur假設是正確的:) – Arvo 2009-06-01 19:29:08

回答

5

大多數情況下,SQL Server查詢優化器足夠智能,可以使用基表上的索引。您可以通過查看查詢計劃來查看。

如果您擁有SQL Server的企業版,則還可以使用索引視圖。

-1

如果未編入索引視圖將每次使用定義它的查詢重新生成。如果該查詢中的表被編入索引,則將使用表的索引。

您也可以爲您的視圖編制索引,在這種情況下,數據集將被提交到物理磁盤,並且您將擁有兩組索引。

+0

?不知道爲什麼我得到一個這樣的downvote? – jfrobishow 2009-06-02 01:48:53

2

視圖對底層SQL語句直接相當完全透明。這是一個很好的可靠設計假設。

1

索引視圖與非索引視圖非常不同。

一個視圖可以有效地由引擎在線擴展,因此可以使用由優化器確定的任何表索引。

索引視圖實現(並保持最新)索引。這對視圖的用戶可用,但仍可能不會使用。

基於您的示例的附加說明 - 在標準或代碼列上,索引在NULL標準上可能不會有效使用。

0

最有可能你需要重寫查詢:

SELECT * FROM用戶WHERE DeletedON IS NULL

DeletedON = NULL不會是真實的,即使DeletedON IS NULL