0

約 200 万行の DB があり、現在のページングを修正する必要があり、次のようにすることにしました。

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

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

    SET ROWCOUNT @PageSize
    SELECT * FROM LiveProducts (nolock) WHERE ManufacturerID=@ManufacturerID AND ProductID >= @first_id ORDER BY ProductID

私は DBA の近くにいないので、これをできるだけ速くしたいと思っています。このことにどのインデックスを設定する必要がありますか。私の読書と収集した基本的な理解から、ManufacturerID、ProductID、および ModifiedOn にクラスター化されていないインデックスを作成する必要があります。

しかし、それらはすべてIndex key columns である必要がありますか、それとも 1 つだけが存在し、他は s である必要がありIncluded Columnsますか?

4

1 に答える 1

0

最初のクエリでは、列 ProductIdManufacturerId、およびが使用されModifiedOnます。

日付に不等式があるため、インデックスを使用してwhere句を最適化できますが、order by. ただし、ProductIdインデックスに を含めることで、エンジンは次のインデックスを使用してクエリ全体を満たすことができます: LiveProducts(ManufacturerId, ModifiedOn, ProductId)。これらの列の順序が重要であることに注意してください。また、クエリは引き続き の並べ替えを行う必要がありますorder by

2 番目のクエリはすべての列を選択しているため、元のデータに移動する必要があります。したがって、最適化はwhere句のみに適用されます。これには、 を使用しますLiveProducts(ManufacturerId, ProductId)。この場合、ソートにインデックスを使用できるはずです。

于 2013-07-05T14:47:38.783 に答える