SQLServer数据库之SqlServer查看表、存储过程、耗时查询、当前进程、开销较大的语句

--查看数据库中表的语句
SELECT  s2.dbid ,
         DB_NAME(s2.dbid) AS [数据库名] ,
         --s1.sql_handle ,
         ( SELECT TOP 1
                     SUBSTRING(s2.text, statement_start_offset / 2 + 1,
                               ( ( CASE WHEN statement_end_offset = -1
                                        THEN ( LEN(CONVERT(NVARCHAR(MAX), s2.text))
                                               * 2 )
                                        ELSE statement_end_offset
                                   END ) - statement_start_offset ) / 2 + 1)
         ) AS [语句] ,
         execution_count AS [执行次数] ,
         last_execution_time AS [上次开始执行计划的时间] ,
         total_worker_time AS [自编译以来执行所用的 CPU 时间总量(微秒)] ,
         last_worker_time AS [上次执行计划所用的 CPU 时间(微秒)] ,
         min_worker_time AS [单次执行期间曾占用的最小 CPU 时间(微秒)] ,
         max_worker_time AS [单次执行期间曾占用的最大 CPU 时间(微秒)] ,
         total_logical_reads AS [总逻辑读] ,
         last_logical_reads AS [上次逻辑读] ,
         min_logical_reads AS [最少逻辑读] ,
         max_logical_reads AS [最大逻辑读] ,
         total_logical_writes AS [总逻辑写] ,
         last_logical_writes AS [上次逻辑写] ,
         min_logical_writes AS [最小逻辑写] ,
         max_logical_writes AS [最大逻辑写]
 FROM    sys.dm_exec_query_stats AS s1
         CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2
 WHERE   s2.objectid IS NULL
 ORDER BY last_worker_time DESC

 --查看存储过程执行的语句
  SELECT
            DB_NAME(ISNULL(EPS.database_id,‘‘)) [数据库名称]
       --ISNULL(DBS.name, ‘‘) AS DatabaseName
       ,OBJECT_NAME(EPS.object_id, EPS.database_id) [存储过程名称] --AS ObjectName
       ,EPS.cached_time [添加到缓存的时间]--AS CachedTime
       ,EPS.last_elapsed_time  ‘最近执行所耗费时间(微秒)‘--AS LastElapsedTime
       ,EPS.last_worker_time ‘上次执行存储过程所用的CPU时间(微秒)‘
       ,EPS.execution_count [上次编译以来所执行的次数]--AS ExecutionCount
       ,EPS.total_worker_time / EPS.execution_count [平均每次执行所用的CPU时间总量(微秒)]--AS AvgWorkerTime
       ,EPS.total_elapsed_time / EPS.execution_count [平均每次执行所用的时间(微秒)]--AS AvgElapsedTime
       ,(EPS.total_logical_reads + EPS.total_logical_writes)
        / EPS.execution_count AS AvgLogicalIO
       ,b.text [存储过程内容]
 FROM sys.dm_exec_procedure_stats AS EPS
 CROSS APPLY sys.dm_exec_sql_text(EPS.sql_handle) b
 ORDER BY EPS.last_elapsed_time DESC;   

 --展示耗时的查询
 DECLARE @MinExecutions int;
 SET @MinExecutions = 5 

 SELECT EQS.total_worker_time AS TotalWorkerTime
       ,EQS.total_logical_reads + EQS.total_logical_writes AS TotalLogicalIO
       ,EQS.execution_count As ExeCnt
       ,EQS.last_execution_time AS LastUsage
       ,EQS.total_worker_time / EQS.execution_count as AvgCPUTimeMiS
       ,(EQS.total_logical_reads + EQS.total_logical_writes) / EQS.execution_count
        AS AvgLogicalIO
       ,DB.name AS DatabaseName
       ,SUBSTRING(EST.text
                 ,1 + EQS.statement_start_offset / 2
                 ,(CASE WHEN EQS.statement_end_offset = -1
                        THEN LEN(convert(nvarchar(max), EST.text)) * 2
                        ELSE EQS.statement_end_offset END
                  - EQS.statement_start_offset) / 2
                 ) AS SqlStatement
       -- Optional with Query plan; remove comment to show, but then the query takes !!much longer time!!
       --,EQP.[query_plan] AS [QueryPlan]
 FROM sys.dm_exec_query_stats AS EQS
      CROSS APPLY sys.dm_exec_sql_text(EQS.sql_handle) AS EST
      CROSS APPLY sys.dm_exec_query_plan(EQS.plan_handle) AS EQP
      LEFT JOIN sys.databases AS DB
          ON EST.dbid = DB.database_id
 WHERE EQS.execution_count > @MinExecutions
       AND EQS.last_execution_time > DATEDIFF(MONTH, -1, GETDATE())
 ORDER BY AvgLogicalIo DESC,AvgCPUTimeMiS DESC

 --当前进程及其语句:
SELECT PRO.loginame AS LoginName
       ,DB.name AS DatabaseName
       ,PRO.[status] as ProcessStatus
       ,PRO.cmd AS Command
       ,PRO.last_batch AS LastBatch
       ,PRO.cpu AS Cpu
       ,PRO.physical_io AS PhysicalIo
       ,SES.row_count AS [RowCount]
       ,STM.[text] AS SQLStatement
 FROM sys.sysprocesses AS PRO
      INNER JOIN sys.databases AS DB
          ON PRO.dbid = DB.database_id
      INNER JOIN sys.dm_exec_sessions AS SES
         ON PRO.spid = SES.session_id
      CROSS APPLY sys.dm_exec_sql_text(PRO.sql_handle) AS STM
 WHERE PRO.spid >= 50  -- Exclude system processes
 ORDER BY PRO.physical_io DESC ,PRO.cpu DESC;

 --5、开销较大的查询:
 SELECT  ss.SUM_execution_count ,
         t.text ,
         ss.SUM_total_elapsed_time ,
         ss.sum_total_worker_time ,
         ss.sum_total_logical_reads ,
         ss.sum_total_logical_writes
 FROM    ( SELECT    S.plan_handle ,
                     SUM(s.execution_count) SUM_Execution_count ,
                     SUM(s.total_elapsed_time) SUM_total_elapsed_time ,
                     SUM(s.total_worker_time) SUM_total_worker_time ,
                     SUM(s.total_logical_reads) SUM_total_logical_reads ,
                     SUM(s.total_logical_writes) SUM_total_logical_writes
           FROM      sys.dm_exec_query_stats s
           GROUP BY  S.plan_handle
         ) AS ss
         CROSS APPLY sys.dm_exec_sql_text(ss.plan_handle) t
 ORDER BY sum_total_logical_reads DESC

原文地址:https://www.cnblogs.com/weifeng123/p/12099578.html

时间: 2024-08-29 15:55:36

SQLServer数据库之SqlServer查看表、存储过程、耗时查询、当前进程、开销较大的语句的相关文章

SqlServer查看表、存储过程、耗时查询、当前进程、开销较大的语句

--查看数据库中表的语句 SELECT s2.dbid , DB_NAME(s2.dbid) AS [数据库名] , --s1.sql_handle , ( SELECT TOP 1 SUBSTRING(s2.text, statement_start_offset / 2 + 1, ( ( CASE WHEN statement_end_offset = -1 THEN ( LEN(CONVERT(NVARCHAR(MAX), s2.text)) * 2 ) ELSE statement_en

General MYSQL 复制.frm数据库文件后查看表提示表不存在 Error code: 1146

现象: 将含.frm的源数据库文件夹复制到另一Mysql环境下后,打开Mysql,查看数据库和表都无问题,但在打开数据表查看表结构和表数据时提示error code: 1146,要访问的数据表"doesn't exist" 解决: 除了复制.frm的源数据库文件夹外,还需停止mysql服务(无论是拷贝源还是拷贝目的地,mysql服务最好都停掉),然后再复制与源数据库文件夹同目录下的以下3个文件粘贴或覆盖到目的文件中,然后再启动Mysql服务即可. 拷贝以上3个文件需以停止Mysql服务

SQLserver 数据库的索引,存储过程和触发器的使用与概念

前言:索引,存储过程和触发器可以对一些高级的数据处理和查询,从而更好的实现对数据库的操作,诊断和优化. 一.索引 索引提供指针以指向存储在表中指定的数据值,数据库的索引,就好比一本书中的目录类似,无需阅读整个一本书,利用目录就可以快速的查找所需信息.在数据库中,索引使数据库程序无需对整个表进行扫描,就可以在其中找到所需数据.通过使用索引,可以大大提高数据库的查询速度 (1) 索引分类 1.唯一索引 唯一索引不允许两行具有相同索引值 2.主键索引 在数据库关系图中为表定义一个主键将自动创建主键索引

openTSP连接sqlServer数据库&jpa调用存储过程

openTSP框架下的模块都是连接mysql数据库,近期青汽有连接sqlServer数据库的需求,在调研后配置了sqlServer数据库,使用jpa调用存储过程,中间也踩了不少坑,总结一下,避免大家再掉进去. 1.首先配置sqlServer的依赖 <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>sqljdbc4</artifactId> <version

sqlserver数据库的索引、视图和触发器

  Sqlserver数据库的索引.视图和触发器 数据库的索引类似于字典中的目录,无需阅读.可以直接利用目录快速查找所需要的信息 索引的种类: 聚集索引:反应的是数据存储的物理顺序,一个表只能包含一个聚集索引 非聚集索引:不反应数据存储的物理顺序,一个表可以有多个非聚集索引 1.1. 准备环境 1.1.1. 创建聚集索引 目前tstudent表中没有任何索引也没有主键 为tstudent表创建聚集索引 选中studentID,单击左上侧的主键按钮 为Tstuden表的studentID创建主键就

mysql之创建数据库,创建数据表

写在前面 项目中用到mysql数据库,之前也没用过mysql,今天就学下mysql的常用的语法,发现跟sql server的语法极其相似.用起来还是蛮简单的. 一个例子 1.创建一个名为School的数据库. 1.创建一个学生信息表:学生id(自增,主键),姓名,年龄,性别,电话,籍贯,入学时间,所属班级id(外键). 2.创建一个学生成绩表:成绩id(自增,主键),科目,成绩,学生id(外键),创建时间. 3.创建一个学生班级表:班级id(主键,自增),班级名称. 创建表和数据库 #如果存在数

数据库优化之分表

数据库优化之分表说明分割方式垂直分割水平分割水平分割方案数据库分片方案创建中间表说明单表数据量大,这时分成多个表,并行查询单表字段内容大,将大字段分离到另一个表,减少第一个表io建议超500万以上再做分表,而却精良将表放在不同物理机上,这时会出现不同数据库事物的问题,所以复杂度也就高了,所以分表需要全面考虑分表后的优势是否大于劣势分割方式垂直分割垂直分割适用于记录不是非常多的,但是字段却很多,这样占用空间比较大,检索时需要执行大量的I/O,严重降低了性能,这个时候需要把大的自读那拆分到另一个表中

如何查看SQLServer数据库每个表占用的空间大小?

如何查看SQLServer数据库每个表占用的空间大小? 创建存储过程: CREATE PROCEDURE [dbo].[sys_viewTableSpace]AS BEGIN SET NOCOUNT ON; CREATE TABLE [dbo].#tableinfo( 表名 [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, 记录数 [int] NULL, 预留空间 [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,

sqlserver查询数据库中有多少个表

sqlserver查询数据库中有多少个表 <div class="articalTitle" style="clear:both; line-height:20px; padding-bottom:10px;> SELECT * FROM sysobjects WHERE (xtype = 'U') C = CHECK 约束 D = 默认值或 DEFAULT 约束 F = FOREIGN KEY 约束 L = 日志 FN = 标量函数 IF = 内嵌表函数 P =