常用的sql

1. 查看连接数:

use master
SELECT program_name,* FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN(SELECT [DBID]FROM [Master].[dbo].[SYSDATABASES] WHERE NAME='test') order by spid


sysprocesses :  kpid 线程号(内核进程 id),  spid进程号, lastwaittype

lastwaittype = SOS_SCHEDULER_YIELD  任务执行的时候主动放弃CPU轮询处理(Windows为多任务OS),并继续等待。

如果多个进程有SOS_SCHEDULER_YIELD,说明有CPU压力


2. 查看有未提交事务的进程

select sysprocesses.open_tran, * from sysprocesses where open_tran>0


3. 查看是否有进程在等待CPU

SELECT scheduler_id, current_tasks_count, runnable_tasks_count   FROM sys.dm_os_schedulers    WHERE scheduler_id < 255 

如果 runnable_tasks_count>0 则可能存在CPU瓶颈


4. 占CPU时间最多的SQL

SELECT SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,((CASEqs.statement_end_offsetWHEN-1THENDATALENGTH(qt.TEXT)ELSEqs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
      qs.execution_count,qs.total_logical_reads,qs.last_logical_reads,
      qs.total_logical_writes,qs.last_logical_writes,qs.total_worker_time,
      qs.last_worker_timeqs.total_elapsed_time/1000000 total_elapsed_time_in_S,
      qs.last_elapsed_time/1000000 last_elapsed_time_in_S,qs.last_execution_time,
      qp.query_plan
FROM sys.dm_exec_query_stats qs
     CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)qt
     CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)qp
ORDER BY qs.total_worker_time DESC -- CPU time


当前缓存的哪些批处理或过程占用了大部分 CPU 资源

SELECT TOP 50 SUM(qs.total_worker_time) AS total_cpu_time, SUM(qs.execution_count) AS total_execution_count,
       COUNT(*) AS  number_of_statements, qs.sql_handle 
FROM sys.dm_exec_query_stats AS qs
GROUP BY qs.sql_handle
ORDER BY SUM(qs.total_worker_time) DESC

缓存计划所占用的 CPU 总使用率

SELECT total_cpu_time, total_execution_count, number_of_statements, s2.text
      --(SELECT SUBSTRING(s2.text, statement_start_offset / 2, ((CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(NVARCHAR(MAX), s2.text)) * 2) ELSE statement_end_offset END) - statement_start_offset) / 2) ) AS query_text
FROM (  SELECT TOP 50  SUM(qs.total_worker_time) AS total_cpu_time,  SUM(qs.execution_count) AS total_execution_count,
              COUNT(*) AS  number_of_statements, qs.sql_handle --,
              --MIN(statement_start_offset) AS statement_start_offset, 
              --MAX(statement_end_offset) AS statement_end_offset
        FROM sys.dm_exec_query_stats AS qs
        GROUP BY qs.sql_handle
        ORDER BY SUM(qs.total_worker_time) DESC
      ) AS stats
      CROSS APPLY sys.dm_exec_sql_text(stats.sql_handle) AS s2

显示 CPU 平均占用率最高的前 50 个 SQL 语句

SELECT TOP 50 total_worker_time/execution_count AS [Avg CPU Time],
             ( SELECT SUBSTRING(text,statement_start_offset/2,(CASE WHEN statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset end -statement_start_offset)/2) 
               FROM sys.dm_exec_sql_text(sql_handle)) AS query_text, *
FROM sys.dm_exec_query_stats 
ORDER BY [Avg CPU Time] DESC

如果系统存在过多的编译和重新编译,可能会导致系统出现与 CPU 相关的性能问题。
过多编译/重新编译的

select * from sys.dm_exec_query_optimizer_info where counter = 'optimizations' or counter = 'elapsed time'

已重新编译的前 25 个存储过程
select top 25  sql_text.text, sql_handle, plan_generation_num, execution_count, dbid, 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

哪个查询占用了最多的 CPU 累计使用率

SELECT highest_cpu_queries.plan_handle, highest_cpu_queries.total_worker_time, q.dbid, q.objectid, q.number, q.encrypted, q.[text]
from ( select top 50 qs.plan_handle, qs.total_worker_time 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

可能占用大量 CPU 使用率的运算符

select *
from sys.dm_exec_cached_plans cross apply sys.dm_exec_query_plan(plan_handle)
where cast(query_plan as nvarchar(max)) like '%Sort%'  or cast(query_plan as nvarchar(max)) like '%Hash Match%'

5.快速获取表的行数

select rows from sysindexes where id=object_id('weblog') and indid in(0,1)

6.清除缓存和执行计划缓存

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

7.清空日志

     DUMP TRANSACTION 库名 WITH NO_LOG

8.截断事务日志

    BACKUP LOG vttest TO DISK='X:\sql2008Data\vttest_log.bak' WITH INIT,NO_TRUNCATE 

9.收缩数据库

    DBCC   SHRINKDATABASE(数据库名)

10.收缩文件

      select   *   from   sysfiles   --找到文件ID
      DBCC   SHRINKFILE(2)   --吧ID作为参数传入

11.查询所有表的大小

create PROCEDURE get_tableinfo AS

if not exists(select * from dbo.sysobjects where id=object_id(N'[dbo].[tablespaceinfo]')and OBJECTPROPERTY(id,N'IsUserTable')=1)

create table tablespaceinfo(nameinfo varchar(50), rowsinfo int, reserved varchar(20),
                            datainfo varchar(20), index_size varchar(20), unused varchar(20))
delete from tablespaceinfo--清空数据表
declare @tablename varchar(255) --表名称
declare @cmdsql varchar(500)
DECLARE Info_cursor CURSOR FOR
select o.name from dbo.sysobjects o where OBJECTPROPERTY(o.id,N'IsTable')=1  and o.name not like N'#%%' order by o.name
OPEN Info_cursor

FETCH NEXT FROM Info_cursor INTO @tablename
WHILE @@FETCH_STATUS=0
BEGIN
  if exists(select * from dbo.sysobjects where id=object_id(@tablename) and OBJECTPROPERTY(id,N'IsUserTable')=1)
    execute sp_executesql N'insert into tablespaceinfo exec sp_spaceused @tbname', N'@tbname varchar(255)', @tbname=@tablename
  FETCH NEXT FROM Info_cursor
  INTO @tablename
END
CLOSE Info_cursor
DEALLOCATE Info_cursor
GO

--执行存储过程
exec get_tableinfo
--查询运行该存储过程后得到的结果
select * from tablespaceinfo order by cast(left(ltrim(rtrim(reserved)) , len(ltrim(rtrim(reserved)))-2) as int) desc


12.查看阻塞

use master
go
declare @spid int,@bl int
DECLARE s_cur CURSOR FOR
    select  0 ,blocked
    from (select * from sysprocesses where  blocked>0 ) a
    where not exists(select * from (select * from sysprocesses where  blocked>0 ) b
    where a.blocked=spid)
    union select spid,blocked from sysprocesses where  blocked>0
    OPEN s_cur
FETCH NEXT FROM s_cur INTO @spid,@bl
WHILE @@FETCH_STATUS = 0
begin
if @spid =0
            select ' 引起数据库死锁的是 : '+ CAST(@bl AS VARCHAR(10)) + ' 进程号 , 其执行的 SQL 语法如下 '
else
            select ' 进程号 SPID : '+ CAST(@spid AS VARCHAR(10))+ ' 被 ' + ' 进程号 SPID : '+ CAST(@bl AS VARCHAR(10)) +' 阻塞 , 其当前进程执行的 SQL 语法如下 '
DBCC INPUTBUFFER (@bl )
FETCH NEXT FROM s_cur INTO @spid,@bl
end
CLOSE s_cur
DEALLOCATE s_cur

exec sp_who2

sql最全的常用命令语句 询某个数据库的连接数 select count(*) from Master.dbo.SysProcesses where dbid=db_id() --前10名其他等待类型 SELECT TOP 10 * from sys.dm_os_wait_stats ORDER BY wait_time_ms DESC SELECT *FROM sys.dm_os_wait_stats WHERE wait_type like 'PAGELATCH%' OR wait_type like 'LAZYWRITER_SLEEP%' --CPU的压力 SELECT scheduler_id, current_tasks_count, runnable_tasks_count FROM sys.dm_os_schedulers WHERE scheduler_id 500 begin select text,CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) from master.sys.sysprocesses a end select text,a.* from master.sys.sysprocesses a CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) where a.spid = '51' dbcc inputbuffer(53) with tb as ( select blocking_session_id, session_id,db_name(database_id) as dbname,text from master.sys.dm_exec_requests a CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) ), tb1 as ( select a.*,login_time,program_name,client_interface_name,login_name,cpu_time,memory_usage*8 as 'memory_usage(KB)', total_scheduled_time,reads,writes,logical_reads from tb a inner join master.sys.dm_exec_sessions b on a.session_id=b.session_id ) select a.*,connect_time,client_tcp_port,client_net_address from tb1 a inner join master.sys.dm_exec_connections b on a.session_id=b.session_id --当前进程数 select * from master.dbo.sysprocesses order by cpu desc --查看当前活动的进程数 sp_who active --查询是否由于连接没有释放引起CPU过高 select * from master.dbo.sysprocesses where spid> 50 and waittype = 0x0000 and waittime = 0 and status = 'sleeping ' and last_batch < dateadd(minute, -10, getdate()) and login_time 50 and waittype = 0x0000 and waittime = 0 and status = 'sleeping ' and last_batch < dateadd(minute, -60, getdate()) and login_time 1 ORDER BY qs.plan_generation_num SELECT top 50 qt.text AS SQL_text ,SUM(qs.total_worker_time) AS total_cpu_time, SUM(qs.execution_count) AS total_execution_count, SUM(qs.total_worker_time)/SUM(qs.execution_count) AS avg_cpu_time, COUNT(*) AS number_of_statements FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt GROUP BY qt.text ORDER BY total_cpu_time DESC --统计总的CPU时间 --ORDER BY avg_cpu_time DESC --统计平均单次查询CPU时间 -- 计算可运行状态下的工作进程数量 SELECT COUNT(*) as workers_waiting_for_cpu,s.scheduler_id FROM sys.dm_os_workers AS o INNER JOIN sys.dm_os_schedulers AS s ON o.scheduler_address=s.scheduler_address AND s.scheduler_id<255 WHERE o.state='RUNNABLE' GROUP BY s.scheduler_id
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值