SqlServerDBCC SHRINKFILE不起作用
检查索引碎片的结果:
CREATE DATABASE test_shrink
USE test_shrink CREATE TABLE show_extent(a INT,b NVARCHAR(3900)) DECLARE @i INT
SET @i=1
WHILE @i<=100
BEGIN INSERT INTO show_extent VALUES(1,REPLICATE(N'a',3900))
INSERT INTO show_extent VALUES(2,REPLICATE(N'b',3900))
INSERT INTO show_extent VALUES(3,REPLICATE(N'c',3900))
INSERT INTO show_extent VALUES(4,REPLICATE(N'd',3900))
INSERT INTO show_extent VALUES(5,REPLICATE(N'e',3900))
INSERT INTO show_extent VALUES(6,REPLICATE(N'f',3900))
INSERT INTO show_extent VALUES(7,REPLICATE(N'g',3900))
INSERT INTO show_extent VALUES(8,REPLICATE(N'h',3900)) SET @i=@i+1
END
--检查索引碎片
DBCC SHOWCONTIG('show_extent') --删除a列不是5的数据
DELETE dbo.show_extent WHERE a<>5
--显示数据文件 64kb
EXEC sys.sp_spaceused @objname = N'show_extent' -- nvarchar(776) DBCC SHOWCONTIG('show_extent') --查看数据库的文件和日志大小
EXEC sys.sp_helpfile
--fileid为1 收缩到40MB
DBCC SHRINKFILE(2,40) --建立索引释放没有使用的区
CREATE CLUSTERED INDEX show_I ON dbo.show_extent(a)
--检查索引碎片
DBCC SHOWCONTIG('show_extent')
--收缩文件
DBCC SHRINKFILE(1,1)
--查看数据库的占用空间和未分配的空间
EXEC sys.sp_spaceused @objname = N'show_extent' SELECT * FROM dbo.show_extent --找出每个区的对象理论上区数目和实际数目,然后重建大对象类型的表
USE test_shrink --建立临时表
CREATE TABLE #extentinfo
(
[file_id] SMALLINT,
page_id INT,
pg_alloc INT,
ext_size INT,
obj_id INT,
index_id INT,
partition_number INT,
partition_id BIGINT,
iam_chain_type VARCHAR(50),
pfs_bytes VARBINARY(10)
) CREATE PROCEDURE import_extentinfo
as
DBCC extentinfo DBCC extentinfo('test_shrink') INSERT INTO #extentinfo EXEC import_extentinfo SELECT [file_id],obj_id,index_id,partition_id,ext_size,
'actual extent count'=COUNT(*),'actual page count'=SUM(pg_alloc),
'possible extent count'=ceiling(SUM(pg_alloc)*1.0/ext_size),
'possible extents/actual extents'=
(ceiling(SUM(pg_alloc)*1.00/ext_size)*100.00)/COUNT(*)
FROM #extentinfo
GROUP BY file_id,obj_id,index_id,partition_id,ext_size
HAVING COUNT(*) -ceiling(SUM(pg_alloc)*1.0/ext_size)>0
ORDER BY partition_id,obj_id,index_id,file_id --SQL2005以后有一个动态管理视图sys.dm_exec_query_stats,返回缓存查询计划的性能统计信息
--SQL会统计从上次SQL启动以来,一共做了多少次logical读写,多少次physical读,还记录执行所用的 CPU时间总量
--按照物理读的页面数排序 前50名
SELECT TOP 50
qs.total_physical_reads,qs.execution_count,
qs.total_physical_reads/qs.execution_count AS [avg I/O],
--截取字符串
SUBSTRING(qt.text,qs.statement_start_offset/2,
(CASE WHEN qs.statement_end_offset=-1
THEN LEN(CONVERT(NVARCHAR(max),qt.text))*2
ELSE qs.statement_end_offset END -qs.statement_start_offset)/2) AS query_text,
qt.dbid,dbname=DB_NAME(qt.dbid),
qt.objectid,
qs.sql_handle,
qs.plan_handle
from sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
ORDER BY qs.total_physical_reads DESC --SQL Trace里面有一个reads字段,记录了某条语句完成过程中一共做了多少次读的动作,找到read最多的语句
--每个SQL Trace里有成千成万的语句,可以使用fn_trace_gettable 像一张表一样把trace文件里的记录查询出来
--可以用他将记录转入到SQLSERVER里,然后用查询语句进行统计分析。 SELECT * INTO #SAMPLE
FROM sys.fn_trace_gettable('C:\Users\Administrator\Desktop\1.trc',DEFAULT)
WHERE EventClass IN(10,12) select * from sys.sysprocesses --运行下面DBCC命令释放SQL内存缓存
DBCC freesessioncache
DBCC freeproccache
处理过后的索引碎片:
--SQL2005以后有一个动态管理视图sys.dm_exec_query_stats,返回缓存查询计划的性能统计信息
--SQL会统计从上次SQL启动以来,一共做了多少次logical读写,多少次physical读,还记录执行所用的 CPU时间总量
--按照物理读的页面数排序 前50名
SELECT TOP 50
qs.total_physical_reads,qs.execution_count,
qs.total_physical_reads/qs.execution_count AS [avg I/O],
--截取字符串
SUBSTRING(qt.text,qs.statement_start_offset/2,
(CASE WHEN qs.statement_end_offset=-1
THEN LEN(CONVERT(NVARCHAR(max),qt.text))*2
ELSE qs.statement_end_offset END -qs.statement_start_offset)/2) AS query_text,
qt.dbid,dbname=DB_NAME(qt.dbid),
qt.objectid,
qs.sql_handle,
qs.plan_handle
from sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
ORDER BY qs.total_physical_reads DESC
--找出使用内存比较多的语句,简化他们,调整应用程序行为,减少工作负荷
--检查动态管理视图,了解每个查询资源信号量的状态信息。(SQL里默认有两个查询资源信号量,分别处理复杂度不一样
--的查询,这样的设计有助于防止几个超大的查询把整个SQL资源用尽,连一些很简单的查询都不能响应的现象发生)
--检查语句:
SELECT CONVERT(VARCHAR(30),GETDATE(),121) AS runtime,
resource_semaphore_id,
target_memory_kb,
total_memory_kb,
available_memory_kb,
granted_memory_kb,
used_memory_kb,
grantee_count,
waiter_count,
timeout_error_count
from sys.dm_exec_query_resource_semaphores
--resource_semaphore_id:资源信号量的非唯一ID,0表示常规资源信号量,1表示小型查询资源信号量
--target_memory_kb:该资源信号量能够授予使用的内存目标,也就是当前的使用上限
--total_memory_kb:资源信号量现在所持有的总内存,是可用内存和被授予内存的和。如果系统内存不足或频繁强制缩小内存,该值可以
--大于target_memory_kb值,但意味着这个资源信号量有内存压力
--available_memory_kb:可用于新授予的内存
--granted_memory_kb:授予的总内存
--used_memory_kb:授予内存中实际使用的部分
--grantee_count:内存授予得到满足的活动查询数
--waiter_count:等待内存授予得到满足的查询数,如果不为0,意味着内存压力存在
--timeout_error_count:自服务器启动以来的超时错误总数,对于小型查询资源信号量,该值为null
--检查sys.dm_exec_query_memory_grants,返回已经获得内存授予的查询的有关信息,或依然在等待内存授予的查询的
--有关信息。无须等待就获得内存授予的查询将不会出现在此视图中。所以对一个没有内存压力的SQL,这个视图应该是空的
SELECT GETDATE() AS runtime,
session_id,
scheduler_id,
dop,
request_time,
grant_time,
requested_memory_kb,
granted_memory_kb,
used_memory_kb,
timeout_sec,
query_cost,
resource_semaphore_id,
wait_order,
is_next_candidate,
wait_time_ms,
REPLACE(REPLACE(CAST(s2.text AS VARCHAR(4000)),CHAR(10),''),CHAR(13),'') AS sql_statement
FROM sys.dm_exec_query_memory_grants
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2
--返回控制
--session_id:正在运行查询的会话ID(spid)
--scheduler_id:正在计划查询的SQL Processor调度的ID
--dop:查询的并行度
--request_time:查询请求内存授予的日期和时间
--grant_time:向查询授予内存的日期和时间。如果尚未授予内存,则此值为null
--requested_memory_kb:请求的内存总量
--granted_memory_kb:实际授予的内存总量。如果尚未授予内存,该值为null。在典型情况下,该值应该与requested_memory_kb相同
--创建索引时,除了初始授予的内存外,服务器还允许增加按需分配的内存
--used_memory_kb:此刻使用的物理内存
--query_cost:估计查询开销
--timeout_sec:查询放弃内存授予请求前的超时时间
--resource_semaphore_id:查询正在等待的资源信号量的非唯一ID
--wait_order:等待查询在指定的queue_id中的顺序,如果其他查询获得内存授予或超时,则给定查询的该值可以更改。如果已授予内存,则为null
--is_next_candidate:下一个内存授予的候选对象:1:是 0:否 null:已授予内存
--wait_time_ms:等待时间。如果已经授予内存,则为null
--plan_handle:查询计划的标志符。使用sys.dm_exec_query_plan可提取实际的xml计划
--sql_handle:查询的TSQL文本标志符。查询中使用他链接sys.dm_exec_sql_text获取实际的TSQL文本
--SQL2005 DMV SQL启动以来累计使用CPU资源最多的语句 前50名
SELECT
highest_cpu_queries.*,
highest_cpu_queries.total_worker_time,
DB_NAME(q.dbid) AS dbname,
q.[text] AS qtext
from
(SELECT TOP 50 qs.* from sys.dm_exec_query_stats qs ORDER BY qs.total_worker_time DESC) AS highest_cpu_queries
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS q
ORDER BY highest_cpu_queries.total_worker_time DESC
--找到最经常做重编译的存储过程
SELECT TOP 25
sql_text.text AS sqltext,
sql_handle AS sqlhandle,
plan_generation_num AS plangenerationnum,
execution_count AS execcount,
DB_NAME(dbid) AS dbname,
objectid AS objectid
from sys.dm_exec_query_stats a
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sql_text
WHERE plan_generation_num>1
ORDER BY plan_generation_num DESC
--返回经常执行的100条语句
--返回最经常运行的100条语句
SELECT TOP 100
cp.cacheobjtype,
cp.usecounts,
cp.size_in_bytes,
qs.statement_start_offset,
qs.statement_end_offset,
qt.dbid,
qt.objectid,SUBSTRING(qt.text,qs.statement_start_offset/2,CASE WHEN qs.statement_end_offset=-1 THEN LEN(CONVERT(NVARCHAR(max),qt.text))*2 ELSE qs.statement_end_offset END -qs.statement_start_offset/2)AS statement
from sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
INNER JOIN sys.dm_exec_cached_plans AS cp ON qs.plan_handle=cp.plan_handle
WHERE cp.plan_handle=qs.plan_handle
AND cp.usecounts>4
ORDER BY dbid,usecounts DESC
SqlServerDBCC SHRINKFILE不起作用的更多相关文章
- SQL Server dbcc shrinkfile 不起作用
方法 1.重建聚集索引. 方法 2.重建堆表. ---------------------------------------------------------------------------- ...
- 笔记9-徐 DBCC SHRINKFILE不起作用的原因
1 , , , , , , , , ,40) ,1 page_id pg_alloc ext_size obj_id index_id partition_number partition_id ia ...
- SQL 笔记 By 华仔
-------------------------------------读书笔记------------------------------- 笔记1-徐 最常用的几种备份方法 笔记2-徐 收缩数据 ...
- 分享一下我研究SQLSERVER以来收集的笔记
分享一下我研究SQLSERVER以来收集的笔记 前言 为什麽分享??因为像现在网上很多人攻城师那样,转行去卖水果,卖早餐,总有一日我也会离开这个行业的 由于本人不是在大公司上班工资很低,我希望有一天存 ...
- 收缩事务日志(sqlserver)
sqlserver数据库的日志文件其实是由很多个逻辑上的日志文件组成,我们可以通过命令看一下数据库日志文件 可以看到的是sqlserver数据库日志文件是由很多文件组成的,当数据库日志文件已满的时候 ...
- 如何避免SHRINKDATABASE & SHRINKFILE 产生索引碎片(转载)
1. TRUNCATEONLY参数的使用我们在建立的Job中通常使用如下的语法DBCC SHRINKDATABASE (N'DB', 10,TruncateOnly)其中TruncateOnly的用处 ...
- 经典MSSQL语句大全和常用SQL语句命令的作用
下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL类型包括数据库.表的创建,修改,删除,声明—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML类 ...
- if __name__== "__main__" 的意思(作用)python代码复用
if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog http://www.dabu.info/if-__-name__ ...
- (转载)linux下各个文件夹的作用
linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...
随机推荐
- 查看iOS应用crash日志
基本操作: 1.电脑安装好Xcode,连接好手机设备 2.打开Xcode,点击Window-Devices and Simulators 3.选中手机设备,点击View Device Logs,即可查 ...
- TCP协议 连接三次握手
TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...
- Emacs_快捷键列表
Emacs_快捷键列表 emacs -nw 以终端模式运行emacsLC_CTYPE=zh_CN.UTF-8 emacs C = Control M = Meta = Alt | EscAlt 可以粘 ...
- 【刷题】BZOJ 2134 单选错位
Description Input n很大,为了避免读入耗时太多, 输入文件只有5个整数参数n, A, B, C, a1, 由上交的程序产生数列a. 下面给出pascal/C/C++的读入语句和产生序 ...
- 【刷题】LOJ 6223 「网络流 24 题」汽车加油行驶问题
题目描述 给定一个 \(\text{N}\times \text{N}\) 的方形网格,设其左上角为起点◎,坐标为 \(\text{(1,1)}\) ,\(\text{X}\) 轴向右为正, \(\t ...
- 【BZOJ1444】[JSOI2009]有趣的游戏(高斯消元,AC自动机)
[BZOJ1444][JSOI2009]有趣的游戏(高斯消元,AC自动机) 题面 BZOJ 题解 先把\(AC\)自动机构建出来,最好构成\(Trie\)图.然后这样子显然是在一个有向图中有一堆概率的 ...
- 解题:HDU 5868 Different Circle Permutation
题面 先往上套Burnside引理 既然要求没有$\frac{2*π}{n}$的角,也就是说两个人不能挨着,那么相当于给一个环黑白染色,两个相邻的点不能染白色,同时求方案数.考虑$n$个置换子群,即向 ...
- 本地如何连接虚拟机上的MySql
今天在本地链接虚拟机上的MySql,然而链接失败了!甚是尴尬! 首先想一想是什么原因导致链接失败: 基础环境:在Linux上安装mysql 1.检查虚拟机IP在本地是否可以ping 通过 虚拟机IP: ...
- Centos 搭建 http服务器
1,安装 yum install httpd 2,查看是否安装成功 netstat [root@localhost ~]# netstat -anp | grep 80 tcp 0 0 :: ...
- SQL Server 行列相互转换命令:PIVOT和UNPIVOT使用详解
一.使用PIVOT和UNPIVOT命令的SQL Server版本要求 1.数据库的最低版本要求为SQL Server 2005 或更高. 2.必须将数据库的兼容级别设置为90 或更高. 3.查看我的数 ...