2013-07-05 40 views
0

我有大约200万行的数据库,我需要解决我当前的页面,并已决定去与以下几点:为此特定查询设置索引的最佳方式?

SET @startRowIndex = ((@Page-1) * @PageSize) + 1; 

    SET ROWCOUNT @startRowIndex 
    SELECT @first_id = ProductID FROM LiveProducts (nolock) WHERE [email protected] AND ModifiedOn >= @tStamp ORDER BY ProductID 

    SET ROWCOUNT @PageSize 
    SELECT * FROM LiveProducts (nolock) WHERE [email protected] AND ProductID >= @first_id ORDER BY ProductID 

我没有在附近一个DBA,我想这是因为快尽可能。我在这件事上设定了哪些指数。从我的阅读和我收集的基本知识中,我应该在ManufacturerID,ProductID和ModifiedOn上创建一个非聚集索引。

但是,他们应该都是Index key column s,或者只有一个在Included Columns

+0

你的分页逻辑没有意义。如果查询返回> 1行,那么第一个查询将不会以书面形式工作,因此您无法执行标量分配。你可能想说“@first_id”= MAX(ProductID)。您的第二个查询具有与第一个查询不同的WHERE子句。您至少需要在第二个查询中包含ModifiedOn> =“@tStamp”以获得一致的分页。 –

回答

0

第一个查询使用以下列:ProductId,ManufacturerIdModifiedOn

由于您在日期上有不平等,因此该索引可用于优化where子句,但不会优化order by。但是,通过在索引中包含ProductId,引擎可以使用以下索引满足整个查询:LiveProducts(ManufacturerId, ModifiedOn, ProductId)。请注意,这些列的排序很重要。而且,查询仍然需要对order by进行排序。

第二个查询是选择所有列,所以它需要转到原始数据。所以,优化仅限于where子句。为此,请使用LiveProducts(ManufacturerId, ProductId)。在这种情况下,它应该能够使用索引进行排序。

+0

所以我需要创建2个索引? – Slee

+0

@Slee。 。 。那么,对于两个查询的最佳索引,你确实需要两个索引。根据哪个查询需要更多的性能改进,您可以选择只有一个。 –