Sql server 为什么从sys.dm\u db\u index\u usage\u stats选择返回两行/表?

Sql server 为什么从sys.dm\u db\u index\u usage\u stats选择返回两行/表?,sql-server,Sql Server,为什么我这样做: SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,* FROM sys.dm_db_index_usage_stats WHERE OBJECT_ID=OBJECT_ID('TestTableName') 我有两张唱片而不是一张吗 我计划使用last_user_update来确定来自上一次查询调用的某些本地缓存数据是否为当前数据,或者是否因为表已更改而过时 此查询返回的两条记录中的最后一个用户更新

为什么我这样做:

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE OBJECT_ID=OBJECT_ID('TestTableName') 
我有两张唱片而不是一张吗

我计划使用last_user_update来确定来自上一次查询调用的某些本地缓存数据是否为当前数据,或者是否因为表已更改而过时

此查询返回的两条记录中的最后一个用户更新列相同。我可以只使用第一条记录中的值吗,或者它们可能不同

有关结果,请参见下面的屏幕截图:


indexid为1表示聚集索引

indexid为2是一个非聚集索引

如果表的结构为堆(无聚集索引),则可能还会看到indexid为0。这实际上不是索引,但针对它的操作仍显示在此视图中

关于第二个问题,非聚集索引是否涵盖您感兴趣的所有列?如果您只关心是否更新了任何列,那么您也可以查看聚集索引的行,因为任何更新都不可能影响NCI,但不会影响CI


尽管您的方法可能会出现误报,因为本栏仅显示了执行计划的最后一次执行,其中包含可以更新此索引的运算符,而不是肯定发生了更新。此外,服务重新启动或数据库设置为脱机状态后,这些值将为null(自动关闭时可能会出现这种情况)。

此外,屏幕截图显示索引id为1,这是一个集群Index@Shaneis我没看那个。我阅读了下面的文本,似乎看到了属于下一列的0。谢谢,已编辑。+1 for“显示上次执行包含可更新此索引的操作员的执行计划的时间,而不是显示确实发生了更新。此外,在服务重新启动或数据库设置为脱机后,这些值将为空(自动关闭时可能会发生)。@TheGameiswar谢谢。更多细节在这里顺便说一句
DatabaseName    last_user_update    database_id object_id   index_id    user_seeks  user_scans  user_lookups    user_updates    last_user_seek  last_user_scan  last_user_lookup    last_user_update    system_seeks    system_scans    system_lookups  system_updates  last_system_seek    last_system_scan    last_system_lookup  last_system_update
TestTableName 2016-04-27 07:53:51.740   5   939150391   1   0   101556  101557  6   NULL    2016-04-28 07:27:17.933 2016-04-28 07:27:17.927 2016-04-27 07:53:51.740 0   3   0   0   NULL    2016-04-27 07:52:49.203 NULL    NULL
TestTableName   2016-04-27 07:53:51.740 5   939150391   2   101559  3   0   6   2016-04-28 07:27:17.927 2016-04-26 17:31:21.200 NULL    2016-04-27 07:53:51.740 0   1   0   0   NULL    2016-04-27 18:21:53.977 NULL    NULL