SQL Server DBA日常检查常用SQL

1、数据库

代码如下:

--所有数据库的大小 
exec sp_helpdb

--所有数据库的状态 
select name, 
       user_access_desc,           --用户访问模式 
       state_desc,                 --数据库状态 
       recovery_model_desc,        --恢复模式 
       page_verify_option_desc,    --页检测选项 
       log_reuse_wait_desc         --日志重用等待 
from sys.databases

--某个数据库的大小:按页面计算空间,有性能影响,基本准确,有时不准确 
use test 
go

exec sp_spaceused   
go

--可以@updateusage = 'true',会运行dbcc updateusage 
exec sp_spaceused  @updateusage = 'true'

--对某个数据库,显示目录视图中的页数和行数错误并更正 
DBCC UPDATEUSAGE('test')

2、数据文件


代码如下:

--查看某个数据库中的所有文件及大小 
sp_helpfile

--查看所有文件所在数据库、路径、状态、大小 
select db_name(database_id) dbname, 
       type_desc,      --数据还是日志 
       name,           --文件的逻辑名称 
       physical_name,  --文件的物理路径 
       state_desc,     --文件状态 
       size * 8.0/1024 as '文件大小(MB)'         
from sys.master_files

--按区extent计算空间,没有性能影响,基本准确,把TotalExtents*64/1024,单位为MB 
--同时也适用于计算tempdb的文件大小,但不包括日志文件 
dbcc showfilestats

3、日志文件


代码如下:

--查看日志文件所在数据库、路径、状态、大小 
select db_name(database_id) dbname, 
       type_desc,      --数据还是日志 
       name,           --文件的逻辑名称 
       physical_name,  --文件的物理路径 
       state_desc,     --文件状态 
       size * 8.0/1024 as '文件大小(MB)'         
from sys.master_files 
where type_desc = 'LOG'

--所有数据库的日志的大小,空间使用率 
dbcc sqlperf(logspace)

4、数据文件、日志文件的I/O统计信息


代码如下:

--数据和日志文件的I/O统计信息,包含文件大小 
    select database_id, 
           file_id, 
           file_handle,           --windows文件句柄 
           sample_ms,             --自从计算机启动以来的毫秒数

num_of_reads, 
           num_of_bytes_read, 
           io_stall_read_ms,      --等待读取的时间

num_of_writes, 
           num_of_bytes_written, 
           io_stall_write_ms,

io_stall,              --用户等待文件完成I/O操作所用的总时间 
           size_on_disk_bytes     --文件在磁盘上所占用的实际字节数

from sys.dm_io_virtual_file_stats(db_id('test'),   --数据库id 
                                       1 )  --数据文件id                                        
    union all

select database_id, 
           file_id, 
           file_handle,           --windows文件句柄 
           sample_ms,             --自从计算机启动以来的毫秒数

num_of_reads, 
           num_of_bytes_read, 
           io_stall_read_ms,      --等待读取的时间

num_of_writes, 
           num_of_bytes_written, 
           io_stall_write_ms,

io_stall,              --用户等待文件完成I/O操作所用的总时间 
           size_on_disk_bytes     --文件在磁盘上所占用的实际字节数  
    from sys.dm_io_virtual_file_stats( db_id('test'),   --数据库id 
                                       2 )  --日志文件id

5、对象,包括:表、索引、索引视图等


代码如下:

--不一定准确:某个表的行数,保留大小,数据大小,索引大小,未使用大小 
exec sp_spaceused @objname ='temp_lock'

--准确:但有性能影响 
exec sp_spaceused @objname ='temp_lock', 
                  @updateusage ='true'

--按页统计,没有性能影响,有时不准确 
/*====================================================== 
一次计算多个对象的空间使用情况

sys.dm_db_partition_stats返回当前数据库中每个分区(表和索引)的页和行计数信息 
========================================================*/    
select o.name, 
       sum(p.reserved_page_count) as reserved_page_count, --保留页,包含表和索引

sum(p.used_page_count) as used_page_count,         --已使用页,包含表和索引

sum(case when p.index_id <2  
                     then p.in_row_data_page_count +  
                          p.lob_used_page_count +  
                          p.row_overflow_used_page_count 
                else p.lob_used_page_count +  
                     p.row_overflow_used_page_count 
           end) as data_pages,  --数据页,包含表中数据、索引中的lob数据、索引中的行溢出数据

sum(case when p.index_id < 2  
                     then p.row_count 
                else 0 
           end) as row_counts   --数据行数,包含表中的数据行数,不包含索引中的数据条目数

from sys.dm_db_partition_stats p 
inner join sys.objects o 
        on p.object_id = o.object_id  
where p.object_id= object_id('表名') 
group by o.name

--按页或区统计,有性能影响,准确          
--显示当前数据库中所有的表或视图的数据和索引的空间信息 
--包含:逻辑碎片、区碎片(碎片率)、平均页密度                
dbcc showcontig(temp_lock)

--SQL Server推荐使用的动态性能函数,准确 
select * 
from sys.dm_db_index_physical_stats( 
        db_id('test'),                      --数据库id 
        object_id('test.dbo.temp_lock'),    --对象id 
        null,                               --索引id 
        null,                               --分区号

'limited'   --default,null,'limited','sampled','detailed',默认为'limited' 
                    --'limited'模式运行最快,扫描的页数最少,对于堆会扫描所有页,对于索引只扫描叶级以上的父级页 
                    --'sampled'模式会返回堆、索引中所有页的1%样本的统计信息,如果少于1000页,那么用'detailed'代替'sampled' 
                    --'detailed'模式会扫描所有页,返回所有统计信息 
    )

--查找哪些对象是需要重建的 
use test 
go

if OBJECT_ID('extentinfo') is not null 
    drop table extentinfo 
go

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)  
)  
go

/*==================================================================== 
查询到的盘区信息是数据库的数据文件的盘区信息,日志文件不以盘区为单位

命令格式:  DBCC EXTENTINFO(dbname,tablename,indexid)

DBCC EXTENTINFO('[test]','extentinfo',0) 
======================================================================*/ 
insert extentinfo  
exec('dbcc extentinfo(''test'') ') 
go

--每一个区有一条数据 
select  file_id,  
        obj_id,               --对象ID 
        index_id,             --索引id

page_id,              --这个区是从哪个页开始的,也就是这个区中的第一个页面的页面号 
        pg_alloc,             --这个盘区分配的页面数量

ext_size,             --这个盘区包含了多少页

partition_number, 
        partition_id, 
        iam_chain_type,       --IAM链类型:行内数据,行溢出数据,大对象数据 
        pfs_bytes  
from extentinfo 
order by file_id, 
         OBJ_ID, 
         index_id, 
         partition_id, 
         ext_size

/*===================================================================================================== 
数据库的数据文件的盘区信息,通过计算每个对象理论上区的数量和实际数量,如果两者相差很大, 
那就应该重建对象.

1.每一条记录就是一个区

2.如果pg_alloc比ext_size小,也就是实际每个区分配的页数小于理论上这个区的页数, 
  那么就会多一条记录,把本应该属于这个区的页放到多出来的这条记录对应的区中, 
  那么原来只有一条记录(也就是一个区),现在就有2条记录(也就是2个区), 
  导致实际的区数量2大于理论上的区数量1. 
========================================================================================================*/ 
select file_id, 
       obj_id,  
       index_id,  
       partition_id,  
       ext_size,

count(*) as '实际区的个数',  
       sum(pg_alloc) as '实际包含的页数',

ceiling(sum(pg_alloc) * 1.0 / ext_size) as '理论上的区的个数',  
       ceiling(sum(pg_alloc) * 1.0 / ext_size) / count(*) * 100.00 as '理论上的区个数 / 实际区的个数'

from extentinfo  
group by file_id, 
         obj_id,  
         index_id, 
         partition_id,  
         ext_size  
having ceiling(sum(pg_alloc)*1.0/ext_size) < count(*)    
--过滤: 理论上区的个数 < 实际区的个数,也就是百分比小于100%的 
order by partition_id, obj_id, index_id, [file_id]

6、tempdb数据库


代码如下:

--tempdb数据库的空间使用 
/*====================================================== 
tempdb中包含的对象:

用户对象:是用户显式创建的,这些对象位于用户会话的作用域, 
         可以位于创建对象的例程(存储过程、触发器、函数)的作用域中。 
    1.用户定义的表、索引 
    2.系统表、索引 
    3.全局临时表、索引 
    4.局部临时表、索引 
    5.表变量 
    6.表值函数中返回的表

内部对象:是根据需要由SQL Server数据库引擎创建的,用于处理SQL Server语句, 
          内部对象可以在语句作用域中创建、删除。 
          每个内部对象至少需要9个页面,一个IAM页,一个区包含了8个页。 
    1.游标、假脱机操作、临时的大型对象(LOB),存储的工作表 
    2.哈希联接、哈希聚合操作的工作文件 
    3.如果设置了sort_in_tempdb选项,那么创建、重新生成索引的重建排序结果存放在tempdb; 
      group by、order by、union操作的中间结果。

版本存储区:是数据页的集合,包含了支持行版本控制功能的所需的数据,主要支持快照事务隔离级别, 
            以及一些其他的提高数据库并发性能的新功能。 
    1.公用版本存储区:在使用快照隔离级别、已提交读隔离级别的数据库中,由数据修改事务生成的行版本。 
    2.联机索引生成版本存储区:为了实现联机索引操作而为数据修改事务生成的行版本, 
      多个活动结果集,after触发器生成的行版本。

上面也提到了,由于sys.allocation_units和sys.partitions视图没有记录tempdb中的内部对象、版本存储区 
所以这2个视图和sp_spaceused,不能准确反应出tempdb的空间使用。

分析tempdb现有的工作负载: 
    1.设置tempdb的自动增长 
    2.通过模拟单独的查询、工作任务,监控tempdb空间使用 
    3.通过模拟执行一些系统维护操作(重新生成索引),监控tempdb空间使用 
    4.根据2和3中tempdb的空间使用量,预测总工作负荷会使用的空间,并针对任务的并发度调整这个值. 
    5.根据4得到的值,设置生成环境中tempdb的初始大小,并开启自动增长. 
      另外,tempdb的文件个数和大小,不仅需要满足实际使用需要,还要考虑性能优化.

监控tempdb的空间使用方法: 
    1.可以通过SQL Trace来跟踪,但是由于不能预期造成大量使用tempdb语句在什么时候运行, 
      而且SQL Trance操作比较昂贵,如果一直开着会产生大量的跟踪文件,对硬盘的负担也比较重,一般不用.

2.轻量级的监控是通过一定时间间隔运行能够监控系统运行的dbcc命令、动态性能视图-函数, 
      把结果记录在文件中,这对于很繁忙的系统是不错的选择。

========================================================*/

Select DB_NAME(database_id) as DB,  
       max(FILE_ID) as '文件id',

SUM (user_object_reserved_page_count) as '用户对象保留的页数',       ----包含已分配区中的未使用页数 
       SUM (internal_object_reserved_page_count) as '内部对象保留的页数',   --包含已分配区中的未使用页数 
       SUM (version_store_reserved_page_count)  as '版本存储保留的页数',      
       SUM (unallocated_extent_page_count) as '未分配的区中包含的页数',     --不包含已分配区中的未使用页数

SUM(mixed_extent_page_count) as '文件的已分配混合区中:已分配页和未分配页'  --包含IAM页                          
From sys.dm_db_file_space_usage                                           
Where database_id = 2   
group by DB_NAME(database_id)

--能够反映当时tempdb空间的总体分配,申请空间的会话正在运行的语句 
SELECT  
       t1.session_id,

t1.internal_objects_alloc_page_count,       
       t1.user_objects_alloc_page_count,

t1.internal_objects_dealloc_page_count ,  
       t1.user_objects_dealloc_page_count, 
       t.text 
from sys.dm_db_session_space_usage  t1   --反映每个session的累计空间申请                                 
inner join sys.dm_exec_sessions as t2  
        on t1.session_id = t2.session_id            
inner join sys.dm_exec_requests t3 
        on t2.session_id = t3.session_id                 
cross apply sys.dm_exec_sql_text(t3.sql_handle) t 
where  t1.internal_objects_alloc_page_count>0   or 
       t1.user_objects_alloc_page_count >0      or 
       t1.internal_objects_dealloc_page_count>0 or 
       t1.user_objects_dealloc_page_count>0

--返回tempdb中页分配和释放活动, 
--只有当任务正在运行时,sys.dm_db_task_space_usage才会返回值 
--在请求完成时,这些值将按session聚合体现在SYS.dm_db_session_space_usage 
select t.session_id, 
       t.request_id, 
       t.database_id,

t.user_objects_alloc_page_count, 
       t.internal_objects_dealloc_page_count,

t.internal_objects_alloc_page_count, 
       t.internal_objects_dealloc_page_count 
from sys.dm_db_task_space_usage t    
inner join sys.dm_exec_sessions e 
        on t.session_id = e.session_id         
inner join sys.dm_exec_requests  r     
        on t.session_id = r.session_id and 
           t.request_id = r.request_id

(0)

相关推荐

  • SQLServer 常用语句(按功能分)

    一. 简单查询 简单的Transact-SQL查询只包括选择列表.FROM子句和WHERE子句.它们分别说明所查询列.查询的 表或视图.以及搜索条件等.例如,下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段. SELECT nickname,email FROM testtable WHERE name='张三' (一) 选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表.星号.表达式.变量(包括局部变量和全局变量)等

  • 诊断SQLSERVER问题常用的日志概述及使用

    诊断SQLSERVER问题常用的日志 这里主要有两个: (1)Windows事件日志 (2)SQLSERVER ErrorLog 1.Windows事件日志 Event Log 作为一个Windows开启和管理的服务程序,Windows会在自己的系统日志system log里记录SQLSERVER这个服务的启动.正常关闭.异常关闭等信息. SQLSERVER也会把自己的一些概要信息同时记录在Windows的应用程序日志里Application Log而Windows日志本身又能够反映操作系统的健

  • sqlserver常用命令行操作(启动、停止、暂停)

    启动sql server Net Start MSSqlServer 暂停sql server Net Pause MSSqlServer 重新启动暂停的sql server Net Continue MSSqlServer 停止sql server Net stop MSSqlServer 命令行方式修改sql server sa 的密码 一直都是使用企业管理器操作sql的,昨天帮一朋友部署网站,租的国外vps主机,登陆上去只看到sql的图标正常运行的,企业管理器和查询分析器的影都没看到,汗一

  • sqlserver 模糊查询常用方法

    搜索条件中的模式匹配 LIKE 关键字搜索与指定模式匹配的字符串.日期或时间值.LIKE 关键字使用常规表达式包含值所要匹配的模式.模式包含要搜索的字符串,字符串中可包含四种通配符的任意组合. 通配符 含义 % 包含零个或更多字符的任意字符串. _ 任何单个字符. [ ] 指定范围(例如 [a-f])或集合(例如 [abcdef])内的任何单个字符. [^] 不在指定范围(例如 [^a - f])或集合(例如 [^abcdef])内的任何单个字符. 请将通配符和字符串用单引号引起来,例如: LI

  • SQLServer 管理常用SQL语句

    1. 查看数据库的版本 select @@version 2. 查看数据库所在机器操作系统参数 exec master..xp_msver 3. 查看数据库启动的参数 sp_configure 4. 查看数据库启动时间 select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1 查看数据库服务器名和实例名 print 'Server Name...............:' + conver

  • sqlserver 常用存储过程集锦

    =================分页========================== 复制代码 代码如下: /*分页查找数据*/ CREATE PROCEDURE [dbo].[GetRecordSet] @strSql varchar(8000),--查询sql,如select * from [user] @PageIndex int,--查询当页号 @PageSize int--每页显示记录 AS set nocount on declare @p1 int declare @curr

  • Sqlserver 常用日期时间函数

    MS SQL Server中文版的预设日期datetime格式是yyyy-mm-dd hh:mm:ss.mmm 长短日期格式 复制代码 代码如下: --短日期格式:yyyy-m-d SELECT REPLACE(CONVERT(varchar(10),getdate(),120),N'-0','-') --长日期格式:yyyy年mm月dd日 SELECT STUFF(STUFF(CONVERT(char(8),getdate(),112),5,0,N'年'),8,0,N'月')+N'日' --短

  • SQL Server DBA日常检查常用SQL

    1.数据库 复制代码 代码如下: --所有数据库的大小  exec sp_helpdb --所有数据库的状态  select name,         user_access_desc,           --用户访问模式         state_desc,                 --数据库状态         recovery_model_desc,        --恢复模式         page_verify_option_desc,    --页检测选项      

  • SQL Server DBA维护常用语句

    1.检查数据库完整性 复制代码 代码如下: dbcc checkdb(test)--通过加tablock提高速度 dbcc checkdb(test) with tablock 2.数据库重命名.修改恢复模式.修改用户模式 复制代码 代码如下: --数据库重命名  ALTER DATABASE WC  MODIFY NAME = test --设置数据库为完整恢复模式alter database testset recovery full --只允许一个用户访问数据库  alter databa

  • 史上最全PostgreSQL DBA最常用SQL

    目录 背景 常用查询 背景 建立视图, 方便查询 create schema dba; create view dba.invalid_index as select indisvalid, indexrelid::regclass, indrelid::regclass, pg_get_indexdef(indexrelid) from pg_index where not indisvalid; create view dba.ro_conflicts as select datname,p

  • SQL Server代理:理解SQL代理错误日志处理方法

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这个系列的前几篇文章所见,SQL Server代理是由一系列的作业步骤组成,每个步骤是不同类型将要进行的工作.如果你在第4篇所见,SQL Server代理也提供使用数据库邮件发送提醒的能力.如果出现问题,不管怎样, 你必须去查看下数据库邮件错误日志.在这篇文章里,你会学到如何理解和查看SQL Server错误日志的所有相关知识.你会

  • SQL Server Native Client下载 SQL Server Native Client安装方法

    在安装 SQL Server 2008 或 SQL Server 工具时,将同时安装 Microsoft SQL Server Native Client 10.0.如果计算机上还安装了 SQL Server Native Client 的 SQL Server 2005 版本,则 SQL Server Native Client 10.0 将与早期版本并行安装. Microsoft SQL Server Native Client 10.0下载:http://www.jb51.net/data

  • SQL Server 2005 数据库转 SQL Server 2000的方法小结

    今天有朋友推荐个活就是把Sql Server 2005的数据库转到Sql Server 2000里,但实际操作起来遇到的问题还不少,网上搜了一些办法,在此陈列出来,并把我使用时遇到的问题及解决方案一并记录下来,以备后期查阅 前几步和网上说的一样,先生成2000的脚本,然后再到2000里面执行.操作如下: 打开 SQL Server 2005 的Manger Studio -- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例 找到你要转换的数据库(建议先将此数据库里的登录名清

  • SQL Server中执行动态SQL

    在Sql Server查询语句中使用变量表示表名.字段名等动态查询方式叫动态查询. 当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态来构造SQL查询语句,用得比较多的地方就是分页存储过程和执行搜索查询的SQL语句. 一个比较通用的分页存储过程,可能需要传入表名,字段,过滤条件,排序等参数,而对于搜索的话,可能要根据搜索条件判断来动态执行SQL语句. 在SQL Server中有两种方式来执行动态SQL语句,分别是sp_executesql和exec. sp_executesql相对

  • 掌握SQL Server实战教程之SQL Server的安装指南

    目录 前言 一. 数据库的介绍 1.1 数据库的分类 1.2 MS SQL介绍 二. MS SQL的安装 2.1 从网站下载安装包 2.2 开始安装 选择基本版本 2.3 安装SSMS 三. 连接数据库 3.1 数据库的连接 3.2 创建数据库 总结 前言 本文沐风晓月带你来了解一下sqlserver数据库的安装及简单使用,本文的主要任务: 安装SQL Server并能够成功的远程链接,然后执行几条简单的SQL语句进行测试即可 一. 数据库的介绍 1.1 数据库的分类 数据库的种类有很多,根据存

  • SQL Server 2005 定时执行SQL语句的方法

    SQL SERVER 2005有定时任务,你可以启动一下.不过要想更加直观的控制,直接写一个程序,定时执行你的存储过程. 1.设置"SQL Server 代理"(SQL Server Agent)服务随系统启动 --我的电脑--控制面板--管理工具--服务--右键SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定. 2.SQL Server Management Studio -- SQL Server 代理 -- 作业 -- 新建作业 作

  • SQL Server降权运行 SQL Server 2000以GUESTS权限运行设置方法

    SQL2000数据库由于自身漏洞问题,黑客很容易通过他取得系统管理员权限. SQL默认以SYSTEM权限运行,权限超级强大. 为了让服务器更安全,建议设置SQL2000以GUESTS权限运行,让黑客即使入侵了数据库,也没法取得系统管理员权限,防止进一步造成破坏. 具体设置方法如下: 1.建立一个帐户(这里假定为sqlservice),属于GUESTS组,注意取消其他权限,只允许GUESTS组,如下图: 2.进入SQL SERVER安全目录,设置"sqlservice"帐户拥有完全控制的

随机推荐