SQL Server 性能优化 SQL Server Profiler 数据库引擎优化顾问

SET Statements                SET 语句设置局部变量的信息【推荐
SET STATISTICS TIME    显示分析、编译和执行各SQL语句所需的毫秒数【显示SQL语句执行时间】
SET STATISTICS IO         显示SQL语句所生成的物理和逻辑 IO 活动量的相关信息

SET SHOWPLAN_ALL     不执行SQL语句,而是 SQL Server 返回有关执行语句(查询计划)的详细信息,并提供对语句和预期行的资源需求的估计(基数估计)
SET SHOWPLAN_TEXT  不执行SQL语句,而是 SQL Server 返回有关执行语句的详细信息
SET SHOWPLAN_XML    不执行SQL语句,而是 SQL Server 返回有关以定义好的 XML 文档格式执行上述语句的详细信息

SET STATISTICS PROFILE  显示语句的配置文件信息,对即席查询、视图和存储过程有效
redgate
启动并使用数据库引擎优化顾问
启动数据库引擎优化顾问
第 1 课:数据库引擎优化顾问中的基本导航 (DTA)
第 2 课:使用数据库引擎优化顾问​​​​
显示估计的执行计划
创建跟踪 (SQL Server Profiler)

使用DMV
使用DTA (database engine tuning advisor) 数据库引擎优化顾问

SQL Server Profiler 监控 跟踪文件

监控 慢SQL  
第 1 步:【常规】选项卡
跟踪名称(T):  无标题-1
使用模板(U): Standard (default)

第 2 步:【事件选择】选项卡
Stored Procedures【存储过程】
RPC:Completed 事件类  
TSQL【SQL语句】
SQL:BatchCompleted 事件类
SQL:BatchStarting 事件类

第 3 步:【事件选择】选项卡【列筛选器】
TextDate:包含执行的SQL语句或存储过程的文本
CPU:       事件使用的 CPU 时间(毫秒)
Duration:事件占用的时间,sql耗时
DatabaseID:数据库的ID【select DB_ID(),select database_id from sys.databases where name = 'dbTest'】
DatabaseName:正在执行SQL语句的数据库名称

设置如下:
TextDate 类似于 select
Duration 大于等于 5000 毫秒
DatabaseID         数值 1
DatabaseName   数据库名称 dbTest

第 4 步:选中【显示所有列】
DatabaseName 设置为选中状态

第 5 步:点击【运行】按钮

第 6 步:执行测试的sql语句,查看追踪器信息

declare @pageIndex int = 1
declare @pageSize int = 100

select i.Id,i.Amount,i.UserName 
from table_name i
where i.Amount> 0
order by i.Id asc 
offset (@pageIndex-1) * @pageSize rows 
fetch next @pageSize rows only
go

1、查看SQL语句执行时间和cpu,显示分析、编译和执行各语句所需的毫秒数。

-- 语法
-- SET STATISTICS TIME { ON | OFF } 

-- 实例
set statistics time on
go

select * from sys_user
go

set statistics time off
go

执行后在【消息】里可以看到

2、查看查询对I/O的操作情况

-- 语法
-- SET STATISTICS IO { ON | OFF }    

-- 实例
set statistics io on
go

select * from sys_user 
go

set statistics io off
go

执行之后的结果

3、set statistics profile { on | off }

-- 语法
-- SET STATISTICS PROFILE { ON | OFF } 

-- 实例
set statistics profile on
go

select * from sys_user 
go

set statistics profile off
go

新建查询 -> 查询 -> 查询选项 -> 高级 -> 【SET STATISTICS TIME、SET STATISTICS IO】

消息面板内容

4、执行计划 

鼠标悬浮到图标上会显示此步骤执行的详细内容。

执行计划【SHOWPLAN_TEXT】

SET SHOWPLAN_TEXT ON;
GO

SELECT i.Id,i.Amount,i.AvailableAmount,i.UserName 
FROM Test as i
WHERE i.AvailableAmount > 0
ORDER BY i.CheckTime
OFFSET 1 ROWS 
FETCH NEXT 10 ROWS ONLY
GO

SET SHOWPLAN_TEXT OFF;
GO

执行计划【SHOWPLAN_XML】

SET SHOWPLAN_XML ON;
GO

SELECT i.Id,i.Amount,i.AvailableAmount,i.UserName 
FROM Test as i
WHERE i.AvailableAmount > 0
ORDER BY i.CheckTime
OFFSET 1 ROWS 
FETCH NEXT 10 ROWS ONLY
GO

SET SHOWPLAN_XML OFF;
GO

执行计划【SHOWPLAN_ALL】

SET SHOWPLAN_ALL ON;
GO

SELECT i.Id,i.Amount,i.AvailableAmount,i.UserName 
FROM Test as i
WHERE i.AvailableAmount > 0
ORDER BY i.CheckTime
OFFSET 1 ROWS 
FETCH NEXT 10 ROWS ONLY
GO

SET SHOWPLAN_ALL OFF;
GO

5、查看表的磁盘、碎片情况


-- 使用sp_spaceused存储过程,查看表的磁盘使用情况
EXEC sp_spaceused 'table_name';

-- 检查表的碎片情况
DBCC SHOWCONTIG('table_name');

-- 碎片整理索引
-- DBCC INDEXDEFRAG('database_name', 'table_name', 'index_name');
 
-- 重建索引
-- DBCC DBREINDEX('table_name', 'index_name');

6、查看【表】结构  

select
--表名 = case when a.colorder=1 then d.name else '' end,
--表说明 = case when a.colorder=1 then isnull(f.value, '') else '' end,
--序号 = a.colorder,
列名 = a.name
--,数据类型 = b.name
,数据类型 = b.name + '(' + CONVERT(VARCHAR, COLUMNPROPERTY(a.id, a.name, 'PRECISION')) + ')'
--,长度 = COLUMNPROPERTY(a.id,a.name, 'PRECISION')
--,小数位 = isnull(COLUMNPROPERTY(a.id,a.name, 'Scale'), 0)
--,标识 = case when COLUMNPROPERTY(a.id,a.name, 'IsIdentity') = 1 then '是' else '' end
--,主键 = case when exists(select 1 from sysobjects where xtype = 'PK' and parent_obj = a.id and name in (
--           select name from sysindexes where indid in(select indid from sysindexkeys where id = a.id and colid=a.colid))) then '是' else '' end
--,占用字节数 = a.length
,允许空 = case when a.isnullable = 1 then '是' else '否' end
--,默认值 = isnull(e.text, '')
,说明 = isnull(g.[value], '')
from syscolumns a
left join systypes b on a.xusertype = b.xusertype
inner join sysobjects d on a.id = d.id and d.xtype = 'U' and d.name <> 'dtproperties'
left join syscomments e on a.cdefault = e.id
left join sys.extended_properties g on a.id = G.major_id and a.colid = g.minor_id
left join sys.extended_properties f on d.id = f.major_id and f.minor_id = 0
where d.name = 'sys_user'              --表名
order by a.id,a.colorder

7、查看【索引】使用情况

--查询表中已存在的索引
exec sp_helpindex sys_user

-- 效果1
select db_name(database_id) as N'dbHuobi',             --数据库名
object_name(a.object_id) as N'TestTable',              --表名
b.name N'索引名称',
user_seeks N'用户索引查找次数',
user_scans N'用户索引扫描次数',
last_user_seek N'最后查找时间',
last_user_scan N'最后扫描时间',
rows as N'表中的行数'
from sys.dm_db_index_usage_stats a 
join sys.indexes b on a.index_id = b.index_id and a.object_id = b.object_id
join sysindexes c on c.id = b.object_id
where database_id=db_id('dbHuobi')                     --数据库名
and object_name(a.object_id) not like 'sys%'
and object_name(a.object_id) like 'TestTable'          --表名
and b.name like 'IX_TestTable_TestCol1'                --索引名
order by user_seeks,user_scans,object_name(a.object_id)
GO

-- 效果2
select db_name(database_id) as N'dbHuobi'              --数据库名
, object_name(a.object_id) as N'TestTable'             --表名
, b.name N'索引名称'
, user_seeks N'用户索引查找次数'
, user_scans N'用户索引扫描次数'
, max(last_user_seek) N'最后查找时间'
, max(last_user_scan) N'最后扫描时间'
, max(rows) as N'表中的行数'
from sys.dm_db_index_usage_stats a
join sys.indexes b on a.index_id = b.index_id and a.object_id = b.object_id
join sysindexes c on c.id = b.object_id
where database_id=db_id('dbHuobi')                     --数据库名
and object_name(a.object_id) not like 'sys%'
and object_name(a.object_id) like 'TestTable'          --表名
and b.name is not null
and b.name like 'IX_TestTable_TestCol1'                --索引名
group by db_name(database_id),object_name(a.object_id),b.name,user_seeks,user_scans
order by user_seeks,user_scans,object_name(a.object_id)

效果图

*
8、EF Core 抓取 Sql 语句
管理 NuGet 程序包(N)...

Microsoft.Extensions.Logging.Console

SqlDbContext.cs 文件

using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;

namespace Web
{
    public class SqlDbContext : DbContext
    {
        public SqlDbContext(DbContextOptions<SqlDbContext> options)
            : base(options)
        {
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseLoggerFactory(LoggerFactory.Create(builler=> 
            {
                builler.AddConsole();
            }));
        }

        public virtual DbSet<V_Dict> Dict { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<V_Dict>(entity =>
            {
                entity.HasNoKey();
                entity.ToView("V_Dict");
            });
        }
    }
}

命令行窗口

输出窗口

*
*
*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值