您的位置:首页 > 数据库

sql server 常用脚本(日常查询所需)

2015-12-17 17:31 288 查看
1:查看sqlserver代理中作业的运行状况的脚本

--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,是现在这个表里有多少行数据。

以上源于摘录大神们的博客,在此便于查看学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: