Questions tagged «dmv»

SQL Server中的DMV是数据库管理视图[&功能]的统称。从技术上讲,它们现在都是DMO(数据库管理对象),但是DMV一词仍被大多数人广泛理解和接受。

1
计划缓存大小和保留内存
当运行包括实际执行计划在内的查询时,根运算符(SELECT)告诉我缓存计划大小为32KB。 该连接的查询sys.dm_exec_cached_plans和sys.dm_os_memory_objects,看问题的计划,称该值pages_in_bytes和max_pages_in_bytes为32768(32KB),它匹配缓存计划的大小。 我不明白的是sys.dm_exec_cached_plans.size_in_bytes49152(48KB)中的值代表什么。我已经在所有这些专栏中阅读了BOL,尤其是size_in_bytes这样说: “ 缓存对象消耗的字节数。 ” 我无法理解难题的最后一部分,以了解其真正含义。 我知道所有运算符(不是在谈论用于排序和散列的额外内存授予)都需要一定数量的固定内存来存储状态,进行计算等,这些内存与优化后的计划一起存储在缓存中,但是在哪里? 因此,我的问题是: 到底是size_in_bytes什么意思 为什么它的值比“缓存的计划大小”高? 为所有操作员/迭代器保留的固定内存量是哪里,是使用“缓存的计划大小”(在我的示例中为32Kb)还是其他任何地方? 我知道它们是具有不同功能的不同DMV,但它们是相关的。在编译(缓存)计划sys.dm_exec_cached_plans加入sys.dm_os_memory_objects在memory_object_address列。我在此处发布问题的原因是,我正在寻求帮助,了解如何解释DMV及其列。 如果size_in_bytes是缓存的计划大小,为什么SQL Server在实际执行计划中说另一个值? 新查询,新数字: 实际计划 缓存的计划大小16KB 编译内存96KB DMV: sys.dm_exec_cached_plans.size_in_bytes 24KB sys.dm_os_memory_objects.pages_in_bytes, .max_pages_in_bytes 16KB。 另外,请注意,此查询不需要任何其他内存授予即可进行排序和哈希操作。 Microsoft SQL Server 2012-11.0.5343.0(X64)


2
stats_column_id和index_column_id不会随着聚集索引的物理顺序更改而更新
除非我对列的用途有误解,否则以下代码指示更改聚集索引的结构不会更改sys.stats_columns DMV中stats_column_id列的顺序位置()。(在AdventureWorks2014和AdventureWorks2008R2中测试) select i.name, c.name, ic.column_id, ic.index_column_id from sys.indexes i join sys.index_columns ic on i.object_id = ic.object_id and i.index_id = ic.index_id join sys.columns c on i.object_id = c.object_id and ic.column_id = c.column_id where i.name = 'PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID' order by ic.key_ordinal; select sh.name,s.name, c.name, c.column_id, sc.column_id, sc.stats_column_id from sys.stats s join sys.stats_columns …

5
提高sys.dm_db_index_physical_stats的性能
在维护工作期间,我正在尝试获取碎片索引的列表。但是查询非常慢,需要30多分钟才能执行。我认为这是由于对sys.dm_db_index_physical_stats进行的远程扫描。 有什么方法可以加快以下查询的速度: SELECT OBJECT_NAME(i.OBJECT_ID) AS TableName, i.name AS TableIndexName FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') phystat INNER JOIN sys.indexes i ON i.OBJECT_ID = phystat.OBJECT_ID AND i.index_id = phystat.index_id WHERE phystat.avg_fragmentation_in_percent > 20 AND OBJECT_NAME(i.OBJECT_ID) IS NOT NULL ORDER BY phystat.avg_fragmentation_in_percent DESC 我不是DBA,可能在上面的查询中犯了一个明显的错误,或者也许有些索引或统计信息会有所帮助?也许只是数据库的大小(大约20Gb,大约140个表)。 我问的原因是,我们在夜间只有一个很小的维护窗口,这在大多数时候都占用了。

5
在SQL Server中,有一种方法可以确定传递给正在执行的存储过程的参数的值
确定执行存储过程的一种方法是使用“动态管理”方法,如下所示: SELECT sqlText.Text, req.* FROM sys.dm_exec_requests req OUTER APPLY sys.dm_exec_sql_text(req.sql_handle) AS sqltext 但是,这仅显示存储过程的create语句的文本。例如: CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id 理想情况下,我想查看正在运行的过程的参数是什么,从而导致该过程对于特定的有问题的参数集运行了这么长时间。 有没有办法做到这一点?(在此问题中, Aaron Bertrand提到了DBCC InputBuffer,但我认为这不适用于此问题。)

3
DMV sys.dm_exec_requests中的total_elapsed_time是否完全不正确?
我正在运行SQL Server 2012,并尝试将一些查询放在一起以使用DMV进行监视。但是,当查看DMV 中的total_elapsed_time字段时sys.dm_exec_requests,数字看起来相去甚远。这是一个例子: SELECT session_id, RunTime = CURRENT_TIMESTAMP, start_time, total_elapsed_time FROM sys.dm_exec_requests WHERE session_id = 284; session_id RunTime start_time total_elapsed_time 284 2016-04-07 16:14:03.690 2016-04-07 16:08:14.587 1419976 根据我的计算*,经过时间应该在349,103左右,而不是1,419,976。相差四分之一。 *根据当前时间与start_time之间的差(以毫秒为单位),即 SELECT DATEDIFF(MILLISECOND, '2016-04-07T16:08:14.587', '2016-04-07T16:14:03.690'); 这是服务器信息: SELECT @@VERSION; Microsoft SQL Server 2012 - 11.0.5592.0 (X64) Apr 17 2015 15:18:46 Copyright (c) Microsoft …

2
sys.allocation_units和sp_spaceused上的空间使用情况
众所周知的事实是DMV不能保存有关页数和行数的准确信息。但是,当您更新统计信息时,我看不到为什么他们不这样做。 我正在使用一个监视工具,想知道每个索引和数据的磁盘大小,等等。最终我想找到正确的填充因子,以及其他东西。 我的函数使用的空间和旧的sp_spaceused在空间使用上有所不同,但在记录数上却没有。 您能看到我选择的商品中缺少什么吗? 这是sp_spaceused(然后我将数字转换为MB): sp_spaceused 'tblBOrderRelationship' go select 318008/1024.00 AS reserved, 140208/1024.00 AS data, 177048/1024.00 AS index_size, 752/1024.00 AS unused 但是,当我在下面的\下面的图片中运行我的select,代码时,我得到的数字略有不同。 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT schema_name(t.schema_id) as SchemaName, t.NAME AS TableName, t.type_desc, t.is_ms_shipped, t.is_published, t.lob_data_space_id, t.filestream_data_space_id, t.is_replicated, t.has_replication_filter, t.is_merge_published, t.is_sync_tran_subscribed, --t.is_filetable, i.name as indexName, i.type_desc, i.is_unique, …

2
读取DMV时将READ UNCOMMITTED设置为
我已经看到几个人SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在阅读系统DMV之前先打过电话。假设没有在同一事务中混合调用DMV和表,是否有任何理由这样做?
12 sql-server  dmv 


1
DMV sys.dm_exec_query_stats中的last_worker_time和last_elapsed_time有什么区别?
DMV sys.dm_exec_query_stats中的last_worker_time和last_elapsed_time是什么意思,它们之间有什么区别? 当我在查询下面触发 SELECT TOP 20 qs.last_worker_time, qs.last_worker_time/1000000 last_worker_time_in_S, qs.last_elapsed_time, qs.last_elapsed_time/1000000 last_elapsed_time_in_S FROM sys.dm_exec_query_stats qs order by qs.last_worker_time desc 我得到如下结果。 关于我发现要么两者都是相等的,要么是经过的时间大于工作人员的时间。我想理解两者的意义,因此也可能有助于我进行性能调整。


2
文档中sys.dm_exec_query_stats警告的实际影响是什么?
该文档的sys.dm_exec_query_stats状态如下: 如果服务器上当前正在执行工作负载,则对sys.dm_exec_query_stats的初始查询可能会产生不准确的结果。可以通过重新运行查询来确定更准确的结果。 我有时会在活动工作负载期间查询该DMV,并且希望获得准确的结果。我不知道如何在实践中应用上述警告。我应该总是查询DMV两次并使用第二个结果集,因为这样会更准确吗?这感觉有些牵强。我是否需要了解DMV可能不准确的方式,以便将其纳入分析?如果是这样,会出现什么样的错误:缺失的行,过时的值,不一致的行或其他? sys.dm_exec_query_stats在活动工作负载期间使用的最佳做法是什么?
10 sql-server  dmv 

1
sys.dm_exec_sessions中的“读取”列实际上指示什么?
这似乎是一个非常基本的问题,确实应该如此。但是,作为科学方法的忠实拥护者,我喜欢创建一个假设,然后对其进行检验以查看我是否正确。在这种情况下,我试图更好地理解的输出sys.dm_exec_sessions,更具体地说,是单列“读取”的输出。 SQL Server联机丛书相当干脆地将其指定为: 在此会话期间,由该会话中的请求执行的读取次数。不可为空。 一个人可能会认为这将指示自会话开始以来从磁盘读取的页数,以满足该会话发出的请求。这是我以为我会检验的假设。 该logical_reads表中的列定义为: 在会话上执行的逻辑读取数。不可为空。 从使用SQL Server的经验来看,我相信此列反映了从磁盘和内存读取的页面数。换句话说,页面的总数曾经由会话,无论这些页面驻留阅读。具有两个提供相似信息的独立列的差异或价值主张似乎是,对于特定会话,人们可以理解从磁盘读取的页面reads与从缓冲区高速缓存读取的页面的比率logical_reads。 在测试平台上,我创建了一个新数据库,创建了一个表,该表具有已知数量的数据页,然后在新会话中读取该表。然后,我sys.dm_exec_sessions查看了reads和logical_reads专栏对会议的看法。在这一点上,我对结果感到困惑。也许有人可以为我阐明这一点。 测试装备: USE master; IF EXISTS (SELECT 1 FROM sys.databases d WHERE d.name = 'TestReads') BEGIN ALTER DATABASE TestReads SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE TestReads; END GO CREATE DATABASE TestReads; GO ALTER DATABASE TestReads SET RECOVERY SIMPLE; BACKUP DATABASE …

4
有没有一种快速的方法来查找SQL Server 2008 R2中所有已加密/已加密数据的列?
有没有一种快速的方法来查找SQL Server 2008 R2中所有已加密/已加密数据的列? 我需要使开发服务器中所有加密列中的数据无效(根据我们的业务规则)。我知道大多数专栏是因为我们经常使用它们,但是我想透彻一点,也希望能够证明已经找到了所有专栏。 我已经在网上搜索,查看了INFORMATION_SCHEMA并检查了我认为有用的DMV以及sys.columns和sys.objects,但是到目前为止还算不上什么。

1
查询DMV sys.dm_os_performance_counters时返回零行
我有一个用户SQL Server 2014 Standard Edition (RTM)具有SYSADMIN与服务器视图状态权限的角色,但是当我执行DMV sys.dm_os_performance_counters返回没有记录。 知道权限有什么问题吗? @@ Version的输出: Microsoft SQL Server 2014-12.0.2000.8(X64)2014年2月20日20:04:26版权所有(c)Windows NT 6.3上的Microsoft Corporation标准版(64位)(内部版本9600 :)(管理程序)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.