标签归档:sql优化

mssql sqlserver order by 排序字段运行速度慢的处理方法分享


摘要:
下文记载sql脚本中order by关键字导致运行速度慢的处理方法分享,如下所示:
实验环境:sql server 2008 R2


order by关键字是我们在编写sql脚本时,常用的关键字,今天有一个同事编写了一个order by的sql语句,运行速度非常的慢,下面我们将解决此问题的处理方法分享如下:
首先order by 运行慢有以下原因:

1.排序字段上没有设置合适的索引
2.排序字段后加入了asc或desc同索引上的排序方式不同,导致索引失效
3.排序字段中加入了函数导致索引无效
4.涉及多个排序字段,并且这多个字段不在同一张数据表中
5.排序字段是一个text字段,无法运用索引,所以导致效率低下,需调整排序字段类型

根据以上order by 可能导致慢的原因,我们可以进行一些针对性的优化:
1.让order by 涉及字段存在一个数据表中
2.order by字段上建立合适的索引(索引中注意索引键及索引所包含的列)
3.order by 字段上的排序方式同索引上的排序方式须一致
4.禁止对text字段做排序(如果一定要对text字段做排序,请使用varchar(max)或nvarchar(max)对字段进行存储)

mssql sqlserver sql脚本中group by 运行效率差,速度慢的原因分析及优化方法分享


摘要:
下文记载一次group by 运行速度慢的分析及处理方法,如下所示:
实验环境:sql server 2008 R2

项目背景:
系统已经上线运行了整整十年了,最近新写了一个数据分组统计(group by)的sql脚本,发现速度运行的越来越慢,下文将可能导致group by慢的原因依次列出,并做出相应的处理:

原因1:分组字段上未建立合适的索引,此时我们可以采取缺失索引获取方法
原因2:分组字段存在多个,并且所属不同的数据表(由于分组字段分属不同的表,所以sql计算时会消耗更多的资源)
原因3:分组字段中加入了排序,导致索引失效
原因4:分组字段的数据类型是一些超级大的字段(text)
原因5:分组字段进行了相应的函数运算,导致索引失效

我们可以根据以上的原因对分组的sql脚本进行优化:
1.检查分组字段是否建立了合适的索引
2.将查询结果集先操作后(group by where 等操作)过滤为最小化后,再做相应的关联其它表的操作
3.检查分组字段是否为导致索引失效,如导致索引失效,我们需想出相应的方法使其索引正常有效

mssql sqlserver 加快数据库回滚的速度–ACCELERATED_DATABASE_RECOVERY用法说明


摘要:
下文通过举例的方式,讲述sqlserver中加速数据库回滚时间的方法,如下所示:
实验环境:sql server 2019


当一个长事务被意外终止或停止时,回滚此事务需要大量的时间,下文讲述sqlserver2019中通过开启

ACCELERATED_DATABASE_RECOVERY
属性,来提升sqlserver事务回滚时间的方法

例: 测试方案一

---1.创建数据库 

CREATE DATABASE [maomao];
GO
USE [maomao]
GO
SET STATISTICS TIME ON
GO

---2.开启事务,并运行以下脚本
BEGIN TRANSACTION
 

DROP TABLE IF EXISTS testTable;
 
---生成新数据表,并插入数据
SELECT TOP 10000000 a1.* 
INTO testTable 
FROM sys.all_objects AS a1
CROSS JOIN sys.all_objects AS a2
CROSS JOIN sys.all_objects AS a3
GO

 
/*
SQL Server Execution Times:
CPU time = 1632000 ms, elapsed time = 26108 ms.
*/

---3回滚事务
ROLLBACK
GO 
/*
SQL Server Execution Times:
CPU time = 386000 ms, elapsed time = 12603 ms.
*/ 

例:
测试方案2:
设置 ACCELERATED_DATABASE_RECOVERY属性为ON

 ALTER DATABASE [maomao] 
  SET ACCELERATED_DATABASE_RECOVERY = ON;
  GO 


---2.开启事务,并运行以下脚本
BEGIN TRANSACTION
 

DROP TABLE IF EXISTS testTable;
 
---生成新数据表,并插入数据
SELECT TOP 10000000 a1.* 
INTO testTable 
FROM sys.all_objects AS a1
CROSS JOIN sys.all_objects AS a2
CROSS JOIN sys.all_objects AS a3
GO

 
/*
SQL Server Execution Times:
CPU time = 1632000 ms, elapsed time = 26108 ms.
*/

---3回滚事务
ROLLBACK
GO 
/*
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
*/ 


从以上的两个测试用例上,我们可以看出设置ACCELERATED_DATABASE_RECOVERY属性后,rollback性能得到了质的飞跃。