SQLServer 调优优化
文章平均质量分 87
薛定谔的DBA
这个作者很懒,什么都没留下…
展开
-
SQL Server Latches(闩锁)
SQL Server 闩锁是一种内部的 SQL Server 机制,用于保护共享内存资源,比如缓冲池中的页面和内存数据结构,以便协调对这些资源的访问并保护它们免受破坏。在执行增长和收缩操作时,SQL Server 获取 FCB、FGCB_ADD_REMOVE 和 FGCB_ALLOC 这类闩锁,以确保对文件控制块的访问,并确保对存储在文件组中的信息同步访问。闩锁争用对于拥有大量 CPU 的系统来说是一种常见的情况,它在相同的内存结构上,多个线程同时尝试获取彼此不兼容的 SQL Server 闩锁的结果。原创 2023-02-05 14:27:46 · 1146 阅读 · 0 评论 -
SQL Server 重建索引与重组索引区别
下一次执行日志备份(BULK_LOGGED 模式或切换到 FULL 模式)时也将包含重建更改的所有范围,因此日志备份的大小与在 FULL 恢复模式下重建索引完成的大小是一样的。因此,索引重组非常节省空间。和往常一样,我推荐Ola Hallengren的免费代码,而不是编写你自己的索引维护解决方案(是的,其他人也做过类似的工作,但我认为Ola的代码是迄今为止最好的、使用最广泛的)。正如你所看到的,在重建和重组之间有相当多的主要区别,但是对于你应该使用哪一个并没有正确的答案——那是你的选择。原创 2023-02-05 14:22:55 · 1857 阅读 · 0 评论 -
SQL Server 临时对象缓存
创建表是一个相对资源密集型和耗时的操作。服务器必须为新的数据和索引结构去定位和分配存储空间,并在多个系统元数据表中创建相应的条目。所有工作都必须以在高并发下完成,并且满足关系数据库的事务特性ACID……......原创 2022-08-02 13:42:46 · 1083 阅读 · 0 评论 -
SQL Server 查询优化(测试02)参数嗅探-执行计划选择
最近常看到"参数嗅探"这个词,看了几篇文章,于是就自己摸索做个测试来加深印象!去官网下载了数据库:AdventureWorks2012直接测试吧!找几个熟悉的表关联起来,用ProductID作为条件找到两个ID返回行数相差较大的值.ProductID=870(4688行) ProductID=897(2行) 【测试一】--先清空计划缓存DBCC FREEPROCCAC原创 2014-12-28 03:09:47 · 3452 阅读 · 0 评论 -
SQLServer inner join 不先执行where条件的优化
前端操作偶尔超时,发现一个查询很慢,格式如下:select * from a inner join b on b.id=a.bidinner join c on c.id=a.cidwhere a.way=1 and a.num='10000'a 表为深红色,返回240万行数据。执行了33秒。最终结果返回一条记录!可以看到其行数估计非常不准。看看该索引统计原创 2015-03-03 20:44:20 · 9701 阅读 · 6 评论 -
SQL Server 统计信息理解(总结)
前言Sqlserver 查询是基于开销查询的,在首次生成执行计划时,是基于多阶段的分析优化才确定出较好的执行计划。而这些开销的基数估计,是根据统计信息来确定的。统计信息其实就是对表的各个字段的总体数据进行分段分布,数据库默认都会自动维护。 表和视图都有统计信息,统计信息对象是根据索引或表列的列表创建的。当某列第一次最为条件查询时,将创建单列的统计信息。当创建索引时,将创建同名的统计信息原创 2015-01-17 17:21:03 · 15092 阅读 · 0 评论 -
SQLServer 集合函数 COUNT 优化分析
-- 创建测试表-- drop table tb_CountTestcreate table tb_CountTest( [uniqueidentifier] [uniqueidentifier] not null, [bigint] [bigint] not null, [tinyint] [tinyint] not null, [int] [int] not null, [in原创 2015-03-24 01:31:27 · 5268 阅读 · 0 评论 -
SQL Server 聚集索引在函数中使用以至失效(案例)
最近在进行一期的优化,先把数据库中最耗时的前N个语句查询出来!SELECT TOP 10 qp.query_plan,qt.text,total_worker_time from sys.dm_exec_query_stats CROSS APPLY sys.dm_exec_sql_text(sql_handle) qt CROSS APPLY sys.dm_exec_query原创 2015-04-23 03:08:57 · 3758 阅读 · 0 评论 -
SQLServer 可变字符怎么设置长度?(如varchar)
今天突然想到nvarchar类型,联想到数据分配单元的3中类型:IN_ROW_DATA、LOB_DATA和 ROW_OVERFLOW_DATA官网再次查看了一下文档:表组织和索引组织(https://msdn.microsoft.com/zh-cn/library/ms189051(v=sql.105).aspx)其中看到下面图中的这句话:IN_ROW_DA原创 2015-09-02 14:41:16 · 19511 阅读 · 0 评论 -
T-SQL查询:慎用 IN 和 NOT IN
今天突然想到之前在书上看到的一个例子,竟然想不起来了.于是翻书找出来,测试一下.-- drop table father,soncreate table father(fid int,name varchar(10),oid int)create table son(sid int,name varchar(10),fid int)insert into father(fid原创 2014-12-06 01:08:53 · 14547 阅读 · 3 评论 -
SQLServer 不执行的条件分支却消耗时间!求解…
测试脚本:-- 创建测试库-- drop database TestDBuse mastergocreate database TestDBgo-- 创建证书-- drop certificate Mycertificate;use TestDBgocreate certificate Mycertificate encryption by passwor原创 2015-09-21 15:43:01 · 1036 阅读 · 0 评论 -
SQLServer 复杂存储过程并发优化(案例)
一个存储过程,1500行代码,内部有一个查询,关联使用了200多张表(其中有重复的表),并发线程执行,耗时15秒左右,结果返回一般几行记录。这个存储过程是系统中最耗时、最消耗性能的。今天突然想着得优化一下了!取出存储过程内的查询,声明相关参数执行脚本。查看执行计划,其中有这么一段,如图:有操作符 Filter ,将87万行数据变成了1行!这点是可以优化的点,原创 2016-07-18 12:32:06 · 8972 阅读 · 0 评论 -
SQL Server 查看缓存中使用索引扫描、表扫描、键查找、隐式转换的SQL语句
表扫描和标检查询是最消耗性能的,还好就是SqlServer自动维护执行计划将其保存在内存中.而且动态视图sys.dm_db_index_usage_stats也记录相关信息,这样我们就可以再次分析执行计划,从而找出进行优化--总体查看哪个数据库扫描查询次数最多select db_name(database_id),max(user_scans) bigger,avg(user_scans原创 2015-01-14 13:08:05 · 2168 阅读 · 0 评论 -
SQLServer 大容量导入导致死锁和系统变慢问题
今天测试同事反馈系统变得比较慢,看看什么原因。按常理,用几个日常排除语句:--当前正在执行的语句SELECTder.[session_id],der.[blocking_session_id],sp.lastwaittype,sp.hostname,sp.program_name,sp.loginame,der.[start_time] AS '开始时间',der.[st原创 2016-07-20 15:35:03 · 4240 阅读 · 1 评论 -
SQLServer 使用数据库邮件时常看到超时语句 sp_readrequest
当数据库使用邮件时,使用 trace 或 profiler 跟踪慢查询语句时,发现有一个语句出现频率较多: exec sp_readrequest @receive_timeout=600000原创 2017-04-25 17:40:07 · 2624 阅读 · 0 评论 -
SQL Server 维护脚本分享(14)堵塞SQL跟踪
之前文章(SQLServer 利用profiler生成脚本在后台跟踪堵塞语句或慢查询语句) 有用 profiler 可以慢查询或堵塞查询,但是profiler 开销太大,又需要指定时长。现在用个简单sql定时查询统计。最底部执行的脚本,会查询当前正在被堵塞和堵塞其他会话的会话。原创 2017-12-18 15:38:13 · 676 阅读 · 0 评论 -
SQL Server 查询优化(测试01)创建聚集索引避免堵塞
-- 创建测试表-- drop table testcreate table test(id int not null,name varchar(10))insert into test(id,name)values (1,'aa'),(2,'bb')select * from test -- 打开查询窗口1执行以下语句print @@spidbegin tran up原创 2014-12-26 01:33:34 · 1611 阅读 · 0 评论 -
SQL Server 查询优化(测试03)执行计划优化
【Adhoc 即席查询优化】有些sql语句查询只有一次,查询后生成计划缓存占用较大的空间。如果有较多的即席查询,将会占用更多的内存空间。下面测试即席查询优化:(上篇操作中,是没有优化的情况)use AdventureWorks2012go--查看当前实例即席查询优化配置是否开启exec sp_configure 'optimize for ad hoc workloads原创 2015-01-06 22:47:45 · 1730 阅读 · 0 评论 -
诊断SQLSERVER问题常用的日志
这里主要有两个:(1)Windows事件日志(2)SQLSERVER ErrorLog1、Windows事件日志 Event Log作为一个Windows开启和管理的服务程序,Windows会在自己的系统日志system log里记录SQLSERVER这个服务的启动、正常关闭、异常关闭等信息。SQLSERVER也会把自己的一些概要信息同时记录在Win转载 2013-04-03 17:07:28 · 1368 阅读 · 0 评论 -
sqlserver 简单锁实例
/*以此表为例:SELECT * FROM tb姓名 课程 分数---------------------张三 语文 74张三 数学 83李四 语文 74李四 数学 84李四 物理 94*/--新建第一个会话窗口,执行以下语句:BEGIN TRAN UPDATE dbo.tb SET 分数 = 85 WHERE 姓名 = '张三' AND 课程 = '语原创 2013-10-02 11:57:19 · 1800 阅读 · 0 评论 -
sqlserver 逻辑执行步骤分析
--分析语句SET SHOWPLAN_ALL ON --只输出分析结果SET STATISTICS PROFILE ON --输出语句结果和分析结果先创建分析表:/*DROP TABLE CUSTOMERSDROP TABLE PRODUCTSDROP TABLE SALES*/CREATE TABLE CUSTOMERS( C_ID INT IDENTI原创 2013-09-21 14:04:20 · 1255 阅读 · 0 评论 -
SqlServer大量更新引起同步链延时问题
前言: 在SQLServer数据库中,当我们对一个位于同步链上的表进行更新时,如果更新的记录数也非常多,几百或是几千万,那么批量更新该表会造成同步链的大量延时(甚至有可能崩溃掉,即使同步链不崩溃,等的人也要崩溃了)。 原因: 一般情况下,Replication是根据我们更改的数据一条条更改记录的,也就是说我们在发布端下达如下的语句:转载 2014-08-16 18:15:16 · 5672 阅读 · 0 评论