在SQL Server中,用户查询和系统查询之间有什么区别?

Red*_*ode 5 sql-server sqlperformance database-performance sql-server-2012

sys.dm_db_missing_index_group_stats的文档使用术语"用户查询"和"系统查询",但它没有定义这些含义.例如:

  • user_seeks:"由用户查询引起的搜索次数,该组中的推荐索引可能已被用于."
  • system_seeks:"由系统查询引起的搜索次数,例如自动统计信息查询,该组中的推荐索引可能已被用于."

基于在System查询中使用该术语的方式来确定数据库中权限的完整(包括从AD ROLES继承)的视图?,我假设系统查询是针对系统表的查询.然后,用户查询必须是针对用户表的查询.

有没有人对这两个术语的定义有更权威的来源?我问,因为我正在使用sys.dm_db_missing_index_group_stats的结果,并考虑如何在决定是否应用索引时正确权衡avg_user_impact与avg_system_impact.

8kb*_*8kb 5

从问题的答案是什么导致sys.dm_db_index_usage_stats中的system_scans计数?

我理解系统扫描/查找列与统计信息更新和索引维护有关.我问布伦特·奥扎尔大约一个月前他在德国演出的时候,我向他证实了这一点.

关于在系统上识别未使用的索引,我向他询问了这个问题.他说你只需要关注用户查询和用户扫描,系统实际上只是系统端操作.因此,自上次重置索引使用情况统计信息以来,查询尚未使用仅具有"系统"活动的索引.

我通过运行一些查询来部分证实了这一点 AdventureWorks2012:

/* Get the statistics from Sales.SalesOrderHeader */
EXEC sp_helpstats 'Sales.SalesOrderHeader'

-- Results: 
/*
statistics_name             statistics_keys
-------------------------------------------
_WA_Sys_00000004_4B7734FF   DueDate
_WA_Sys_00000008_4B7734FF   SalesOrderNumber
_WA_Sys_0000000D_4B7734FF   TerritoryID
_WA_Sys_0000000E_4B7734FF   BillToAddressID
_WA_Sys_0000000F_4B7734FF   ShipToAddressID
_WA_Sys_00000010_4B7734FF   ShipMethodID
_WA_Sys_00000011_4B7734FF   CreditCardID
_WA_Sys_00000013_4B7734FF   CurrencyRateID
*/

/* Update the statistics for the SalesOrderNumber stats */
UPDATE STATISTICS Sales.SalesOrderHeader _WA_Sys_00000008_4B7734FF WITH FULLSCAN

/* Get the index usage stats for that index */
SELECT
    DB_NAME(iu.database_id),
    OBJECT_NAME(iu.object_id),
    i.name,
    iu.user_seeks,
    iu.user_scans,
    iu.system_seeks,
    iu.system_scans
FROM sys.dm_db_index_usage_stats iu
JOIN sys.indexes i 
    ON iu.object_id = i.object_id
    AND iu.index_id = i.index_id
WHERE i.name = 'AK_SalesOrderHeader_SalesOrderNumber'

/*
DatabaseName        TableName           IndexName                               
AdventureWorks2012  SalesOrderHeader    AK_SalesOrderHeader_SalesOrderNumber    

user_seeks  user_scans  system_seeks    system_scans
0           0           0               1
*/

/* Seek and scan the index */
SELECT SalesOrderNumber
FROM Sales.SalesOrderHeader
WHERE SalesOrderNumber = N'A'
UNION ALL 
SELECT TOP 100 SalesOrderNumber
FROM Sales.SalesOrderHeader WITH (INDEX(AK_SalesOrderHeader_SalesOrderNumber))

/* 
Running the index usage query from above returns the following: 

DatabaseName        TableName           IndexName                               
AdventureWorks2012  SalesOrderHeader    AK_SalesOrderHeader_SalesOrderNumber    

user_seeks  user_scans  system_seeks    system_scans
1           1           0               1
*/

/* Rebuild the index to remove all usage stats */
ALTER INDEX AK_SalesOrderHeader_SalesOrderNumber ON Sales.SalesOrderHeader REBUILD
Run Code Online (Sandbox Code Playgroud)

因此用户搜索和扫描出现的使用管理视图看起来合适,并且更新统计信息的系统扫描与上面给出的答案相匹配.

但回到最初的问题,我会说你不需要担心系统搜索和系统扫描sys.dm_db_missing_index_group_stats.似乎他们会表示SQL Server正在尝试查找某种类型的自己的元数据,而没有正确的内部索引来满足查询.