小编Rom*_*anG的帖子

SQL Server 缓存了在某些情况下不是最佳的执行计划,并将其用于所有后续查询

我们的应用程序使用 SQL Server 2014,我们遇到了与计划缓存相关的问题。

我们有一个参数化查询,它的执行计划取决于参数值。服务器缓存在某些情况下不是最佳的执行计划,然后将其用于所有后续查询。

细节:

我们有一个由以下列组成的表:

(
 [Revision] [bigint] IDENTITY(1,1) NOT NULL,
 [UserId] [uniqueidentifier] NOT NULL,
 ...A WHOLE LOT OF OTHER COLUMNS...
)
Run Code Online (Sandbox Code Playgroud)

这两列的含义很清楚,UserId是记录所属用户的Id,是记录Revision的自增索引。其他列并不重要,但它们存在并影响执行计划。

该表包含 ~40.000.000 行和 ~200.000 个不同UserId值,因此每个用户平均有 200 条记录。行永远不会更新,我们只使用 INSERT 和 DELETE 来修改数据。

我们的应用程序对此表执行以下查询:

SELECT * FROM SampleTable WHERE Revision > {someRevision} AND UserId = {someId}
Run Code Online (Sandbox Code Playgroud)

该表有两个索引:

  1. 聚集索引: Revision asc
  2. 非聚集索引: UserId asc, Revision asc

当我手动执行此查询时,我看到执行计划取决于someRevision.

  • 如果是比较接近的修订目前的最高值,则服务器使用Clustered Index SeekSeek Predicate: Revision > someRevision

  • 如果它没有关闭,服务器使用Index Seek …

index sql-server execution-plan plan-cache

5
推荐指数
1
解决办法
1759
查看次数

标签 统计

execution-plan ×1

index ×1

plan-cache ×1

sql-server ×1