2014-10-22 43 views
0

我想比較查詢在特定索引存在的情況下與索引不存在時的性能SSMS的執行計劃窗口。創建一個索引並將其用作同一批處理中的SELECT語句中的提示SQL SERVER 2012

我正在使用AdventureWorks2012數據庫。 以下是我的示例查詢。

SELECT TOP 10000 SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber 
, OrderQty, ProductID, SpecialOfferID, UnitPrice, UnitPriceDiscount, LineTotal, rowguid, ModifiedDate 
    FROM Sales.SalesOrderDetail 
    where SalesOrderID = 57058; 


CREATE NONCLUSTERED INDEX IX_SalesOrderDetail_SALESDETAIL ON Sales.SalesOrderDetail 
    (SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber 
, OrderQty, ProductID, SpecialOfferID, UnitPrice, UnitPriceDiscount, LineTotal, rowguid, ModifiedDate) 


SELECT TOP 10000 SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber 
, OrderQty, ProductID, SpecialOfferID, UnitPrice, UnitPriceDiscount, LineTotal, rowguid, ModifiedDate 
    FROM Sales.SalesOrderDetail WITH(INDEX(IX_SalesOrderDetail_SALESDETAIL)) 
    where SalesOrderID = 57058; 

它給了我下面的錯誤信息:

指數 'IX_SalesOrderDetail_SALESDETAIL' 對錶 'Sales.SalesOrderDetail' 不存在(在FROM子句中指定)。

我期待在上一行創建的索引將可用於下一行。

任何機構能指導我發生什麼事情或者我缺少什麼或者如何實現我所尋找的?

回答

3

編譯發生在每批,而不是每行。在第一個SELECT發生或創建索引之前,需要爲第二個SELECT設計一個計劃,該計劃由於索引尚不存在而失敗。

CREATE INDEX之後放置一個GO開始新批次。

+0

並採取暗示。認真。它似乎是99.999%不需要 - 選擇索引時,sql server不是愚蠢的。 – TomTom 2014-10-22 07:31:23

+0

@ jeroen,我想你並不完全正確。即使我刪除了第一個select語句並僅使用第二個select語句,也會發生同樣的問題。 如果你的意思是別的,你可以添加更多的細節或給樣品嗎? – Satyajit 2014-10-22 07:55:37

+0

該聲明將被編譯兩次。一旦編譯了批處理,那麼添加索引將在執行時導致重新編譯。因此,它應該自動提取索引的存在,而無需提示。 – 2014-10-22 07:57:15

相關問題