none
tempdb 占用的缓存怎么清除? RRS feed

  • 问题

  • 最近发现tempdb 占用的缓存特别多,因为很多批处理需要 申明临时表 但是最后都drop 掉了,可是tempdb 为什么回收的这么慢,有什么方法把tempdb缓存清除掉?

    请指教 谢谢

    2013年7月3日 5:06

答案

  • 查询 sys.dm_db_file_space_usage, 确认空间使用情况, 看是用户表、内部表, 行版本的占用, 还是没有被占用

    如果被占用, 那么无法清理, 必须先结束掉占用这些资源的操作

    如果是未用, 那么可以通过 dbcc shrinkfile 收缩文件

    • 已标记为答案 zhanggq 2013年7月4日 6:42
    2013年7月3日 11:47
  • tempdb Free space大吗?如果大的话可以考虑收缩一下。可以通过下面的语句查一下哪些部分占用的空间比较大然后再考虑优化。

    Select

        SUM(user_object_reserved_page_count)*8 asuser_objects_kb,

        SUM(internal_object_reserved_page_count)*8 asinternal_objects_kb,

        SUM(version_store_reserved_page_count)*as version_store_kb,

        SUM(unallocated_extent_page_count)*8 as freespace_kb

    From sys.dm_db_file_space_usage

    Where database_id = 2


    Please Mark As Answer if it is helpful.

    • 已标记为答案 zhanggq 2013年7月4日 6:42
    2013年7月3日 12:19
  • For cache buffer, sql will swap old data out when reads new data but not release memory to OS unless there's memory pressure on the machine.
    • 已标记为答案 zhanggq 2013年7月4日 6:42
    2013年7月3日 14:09

全部回复

  • 查询 sys.dm_db_file_space_usage, 确认空间使用情况, 看是用户表、内部表, 行版本的占用, 还是没有被占用

    如果被占用, 那么无法清理, 必须先结束掉占用这些资源的操作

    如果是未用, 那么可以通过 dbcc shrinkfile 收缩文件

    • 已标记为答案 zhanggq 2013年7月4日 6:42
    2013年7月3日 11:47
  • tempdb Free space大吗?如果大的话可以考虑收缩一下。可以通过下面的语句查一下哪些部分占用的空间比较大然后再考虑优化。

    Select

        SUM(user_object_reserved_page_count)*8 asuser_objects_kb,

        SUM(internal_object_reserved_page_count)*8 asinternal_objects_kb,

        SUM(version_store_reserved_page_count)*as version_store_kb,

        SUM(unallocated_extent_page_count)*8 as freespace_kb

    From sys.dm_db_file_space_usage

    Where database_id = 2


    Please Mark As Answer if it is helpful.

    • 已标记为答案 zhanggq 2013年7月4日 6:42
    2013年7月3日 12:19
  • For cache buffer, sql will swap old data out when reads new data but not release memory to OS unless there's memory pressure on the machine.
    • 已标记为答案 zhanggq 2013年7月4日 6:42
    2013年7月3日 14:09
  • 谢谢回复。

    我查了下 sys.dm_db_file_space_usage 

    大部分是freespace

    但是这个时候 查询sys.dm_os_buffer_descriptors  属于tempdb 的缓存很高,并且匹配不到临时表 

    那就说明在所排序和hash运算的时候占用的 可以这么理解吗?

    2013年7月4日 1:33
  • It's possible. By the way, sql stores certain temp objects in buffer. Moves them to disk if there's not enough memory. 
    2013年7月4日 1:59
  • 那有 没有办法能定时清除掉tempdb的缓存呢  
    2013年7月4日 3:11
  • Why you want to do that? Let sql take care of it.
    2013年7月4日 3:28
  • By the way, 450gb tempdb sounds big. Looks like had big process. You can check tempdb file growth report to figure out about what time this happened.
    2013年7月4日 3:34
  • 由这个需求为起点,应该向MS提建议,释放指定DBID的缓存,在一些情况下还是有实际意义的


    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com

    2013年7月4日 9:06
  • 自己就可以释放DB的缓存,用DBCC 命令。


    Please Mark As Answer if it is helpful.

    2013年7月5日 1:06
  • --DBCC DROPCLEANBUFFERS:从缓冲池中删除所有,清除缓冲区。在进行测试时,使用这个命令可以从sql server’s的数据缓存data cache(buffer)清除所有的测试数据,以保证测试的公正性。需要注意的是这个命令只移走干净的缓存,不移走脏缓存。由于这个原因,在执行这个命令前,应该先执行CheckPoint,将所有脏的缓存写入磁盘,这样在运行DBCC RROPCLEANBUFFERS 时,可以保证所有的数据缓存被清理,而不是其中的一部分。

    checkpoint
    DBCC DROPCLEANBUFFERS

    -------------------------------------------------

    --* DBCC FREEPROCCACHE
    --从过程缓冲区删除所有元素

    2013年7月5日 1:19
  • But there's no way to cleanup cache used by tempdb only.
    2013年7月5日 2:28