因此,任何时候你使用dmv,当你查看从SQL Server 2005的dmvs返回的相关资料时,请务必将以上的观点装在脑海中。只有当你确信从dmvs获得的信息是准确和完整的,你才能变更数据库或者应用程序代码。
下面就看一下dmv到底能带给我们那些好的功能呢?
1.51 :索引使用次数
我们下看一下下面两种查询方式返回的结果(这两种查询的查询用途一致)
①—-
declare @dbid int
select @dbid = db_id()
select objectname=object_name(s.object_id), s.object_id, indexname=i.name, i.index_id
, user_seeks, user_scans, user_lookups, user_updates
from sys.dm_db_index_usage_stats s,
sys.indexes i
where database_id = @dbid and objectproperty(s.object_id,’IsUserTable’) = 1and i.object_id = s.object_id
and i.index_id = s.index_id
order by (user_seeks + user_scans + user_lookups + user_updates) asc
返回查询结果
②:使用多的索引排在前面
SELECT objects.name ,
databases.name ,
indexes.name ,
user_seeks ,
user_scans ,
user_lookups ,
partition_stats.row_count
FROM sys.dm_db_index_usage_stats stats
LEFT JOIN sys.objects objects ON stats.object_id = objects.object_id
LEFT JOIN sys.databases databases ON databases.database_id = stats.database_id
LEFT JOIN sys.indexes indexes ON indexes.index_id = stats.index_id
AND stats.object_id = indexes.object_id
LEFT JOIN sys.dm_db_partition_stats partition_stats ON stats.object_id = partition_stats.object_id AND indexes.index_id = partition_stats.index_id
WHERE 1 = 1AND databases.database_id = 7AND objects.name IS NOT NULL
AND indexes.name IS NOT NULL
AND user_scans>0
ORDER BY user_scans DESC ,
stats.object_id ,
indexes.index_id
SELECT
TOP 100 execution_count,
total_logical_reads /execution_count AS [Avg Logical Reads],
total_elapsed_time /execution_count AS [Avg Elapsed Time],
db_name(st.dbid) as [database name],
object_name(st.dbid) as [object name],
object_name(st.objectid) as [object name 1],
SUBSTRING(st.text, (qs.statement_start_offset / 2) + 1,
((CASE statement_end_offset
WHEN - 1ELSE qs.statement_end_offset
END - qs.statement_start_offset) / 2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
WHERE execution_count > 100ORDERBY1DESC;
返回结果:
执行时间最长的命令
SELECT
TOP 10 COALESCE(DB_NAME(st.dbid),
DB_NAME(CAST(pa.valueasint))+’*’,
‘Resource’) AS DBNAME,
SUBSTRING(text,
– starting valuefor substring
CASEWHEN statement_start_offset = 0OR statement_start_offset ISNULLTHEN1ELSE statement_start_offset/2 + 1END,
– ending valuefor substring
CASEWHEN statement_end_offset = 0OR statement_end_offset = -1OR statement_end_offset ISNULLTHEN LEN(text)
ELSE statement_end_offset/2END -
CASEWHEN statement_start_offset = 0OR statement_start_offset ISNULLTHEN1ELSE statement_start_offset/2END + 1
) AS TSQL,
total_logical_reads/execution_count AS AVG_LOGICAL_READS
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle) st
OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) pa
WHERE attribute = ‘dbid’
ORDERBY AVG_LOGICAL_READS DESC ;
CREATE INDEX NCLIX_Sales_ProductID–Index name
ON dbo.Sales(ProductID)–Columnon which index isto be created
INCLUDE(SalesDate, SalesPersonID)–Additional columnvaluesto include
selectcount(*) from record wheredate >’19991201’ anddate < ‘19991214’and amount >2000 (25秒)
selectdate ,sum(amount) from record groupbydate(55秒)
selectcount(*) from record wheredate >’19990901’ and place in (‘BJ’,’SH’) (27秒)
selectcount(*) from record wheredate >’19991201’ anddate < ‘19991214’ and amount >2000 (14秒)
selectdate,sum(amount) from record groupbydate(28秒)
selectcount(*) from record wheredate >’19990901’ and place in (‘BJ’,’SH’)(14秒)
selectcount(*) from record wheredate >’19991201’ anddate < ‘19991214’ and amount >2000 (26秒)
selectdate,sum(amount) from record groupbydate(27秒)
selectcount(*) from record wheredate >’19990901’ and place in (‘BJ, ‘SH’)(< 1秒)