创建索引并将其用作SQL SERVER 2012中同一批处理中的select语句中的提示

时间:2014-10-22 07:14:51

标签: sql-server indexing sql-server-2012

我希望使用SSMS的执行计划窗口比较存在特定索引的情况与不存在索引的情况之间的查询性能。

我正在使用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; 

它给我以下错误消息:

Index' IX_SalesOrderDetail_SALESDETAIL'在桌子上' Sales.SalesOrderDetail' (在FROM子句中指定)不存在。

我期待在上一行中创建的索引可用于下一行。

任何人都可以指导我出错或者我错过了什么,或者如何实现我想要的目标?

1 个答案:

答案 0 :(得分:3)

每批次进行编译,而不是按行进行。在第一个SELECT发生或创建索引之前,需要为第二个SELECT设计一个计划,该计划因索引尚不存在而失败。

GO之后加CREATE INDEX开始新批次。