sql server 常用脚本(日常查询所需)
2015-12-17 17:31
288 查看
1:查看sqlserver代理中作业的运行状况的脚本
2、查看alwayson同步状态(队列情况)
3、查询当前数据库的脚本(语句)的运行情况(dbccfreeproccache之后执行次数会再次刷新):
4、查询当前数据库正在执行的语句:
SELECT[Spid]=session_Id
,ecid
,[Database]=DB_NAME(sp.dbid)
,[User]=nt_username
,[Status]=er.STATUS
,[Wait]=wait_type
,[IndividualQuery]=SUBSTRING(qt.TEXT,er.statement_start_offset/2,(
CASE
WHENer.statement_end_offset=-1
THENLEN(CONVERT(NVARCHAR(MAX),qt.TEXT))*2
ELSEer.statement_end_offset
END-er.statement_start_offset
)/2)
,[ParentQuery]=qt.TEXT
,Program=program_name
,Hostname
,loginame
,kpid
,nt_domain
,start_time
FROMsys.dm_exec_requestser
INNERJOINsys.sysprocessesspONer.session_id=sp.spid
CROSSAPPLYsys.dm_exec_sql_text(er.sql_handle)ASqt
WHEREsession_Id>50/*Ignoresystemspids.*/
5、查询阻塞情况:
6:查询数据库日志文件的大小:
例:
7、迁移登录用户
8、检查文件空间的方法:
使用execsp_spaceused查看的时候,结果比较笼统,不过也是可行的;
建议同时运行下面两条命令:
其中
“dbccshowfilestats”命令会以Extent为单位,统计当前数据库下所有数据文件里有多少个Extent,其中有多少个被使用过了,一个Extent是64K,乘一下即可得到数据文件大小,该命令直接从系统分配页面上面读取区分配信息,能够快速准确地计算出一个数据库数据文件区的总数和已使用过的区的数目,而系统分配页上的信息永远是实时更新的,所以这种统计方法比较准确可靠。在服务器负载很高的情况下也能安全执行,不会增加额外系统负担;
“dbccsqlperf(logspace)”命令的输出非常浅显易懂。它返回SQL里所有数据库的日志文件当前使用量,该命令的输出也非常快速准确,使用安全。
运行以下查询,可以得到具体库中表的具体空间使用信息:
输出结果
第一列name是每个表的名字。
SQLServer在使用数据页的时候,为了提高速度,会先把一些页面一次预留”reserve”给表格,然后真正有数据插入的时候,再使用。所以这里有两列,Reserved_page_count和Used_page_count。两列的结果相差一般不会很多。所以粗略来讲,Reserved_page_count*8K,就是这张表格占用的空间大小。
DataPages是这张表数据本身占有的空间。因此,(Used_page_count–DataPages)就是索引所占有的空间。索引的个数越多,需要的空间也会越多。
RowCounts,是现在这个表里有多少行数据。
以上源于摘录大神们的博客,在此便于查看学习。
--descr:asimplesqlscripttoviewsqlserverjobsrunstatus --last_run_status1:success0:fail selectcategory=jc.name, category_id=jc.category_id, job_name=j.name, job_enabled=j.enabled, last_run_time=cast(js.last_run_dateasvarchar(10))+'-'+cast(js.last_run_timeasvarchar(10)), last_run_duration=js.last_run_duration, last_run_status=js.last_run_outcome, last_run_msg=js.last_outcome_message+cast(nullif(js.last_run_outcome,1)asvarchar(2)), job_created=j.date_created, job_modified=j.date_modified frommsdb.dbo.sysjobsj innerjoinmsdb.dbo.sysjobserversjs onj.job_id=js.job_id innerjoinmsdb.dbo.syscategoriesjc onj.category_id=jc.category_id wherej.enabled=1 andjs.last_run_outcomein(0,1,3,5)--0:Fail1:Succ3:Cancel5:Firstrun andjc.category_idnotbetween10and20--repl --andjs.last_run_outcome=0只用于查看失败的作业 andjs.last_run_outcome=0
2、查看alwayson同步状态(队列情况)
SELECTar.replica_server_nameAS[副本名称], ar.availability_mode_descas[同步模式], DB_NAME(dbr.database_id)AS[数据库名称], dbr.database_state_descAS[数据库状态], dbr.synchronization_state_descAS[同步状态], dbr.synchronization_health_descAS[同步健康状态], ISNULL(CASEdbr.redo_rate WHEN0THEN-1 ELSECAST(dbr.redo_queue_sizeASFLOAT)/dbr.redo_rate END,-1)AS[Redo延迟(秒)], ISNULL(CASEdbr.log_send_rate WHEN0THEN-1 ELSECAST(dbr.log_send_queue_sizeASFLOAT) /dbr.log_send_rate END,-1)AS[Log传送延迟(秒)], dbr.redo_queue_sizeAS[Redo等待队列(KB)], dbr.redo_rateAS[Redo速率(KB/S)], dbr.log_send_queue_sizeAS[Log传送等待队列(KB)], dbr.log_send_rateAS[Log传送速率(KB\S)] FROM[master].sys.availability_replicasASAR INNERJOIN[master].sys.dm_hadr_database_replica_statesASdbr ONar.replica_id=dbr.replica_id WHEREdbr.redo_queue_sizeISNOTNULL
3、查询当前数据库的脚本(语句)的运行情况(dbccfreeproccache之后执行次数会再次刷新):
SELECTcreation_timeN'语句编译时间' ,last_execution_timeN'上次执行时间' ,execution_countN'执行次数' ,casedatediff(ss,creation_time,last_execution_time)when0then0 elseexecution_count/datediff(ss,creation_time,last_execution_time)endN'每秒执行次数' ,total_physical_readsN'物理读取总次数' ,total_logical_reads/execution_countN'每次逻辑读次数' ,total_logical_readsN'逻辑读取总次数' ,total_logical_writesN'逻辑写入总次数' ,total_worker_time/1000N'所用的CPU总时间ms' ,total_elapsed_time/1000N'总花费时间ms' ,(total_elapsed_time/execution_count)/1000N'平均时间ms' ,SUBSTRING(st.text,(qs.statement_start_offset/2)+1, ((CASEstatement_end_offset WHEN-1THENDATALENGTH(st.text) ELSEqs.statement_end_offsetEND -qs.statement_start_offset)/2)+1)N'执行语句' ,db_name(st.dbid)asdbname,st.objectid FROMsys.dm_exec_query_statsASqs CROSSAPPLYsys.dm_exec_sql_text(qs.sql_handle)st whereSUBSTRING(st.text,(qs.statement_start_offset/2)+1, ((CASEstatement_end_offset WHEN-1THENDATALENGTH(st.text) ELSEqs.statement_end_offsetEND -qs.statement_start_offset)/2)+1)notlike'%fetch%' ORDERBYexecution_countDESC;
4、查询当前数据库正在执行的语句:
SELECT[Spid]=session_Id
,ecid
,[Database]=DB_NAME(sp.dbid)
,[User]=nt_username
,[Status]=er.STATUS
,[Wait]=wait_type
,[IndividualQuery]=SUBSTRING(qt.TEXT,er.statement_start_offset/2,(
CASE
WHENer.statement_end_offset=-1
THENLEN(CONVERT(NVARCHAR(MAX),qt.TEXT))*2
ELSEer.statement_end_offset
END-er.statement_start_offset
)/2)
,[ParentQuery]=qt.TEXT
,Program=program_name
,Hostname
,loginame
,kpid
,nt_domain
,start_time
FROMsys.dm_exec_requestser
INNERJOINsys.sysprocessesspONer.session_id=sp.spid
CROSSAPPLYsys.dm_exec_sql_text(er.sql_handle)ASqt
WHEREsession_Id>50/*Ignoresystemspids.*/
5、查询阻塞情况:
SELECTwt.blocking_session_idASBlockingSessesionId
,sp.program_nameASProgramName
,COALESCE(sp.LOGINAME,sp.nt_username)ASHostName
,ec1.client_net_addressASClientIpAddress
,db.nameASDatabaseName
,wt.wait_typeASWaitType
,ec1.connect_timeASBlockingStartTime
,wt.WAIT_DURATION_MS/1000ASWaitDuration
,ec1.session_idASBlockedSessionId
,h1.TEXTASBlockedSQLText
,h2.TEXTASBlockingSQLText
FROMsys.dm_tran_locksAStl
INNERJOINsys.databasesdbONdb.database_id=tl.resource_database_id
INNERJOINsys.dm_os_waiting_tasksASwtONtl.lock_owner_address=wt.resource_address
INNERJOINsys.dm_exec_connectionsec1ONec1.session_id=tl.request_session_id
INNERJOINsys.dm_exec_connectionsec2ONec2.session_id=wt.blocking_session_id
LEFTOUTERJOINmaster.dbo.sysprocessesspONSP.spid=wt.blocking_session_id
CROSSAPPLYsys.dm_exec_sql_text(ec1.most_recent_sql_handle)ASh1
CROSSAPPLYsys.dm_exec_sql_text(ec2.most_recent_sql_handle)ASh2
6:查询数据库日志文件的大小:
dbccsqlperf(logspace)
列名 | 定义 |
---|---|
DatabaseName | 数据库名称,为该数据库显示日志统计信息。 |
LogSize(MB) | 分配给日志的当前大小。该大小始终小于最初为日志空间分配的大小,因为SQLServer2005数据库引擎保留了一小部分磁盘空间用于存放内部标头信息。 |
LogSpaceUsed(%) | 事务日志信息当前所占用的日志文件的百分比。 |
Status | 日志文件的状态。始终为0。 |
DatabaseNameLogSize(MB)LogSpaceUsed(%)Status
-------------------------------------------------------------------------
master2.242187532.6001740
tempdb0.492187539.2857130
model0.492187541.071430
msdb2.242187530.9015670
pubs0.742187549.9342120
Northwind0.992187534.9409450
--如果要保存SQL日志文件大小,则需要先创建一个数据表,然后动态执行dbccsqlperf(logspace)命令
createtabledbo.LogSize
(
dbnamenvarchar(50)notnull
,logsizedecimal(8,2)notnull
,loguseddecimal(5,2)notnull
,statusintnull
)
insertintodbo.LogSize
execute('dbccsqlperf(logspace)withno_infomsgs')
7、迁移登录用户
select'createlogin['+p.name+']'+
casewhenp.typein('U','G')then'fromwindows'else''end+
'with'+
casewhenp.type='S'then'password='+master.sys.fn_varbintohexstr(l.password_hash)+
'hashed,'+'sid='+master.sys.fn_varbintohexstr(l.sid)+',check_expiration='+
casewhenl.is_expiration_checked>0then'ON,'else'OFF,'end+'check_policy='+
casewhenl.is_policy_checked>0then'ON,'else'OFF,'end+
casewhenl.credential_id>0then'credential='+c.name+','else''end
else''end+
'default_database='+p.default_database_name+
casewhenlen(p.default_language_name)>0
then',default_language="'+p.default_language_name+'"'else''''end
fromsys.server_principalsp
leftjoinsys.sql_loginslonp.principal_id=l.principal_id
leftjoinsys.credentialsconl.credential_id=c.credential_id
wherep.typein('S','U','G')andp.name<>'sa'
8、检查文件空间的方法:
使用execsp_spaceused查看的时候,结果比较笼统,不过也是可行的;
建议同时运行下面两条命令:
use<数据库>
go
dbccshowfilestats
go
dbccsqlperf(logspace)
go
其中
“dbccshowfilestats”命令会以Extent为单位,统计当前数据库下所有数据文件里有多少个Extent,其中有多少个被使用过了,一个Extent是64K,乘一下即可得到数据文件大小,该命令直接从系统分配页面上面读取区分配信息,能够快速准确地计算出一个数据库数据文件区的总数和已使用过的区的数目,而系统分配页上的信息永远是实时更新的,所以这种统计方法比较准确可靠。在服务器负载很高的情况下也能安全执行,不会增加额外系统负担;
“dbccsqlperf(logspace)”命令的输出非常浅显易懂。它返回SQL里所有数据库的日志文件当前使用量,该命令的输出也非常快速准确,使用安全。
运行以下查询,可以得到具体库中表的具体空间使用信息:
usexxxxDB--需要查询的库名
SELECTo.nameasname,
SUM(p.reserved_page_count)asreserved_page_count,
SUM(p.used_page_count)asused_page_count,
SUM(CASEWHEN(p.index_id<2)THEN(p.in_row_data_page_count+p.lob_used_page_count+p.row_overflow_used_page_count)ELSEp.lob_used_page_count+p.row_overflow_used_page_countEND)asDataPages,
SUM(CASEWHEN(p.index_id<2)THENrow_countELSE0END)asrowCounts
FROMsys.dm_db_partition_statsaspjoinsys.objectsaso
onp.object_id=o.object_id
groupbyo.name
orderbyreserved_page_countdesc
输出结果
第一列name是每个表的名字。
SQLServer在使用数据页的时候,为了提高速度,会先把一些页面一次预留”reserve”给表格,然后真正有数据插入的时候,再使用。所以这里有两列,Reserved_page_count和Used_page_count。两列的结果相差一般不会很多。所以粗略来讲,Reserved_page_count*8K,就是这张表格占用的空间大小。
DataPages是这张表数据本身占有的空间。因此,(Used_page_count–DataPages)就是索引所占有的空间。索引的个数越多,需要的空间也会越多。
RowCounts,是现在这个表里有多少行数据。
以上源于摘录大神们的博客,在此便于查看学习。
相关文章推荐
- redis 学习手册之事务 transaction 操作
- Hiredis-redis cplusplus--redis3M
- redis 学习手册之发布和订阅pubsub操作
- 网页上传文件,到服务器,再讲数据导入数据库
- 删除sqlserver管理器登录信息缓存
- redis 学习手册之键key操作
- Redis持久化
- CentOS 6.5安装Redis-2.8.23
- Oracle的数据表中行转列与列转行的操作实例讲解
- BerkeleyDB数据库,增删改,封装类(带字段压缩功能)
- 数据库设计——范式
- Linq to Sql 或linq to entities 与SQL查询结果不一致 返回重复结果问题
- redis-backgroud saving error
- nodejs+mongodb系列教程之(1/5)--开篇总述
- 解决Oracle创建视图(VIEW)权限不足的方法
- 老李分享:loadrunne动态查询db2数据库
- 老李分享:loadrunner操作mysql数据库
- mysql 基于LVM快照的备份
- 老李分享:MySql的insert语句的性能优化方案
- sqlsever,mysql,orcale,判断null值方法