我通过下面的代码查询到的: select COUNT(*)*8/1024 as 'CachedSize(MB)', case database_id when 32767 then 'resourceDb' else DB_NAME(database_id) end as 'Database' from sys.dm_os_buffer_descriptors group by DB_NAME(database_id),database_id order by 'CachedSize(MB)' desc 我们的业务库在缓冲池里面才占40GB的内存,我又去比较了一下另一个服务器上面的tempdb,发现才占3GB的内存,于是锁定了问题。
如果你现在的情况还存在,执行一下这个,贴结果给我看看: SELECT t1.session_id , ( t1.internal_objects_alloc_page_count + task_alloc ) AS allocated , ( t1.internal_objects_dealloc_page_count + task_dealloc ) AS deallocated FROM sys.dm_db_session_space_usage AS t1 , ( SELECT session_id , SUM(internal_objects_alloc_page_count) AS task_alloc , SUM(internal_objects_dealloc_page_count) AS task_dealloc FROM sys.dm_db_task_space_usage GROUP BY session_id ) AS t2 WHERE t1.session_id = t2.session_id AND t1.session_id > 50ORDER BY allocated DESC
我也觉的啊。。 +1存储过程 里,我从没写过 drop table #临时表的。 会话结束了,这个资源也就适放了啊.. 加drop table 可能会快一点点回收资源而已啊.
-- 楼主,用这个查查 use tempdb go SELECT t.dbName, t.TableName, t.cachedPageCt, t.Mb FROM(
SELECT CASE database_id WHEN 32767 THEN 'ResourceDb' ELSE db_name(a.database_id) END AS dbName,OBJECT_NAME(c.object_id) TableName,COUNT(*) cachedPageCt,COUNT(*)*8/1024.0 Mb from sys.dm_os_buffer_descriptors a left join sys.allocation_units b ON a.allocation_unit_id=b.allocation_unit_id left join sys.partitions c ON b.container_id=c.hobt_id WHERE 1=1 group by a.database_id,c.object_id having COUNT(*)*8/1024.0>1 )t WHERE (t.dbName ='tempdb' )order by dbName,cachedPageCt DESC;
-- 楼主,用这个查查 use tempdb go SELECT t.dbName, t.TableName, t.cachedPageCt, t.Mb FROM(
SELECT CASE database_id WHEN 32767 THEN 'ResourceDb' ELSE db_name(a.database_id) END AS dbName,OBJECT_NAME(c.object_id) TableName,COUNT(*) cachedPageCt,COUNT(*)*8/1024.0 Mb from sys.dm_os_buffer_descriptors a left join sys.allocation_units b ON a.allocation_unit_id=b.allocation_unit_id left join sys.partitions c ON b.container_id=c.hobt_id WHERE 1=1 group by a.database_id,c.object_id having COUNT(*)*8/1024.0>1 )t WHERE (t.dbName ='tempdb' )order by dbName,cachedPageCt DESC;
找了问题,发现在数据库中老是报错,18056. The client was unable to reuse a session with SPID 106, which had been reset for connection pooling. The failure ID is 29. This error may have been caused by an earlier operation failing. Check the error logs for failed operations immediately before this error message.中文: 客户端无法重新使用 SPID 为 106 的会话,该会话已被重置用于连接池。失败 ID 为 29。此错误可能是由于先前的操作失败引起的。请查看错误日志,了解紧位于此错误消息之前的失败操作。怎么办啊?
如方便,可以将以下结果发给我,[email protected] @@VERSIONSELECT * , cntr_value * 1.0 / 1024 / 1024 AS Memory_GB FROM sys.dm_os_performance_counters WHERE ( [OBJECT_NAME] LIKE '%Memory Manager%' ) AND counter_name IN ( 'Target Server Memory (KB)', 'Total Server Memory (KB)' )SELECT SUM(single_pages_kb) * 1.0 / 1024 AS total_single_pages_MB , SUM(multi_pages_kb) * 1.0 / 1024 AS total_multi_pages_MB , SUM(virtual_memory_reserved_kb) * 1.0 / 1024 AS total_virtual_memory_reserved_MB , SUM(virtual_memory_committed_kb) * 1.0 / 1024 AS total_virtual_memory_committed_MB , SUM(awe_allocated_kb) * 1.0 / 1024 AS total_awe_allocated_MB , SUM(shared_memory_reserved_kb) * 1.0 / 1024 AS total_shared_memory_reserved_MB , SUM(shared_memory_committed_kb) * 1.0 / 1024 AS total_shared_memory_committed_MB FROM sys.dm_os_memory_clerksSELECT a.name DBName , SUM(CAST(b.size * 8.0 / 1024 / 1024 AS NUMERIC(20, 3))) [FileSize(GB)] FROM sys.databases a INNER JOIN sys.master_files b ON a.database_id = b.database_id GROUP BY a.name ORDER BY [FileSize(GB)] DESCSELECT CASE database_id WHEN 32767 THEN 'ResourceDb' ELSE DB_NAME(database_id) END AS Database_name , COUNT(*) AS cached_pages_count , COUNT(*) * 8.0 / 1024 / 1024 AS cached_pages_count_inSize_GB FROM sys.dm_os_buffer_descriptors GROUP BY DB_NAME(database_id), database_id ORDER BY cached_pages_count DESC; SELECT TOP 50 [Wait type] = wait_type, [Total_Wait time (s)] = wait_time_ms / 1000, [Max_Wait_time (s)] = max_wait_time_ms /1000, [% waiting] = CONVERT(DECIMAL(12,2), wait_time_ms * 100.0 / SUM(wait_time_ms) OVER()) FROM sys.dm_os_wait_stats WHERE wait_type NOT LIKE '%SLEEP%' and wait_type NOT IN ('KSOURCE_WAKEUP', 'SLEEP_BPOOL_FLUSH', 'BROKER_TASK_STOP', 'XE_TIMER_EVENT', 'XE_DISPATCHER_WAIT', 'FT_IFTS_SCHEDULER_IDLE_WAIT', 'SQLTRACE_BUFFER_FLUSH', 'CLR_AUTO_EVENT', 'BROKER_EVENTHANDLER', 'LAZYWRITER_SLEEP', 'BAD_PAGE_PROCESS', 'BROKER_TRANSMITTER', 'CHECKPOINT_QUEUE', 'DBMIRROR_EVENTS_QUEUE', 'LAZYWRITER_SLEEP', 'ONDEMAND_TASK_QUEUE', 'REQUEST_FOR_DEADLOCK_SEARCH', 'LOGMGR_QUEUE', 'SLEEP_TASK', 'SQLTRACE_BUFFER_FLUSH', 'CLR_MANUAL_EVENT', 'BROKER_RECEIVE_WAITFOR', 'PREEMPTIVE_OS_GETPROCADDRESS', 'PREEMPTIVE_OS_AUTHENTICATIONOPS', 'BROKER_TO_FLUSH') ORDER BY wait_time_ms DESC;
看看是用户对象占了空间还是内部对象占了空间,如果都不是,就是行版本存储 --user objects: DECLARE userobj_cursor CURSOR FOR select sys.schemas.name + '.' + sys.objects.name from sys.objects, sys.schemas where object_id > 100 and type_desc = 'USER_TABLE'and sys.objects.schema_id = sys.schemas.schema_id go
open userobj_cursor go
declare @name varchar(256) fetch userobj_cursor into @name while (@@FETCH_STATUS = 0) begin exec sp_spaceused @objname = @name fetch userobj_cursor into @name end close userobj_cursor --internal objects: SELECT t1.session_id, (t1.internal_objects_alloc_page_count + task_alloc) as allocated, (t1.internal_objects_dealloc_page_count + task_dealloc) as deallocated from sys.dm_db_session_space_usage as t1, (select session_id, sum(internal_objects_alloc_page_count) as task_alloc, sum (internal_objects_dealloc_page_count) as task_dealloc from sys.dm_db_task_space_usage group by session_id) as t2 where t1.session_id = t2.session_id and t1.session_id >50 order by allocated DESC
select COUNT(*)*8/1024 as 'CachedSize(MB)',
case database_id when 32767 then 'resourceDb'
else DB_NAME(database_id)
end as 'Database'
from sys.dm_os_buffer_descriptors
group by DB_NAME(database_id),database_id
order by 'CachedSize(MB)' desc
我们的业务库在缓冲池里面才占40GB的内存,我又去比较了一下另一个服务器上面的tempdb,发现才占3GB的内存,于是锁定了问题。
SELECT t1.session_id ,
( t1.internal_objects_alloc_page_count + task_alloc ) AS allocated ,
( t1.internal_objects_dealloc_page_count + task_dealloc ) AS deallocated
FROM sys.dm_db_session_space_usage AS t1 ,
( SELECT session_id ,
SUM(internal_objects_alloc_page_count) AS task_alloc ,
SUM(internal_objects_dealloc_page_count) AS task_dealloc
FROM sys.dm_db_task_space_usage
GROUP BY session_id
) AS t2
WHERE t1.session_id = t2.session_id
AND t1.session_id > 50ORDER BY allocated DESC
dbcc inputbuffer(210)
dbcc inputbuffer(207)
dbcc inputbuffer(104)
dbcc inputbuffer(83)看看这些会话都在干嘛
服务器总内存224GB
但是它的tempdb在缓冲池只占3GB的缓存。比较了一下,发现问题在于tempdb的数据缓存占缓冲池的大小是主要问题。
会话结束了,这个资源也就适放了啊..
加drop table 可能会快一点点回收资源而已啊.
-- 楼主,用这个查查
use tempdb
go SELECT t.dbName, t.TableName, t.cachedPageCt, t.Mb
FROM(
SELECT CASE database_id
WHEN 32767 THEN 'ResourceDb'
ELSE db_name(a.database_id)
END AS dbName,OBJECT_NAME(c.object_id) TableName,COUNT(*) cachedPageCt,COUNT(*)*8/1024.0 Mb
from sys.dm_os_buffer_descriptors a
left join sys.allocation_units b ON a.allocation_unit_id=b.allocation_unit_id
left join sys.partitions c ON b.container_id=c.hobt_id
WHERE 1=1
group by a.database_id,c.object_id having COUNT(*)*8/1024.0>1
)t
WHERE (t.dbName ='tempdb' )order by dbName,cachedPageCt DESC;
-- 楼主,用这个查查
use tempdb
go SELECT t.dbName, t.TableName, t.cachedPageCt, t.Mb
FROM(
SELECT CASE database_id
WHEN 32767 THEN 'ResourceDb'
ELSE db_name(a.database_id)
END AS dbName,OBJECT_NAME(c.object_id) TableName,COUNT(*) cachedPageCt,COUNT(*)*8/1024.0 Mb
from sys.dm_os_buffer_descriptors a
left join sys.allocation_units b ON a.allocation_unit_id=b.allocation_unit_id
left join sys.partitions c ON b.container_id=c.hobt_id
WHERE 1=1
group by a.database_id,c.object_id having COUNT(*)*8/1024.0>1
)t
WHERE (t.dbName ='tempdb' )order by dbName,cachedPageCt DESC;
The client was unable to reuse a session with SPID 106, which had been reset for connection pooling. The failure ID is 29. This error may have been caused by an earlier operation failing. Check the error logs for failed operations immediately before this error message.中文:
客户端无法重新使用 SPID 为 106 的会话,该会话已被重置用于连接池。失败 ID 为 29。此错误可能是由于先前的操作失败引起的。请查看错误日志,了解紧位于此错误消息之前的失败操作。怎么办啊?
你的系统大量使用临时表或着有很多排序、分组、聚合之类的要使用的tempdb来缓存数据如果内存没有压力,已经删除的tempdb临时表数据虽然被删除,但在buffer pool中没有被释放,因为内存没有瓶颈,这个是SQL设计使然。进一步排查,需要楼主提供更多一些的信息。
cntr_value * 1.0 / 1024 / 1024 AS Memory_GB
FROM sys.dm_os_performance_counters
WHERE ( [OBJECT_NAME] LIKE '%Memory Manager%' )
AND counter_name IN ( 'Target Server Memory (KB)',
'Total Server Memory (KB)' )SELECT SUM(single_pages_kb) * 1.0 / 1024 AS total_single_pages_MB ,
SUM(multi_pages_kb) * 1.0 / 1024 AS total_multi_pages_MB ,
SUM(virtual_memory_reserved_kb) * 1.0 / 1024 AS total_virtual_memory_reserved_MB ,
SUM(virtual_memory_committed_kb) * 1.0 / 1024 AS total_virtual_memory_committed_MB ,
SUM(awe_allocated_kb) * 1.0 / 1024 AS total_awe_allocated_MB ,
SUM(shared_memory_reserved_kb) * 1.0 / 1024 AS total_shared_memory_reserved_MB ,
SUM(shared_memory_committed_kb) * 1.0 / 1024 AS total_shared_memory_committed_MB
FROM sys.dm_os_memory_clerksSELECT a.name DBName ,
SUM(CAST(b.size * 8.0 / 1024 / 1024 AS NUMERIC(20, 3))) [FileSize(GB)]
FROM sys.databases a
INNER JOIN sys.master_files b ON a.database_id = b.database_id
GROUP BY a.name
ORDER BY [FileSize(GB)] DESCSELECT CASE database_id
WHEN 32767 THEN 'ResourceDb'
ELSE DB_NAME(database_id) END AS Database_name ,
COUNT(*) AS cached_pages_count ,
COUNT(*) * 8.0 / 1024 / 1024 AS cached_pages_count_inSize_GB
FROM sys.dm_os_buffer_descriptors
GROUP BY DB_NAME(database_id),
database_id
ORDER BY cached_pages_count DESC;
SELECT TOP 50
[Wait type] = wait_type,
[Total_Wait time (s)] = wait_time_ms / 1000,
[Max_Wait_time (s)] = max_wait_time_ms /1000,
[% waiting] = CONVERT(DECIMAL(12,2), wait_time_ms * 100.0
/ SUM(wait_time_ms) OVER())
FROM sys.dm_os_wait_stats
WHERE wait_type NOT LIKE '%SLEEP%'
and wait_type NOT IN
('KSOURCE_WAKEUP', 'SLEEP_BPOOL_FLUSH', 'BROKER_TASK_STOP',
'XE_TIMER_EVENT', 'XE_DISPATCHER_WAIT', 'FT_IFTS_SCHEDULER_IDLE_WAIT',
'SQLTRACE_BUFFER_FLUSH', 'CLR_AUTO_EVENT', 'BROKER_EVENTHANDLER',
'LAZYWRITER_SLEEP', 'BAD_PAGE_PROCESS', 'BROKER_TRANSMITTER',
'CHECKPOINT_QUEUE', 'DBMIRROR_EVENTS_QUEUE', 'LAZYWRITER_SLEEP',
'ONDEMAND_TASK_QUEUE', 'REQUEST_FOR_DEADLOCK_SEARCH', 'LOGMGR_QUEUE',
'SLEEP_TASK', 'SQLTRACE_BUFFER_FLUSH', 'CLR_MANUAL_EVENT',
'BROKER_RECEIVE_WAITFOR', 'PREEMPTIVE_OS_GETPROCADDRESS',
'PREEMPTIVE_OS_AUTHENTICATIONOPS', 'BROKER_TO_FLUSH')
ORDER BY wait_time_ms DESC;
这样看来问题并不在DB上,而是在iis这块了。
oltp,一般并行度可以设置为1.
我是通过限制查询的并行度来优化的,而不是他上面说的那些方法。
还有,出现他上面说的情况,微软的帮助文档提到两点:
1、CPU占用率高,
2、上下文切换频繁。
我们的服务器主要是上下文切换频繁,我立即限制了并行查询,然后服务器又回复正常,但是大型查询却会变慢。
IIS中的垃圾回收机制是怎么修改的呢?谢谢
我是通过限制查询的并行度来优化的,而不是他上面说的那些方法。
还有,出现他上面说的情况,微软的帮助文档提到两点:
1、CPU占用率高,
2、上下文切换频繁。
我们的服务器主要是上下文切换频繁,我立即限制了并行查询,然后服务器又回复正常,但是大型查询却会变慢。除了并行度,还可以借用阈值来控制,比如阈值超过25秒之后才进行并行操作
我是通过限制查询的并行度来优化的,而不是他上面说的那些方法。
还有,出现他上面说的情况,微软的帮助文档提到两点:
1、CPU占用率高,
2、上下文切换频繁。
我们的服务器主要是上下文切换频繁,我立即限制了并行查询,然后服务器又回复正常,但是大型查询却会变慢。除了并行度,还可以借用阈值来控制,比如阈值超过25秒之后才进行并行操作那个基本没什么效果。
我是通过限制查询的并行度来优化的,而不是他上面说的那些方法。
还有,出现他上面说的情况,微软的帮助文档提到两点:
1、CPU占用率高,
2、上下文切换频繁。
我们的服务器主要是上下文切换频繁,我立即限制了并行查询,然后服务器又回复正常,但是大型查询却会变慢。除了并行度,还可以借用阈值来控制,比如阈值超过25秒之后才进行并行操作阀值问题,由默认的5s改为10s。
并行查询由0改为6,启动6个CPU执行并行查询。
--user objects:
DECLARE userobj_cursor CURSOR FOR
select
sys.schemas.name + '.' + sys.objects.name
from sys.objects, sys.schemas
where object_id > 100 and
type_desc = 'USER_TABLE'and
sys.objects.schema_id = sys.schemas.schema_id
go
open userobj_cursor
go
declare @name varchar(256)
fetch userobj_cursor into @name
while (@@FETCH_STATUS = 0)
begin
exec sp_spaceused @objname = @name
fetch userobj_cursor into @name
end
close userobj_cursor --internal objects:
SELECT
t1.session_id,
(t1.internal_objects_alloc_page_count + task_alloc) as allocated,
(t1.internal_objects_dealloc_page_count + task_dealloc) as
deallocated
from sys.dm_db_session_space_usage as t1,
(select session_id,
sum(internal_objects_alloc_page_count)
as task_alloc,
sum (internal_objects_dealloc_page_count) as
task_dealloc
from sys.dm_db_task_space_usage group by session_id) as t2
where t1.session_id = t2.session_id and t1.session_id >50
order by allocated DESC
就算tempdb占用缓存多,以前也是这样,但是性能没什么变化。
今天早上重启了服务器,现在为止,tempdb已经在缓冲池占了21GB的缓存,
按你的代码查询,第一个没有对象被缓存,第二个比较多,
真的是行版本占了内存吗?
没有任何作用,文档中的DMV都看过了,查询不出什么数据来