3

我正在優化長時間運行的T-SQL查詢。不知何故,我記得SQL Server中有一項功能,它允許檢查一個計劃如果存在索引將如何。像CREATE VIRTUAL INDEX然後檢查計劃。但我不知道如何實現這一點。創建虛擬索引 - 僅用於計劃

在SQL Server 2008R2中有這樣的功能嗎?

+0

從來沒有聽說過'VIRTUAL INDEX'我知道'INDEXED VIEWS'。通常情況下,如果我想測試如何執行特定的索引。我實際上創建它,運行我的查詢並在事實之後放棄,如果我不需要它的話。 – 2014-01-21 16:05:18

+0

我想你可能需要像Sql Server Tuning Advisor這樣的東西來查看你的查詢,並且告訴你索引可以幫助提高查詢的性能。它不會創建任何虛擬索引,但它只會提供關於哪些索引可能會提高查詢性能以及提高多少的建議。看看這裏http://technet.microsoft.com/en-us/library/ms173494(v=sql.105).aspx –

+0

當你通過調整顧問看到的建議後,你必須做出決定是否根據您的個人需求創建索引或不索引。 –

回答

6

是的,你可以,它們被稱爲假設索引,而不是虛擬索引。它們通常由數據庫優化顧問創建,並被查詢優化器忽略,除非在自動駕駛模式下運行查詢。

所以,要做到這一點,你需要做到以下幾點:

你的桌子上創建假想的指標:

CREATE NONCLUSTERED INDEX IX_Hypothetical ON dbo.tableName (columnName) 
WITH STATISTICS_ONLY = -1 

這會在SYS.INDEXES表與is_hypothetical標誌設置的條目到1(即索引實際上並不存在,只是統計數據)

然後您需要找到一些關於要給自動駕駛儀的索引的信息,您需要數據庫ID,表的對象ID和索引的id號,哪個喲ü可以用下面的查詢得到:

SELECT dbid = DB_ID(), 
     objectid = 
object_id, 
     indid = index_id 
    FROM sys.indexes 
WHERE 
object_id = 
OBJECT_ID('dbo.tableName') 
    AND is_hypothetical = 1 

在我的情況下,DBID = 7,OBJECTID = 1237579447和的indid = 4

然後,您可以運行在自動駕駛模式下你的查詢以獲得一個執行計劃,可以如果您創建的假想索引你的桌子上實際存在的生成:

DBCC AUTOPILOT(0, 7, 1237579447, 4) 
GO 
SET AUTOPILOT ON 
GO 
SELECT * FROM dbo.tableName 
WHERE columnName = 8 
GO 
SET AUTOPILOT OFF 

的0是對象的typeid的,0是聚集索引,我相信6聚集索引,您可以運行DBCC自動駕駛儀多次不同的索引如果你創建了多個一個在運行SET AUTOPILOT ON之前,以便您可以讓優化器評估所有這些。

還要記住,這完全沒有Microsoft的文檔,所以不建議在開發機器之外使用,並且可以在不帶警告的版本之間更改,所以不要太依賴於它的工作方式。

+0

這似乎是我記得的!但這比我想象的要複雜一些。無論如何,它回答了我的問題。 – FrankPl

+0

不敢相信我從來沒有聽說過這個! –