SqlServer递归查询,性能调优

2019-10-18 08:26 来源:未知
 1 DECLARE @ParentId NVARCHAR(36);
 2 SET @ParentId = '078499bf-dedd-b293-4653-7bf6a2e54cbb';
 3 
 4 WITH [Temp] AS
 5 (
 6     SELECT [A].* FROM [dbo].[Contacts] A WHERE [A].[ParentID] = @ParentId AND [A].[IsDefault] = 1
 7     UNION ALL
 8     SELECT [A].* FROM [dbo].[Contacts] A INNER JOIN [Temp] B ON A.[ParentID] = B.[ObjectID] AND [A].[IsDefault] = 1
 9 )
10 SELECT * FROM [Temp] ORDER BY [Temp].[GlobalSort] ASC;

 前言

一.概念

  在介绍能源等待PAGEIOLATCH在此之前,先来打探下从实例等级来深入分析的各个能源等待的dmv视图sys.dm_os_wait_stats。它是回到推行的线程所碰到的具有等待的连带新闻,该视图是从二个事实上等第来深入分析的种种等待,它包涵200七种类型的等候,供给关注的总结PageIoLatch(磁盘I/O读写的等待时间),LCK_xx(锁的等候时间),WriteLog(日志写入等待),PageLatch(页上闩锁)Cxpacket(并行等待)等以至其余国资本源等待排前的。 

  1.  下边依据总耗费时间排序来调查,这里剖判的等候的wait_type 不满含以下

SELECT  wait_type ,
        waiting_tasks_count,
        signal_wait_time_ms ,
        wait_time_ms,
        max_wait_time_ms
FROM    sys.dm_os_wait_stats
WHERE   wait_time_ms > 0
        AND wait_type NOT IN ( 'CLR_SEMAPHORE', 'CLR_AUTO_EVENT',
                               'LAZYWRITER_SLEEP', 'RESOURCE_QUEUE',
                               'SLEEP_TASK', 'SLEEP_SYSTEMTASK',
                               'SQLTRACE_BUFFER_FLUSH', 'WAITFOR',
                               'LOGMGR_QUEUE', 'CHECKPOINT_QUEUE',
                               'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT',
                               'BROKER_TO_FLUSH', 'BROKER_TASK_STOP',
                               'CLR_MANUAL_EVENT',
                               'DISPATCHER_QUEUE_SEMAPHORE',
                               'FT_IFTS_SCHEDULER_IDLE_WAIT',
                               'XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN',
                               'SQLTRACE_INCREMENTAL_FLUSH_SLEEP' )
ORDER BY signal_wait_time_ms DESC

  下图排行在前的财富等待是非同一般要求去关爱深入分析:

图片 1

  通过地点的询问就能够找到PAGEIOLATCH_x类型的能源等待,由于是实例级其余总结,想要得到有意义数据,就须要查阅感兴趣的日子间隔。假使要间隔来剖析,不必要重启服务,可透过以下命令来重新载入参数

DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);  

  wait_type:等待类型
  waiting_tasks_count:该等待类型的等候数
  wait_time_ms:该等待类型的总等待时间(包罗三个历程悬挂状态(Suspend)和可运维境况(Runnable)费用的总时间)
  max_wait_time_ms:该等待类型的最长等待时间
  signal_wait_time_ms:正在等待的线程从收到时域信号布告到其开首运维之间的时差(八个进程可运市场价格况(Runnable)开销的总时间)
  io等待时间==wait_time_ms - signal_wait_time_ms

转帖请表明出处: 

二. PAGEIOLATCH_x

  2.1 什么是Latch

    在sql server里latch是轻量级锁,分化于lock。latch是用来贰头sqlserver的当中对象(同步财富访谈),而lock是用来对于客户对象包含(表,行,索引等)进行联合,轻便回顾:Latch用来敬服SQL server内部的局地能源(如page)的物理访问,能够以为是二个联合对象。而lock则重申逻辑访问。举个例子一个table,便是个逻辑上的定义。关于lock锁那块在"sql server 锁与业务水落石出"中有详细表明。

  2.2 什么是PageIOLatch 

  当查问的数据页假诺在Buffer pool里找到了,则从未其余等待。不然就能够发生贰个异步io操作,将页面读入到buffer pool,没做完早前,连接会维持在PageIoLatch_ex(写)或PageIoLatch_sh(读)的等待状态,是Buffer pool与磁盘之间的等候。它体现了查询磁盘i/o读写的等候时间。
  当sql server将数据页面从数据文件里读入内部存款和储蓄器时,为了堤防其余客户对内部存款和储蓄器里的同三个数目页面进行访问,sql server会在内部存款和储蓄器的数额页同上加贰个排它锁latch,而当职分要读取缓存在内存里的页面时,会申请二个分享锁,像是lock一样,latch也会油然则生堵塞,依据区别的等待财富,等待情形有如下:PAGEIOLATCH_DT,PAGEIOLATCH_EX,PAGEIOLATCH_KP,PAGEIOLATCH_SH,PAGEIOLATCH_UP。注重关切PAGEIOLATCH_EX(写入)和PAGEIOLATCH_SH(读取)三种等待。

2.1  AGEIOLATCH流程图

  有的时候大家深入分析当前活动客户景况下时,二个妙不可言的景色是,不常候你发觉某些SPID被本人阻塞住了(通过sys.sysprocesses了翻看) 为何会融洽等待本人吧? 这么些得从SQL server读取页的长河说到。SQL server从磁盘读取贰个page的长河如下:

图片 2

图片 3

  (1):由一个客户要求,获取扫描X表,由Worker x去推行。

  (2):在扫描进程中找到了它须要的数额页同1:100。

  (3):发面页面1:100并不在内部存款和储蓄器中的数据缓存里。

  (4):sql server在缓冲池里找到二个能够存放的页面空间,在上面加EX的LATCH锁,幸免数据从磁盘里读出来以前,外人也来读取或涂改这么些页面。

  (5):worker x发起二个异步i/o央浼,须要从数据文件里读出页面1:100。

  (6):由于是异步i/o(可以见到为一个task子线程),worker x可以接着做它下边要做的事务,便是读出内部存款和储蓄器中的页面1:100,读取的动作须求提请二个sh的latch。

  (7):由于worker x在此以前申请了三个EX的LATCH锁还未有自由,所以那一个sh的latch将被阻塞住,worker x被本人阻塞住了,等待的财富就是PAGEIOLATCH_SH。

  最终当异步i/o甘休后,系统会通报worker x,你要的数额现已写入内部存款和储蓄器了。接着EX的LATCH锁释放,worker x申请获得了sh的latch锁。

小结:首先说worker是三个施行单元,上边有几个task关联Worker上, task是运作的细小职责单元,能够这么理解worker发生了第多个x的task职责,再第5步发起叁个异步i/o必要是第二个task义务。贰个task属于三个worker,worker x被本人阻塞住了。 关于职务调节理解查看sql server 职分调整与CPU。

 2.2 具体深入分析

  通过地点领会到借使磁盘的快慢不可能满意sql server的内需,它就能够化为一个瓶颈,平日PAGEIOLATCH_SH 从磁盘读数据到内部存款和储蓄器,若是内部存款和储蓄器远远不足大,当有内部存款和储蓄器压力时候它会放出掉缓存数据,数据页就不会在内部存款和储蓄器的数额缓存里,那样内部存款和储蓄器难点就导致了磁盘的瓶颈。PAGEIOLATCH_EX是写入数据,那经常是磁盘的写入速度显著跟不上,与内部存款和储蓄器未有一贯关联。

上面是查询PAGEIOLATCH_x的能源等待时间:

select wait_type,
waiting_tasks_count,
wait_time_ms ,
max_wait_time_ms,
signal_wait_time_ms
from sys.dm_os_wait_stats
where wait_type like 'PAGEIOLATCH%' 
order by wait_type

上面是查询出来的守候音讯:

PageIOLatch_SH 总等待时间是(7166603.0-15891)/一千.0/60.0=119.17分钟,平均耗费时间是(7166603.0-15891)/297813.0=24.01皮秒,最大等待时间是3159秒。

PageIOLatch_EX 总等待时间是(3002776.0-5727)/一千.0/60.0=49.95分钟,    平均耗费时间是(3002776.0-5727)/317143.0=9.45纳秒,最大等待时间是一九一三秒。

图片 4

关于I/O磁盘 sys.dm_io_virtual_file_stats 函数也做个参谋

SELECT  
       MAX(io_stall_read_ms) AS read_ms,
         MAX(num_of_reads) AS read_count,
       MAX(io_stall_read_ms) / MAX(num_of_reads) AS 'Avg Read ms',
         MAX(io_stall_write_ms) AS write_ms,
        MAX(num_of_writes) AS write_count,
         MAX(io_stall_write_ms) /  MAX(num_of_writes) AS 'Avg Write ms'
FROM    sys.dm_io_virtual_file_stats(null, null)
WHERE   num_of_reads > 0 AND num_of_writes > 0 

图片 5

  总结:PageIOLatch_EX(写入)跟磁盘的写入速度有关系。PageIOLatch_SH(读取)跟内部存款和储蓄器中的数码缓存有涉及。经过地点的sql总计查询,从等待的岁月上看,并不曾明晰的评估磁盘性能的行业内部,但足以做评估规范数据,定时重新初始化,做质量解析。要分明磁盘的压力,还需求从windows系统品质监视器方面来剖判。 关于内存原理查看”sql server 内部存款和储蓄器初探“磁盘查看"sql server I/O硬盘交互" 。

开采景况嘛, 作为.Net系Sql Server那是少不了的. 听过Sql server能够设置在Linux上了..于是抱着试一试的心思体验了一把..

不试不驾驭, 一试吓一跳...安装如故是爆简单, 居然比在Windows上边安装还要简单....

Just Do It!!!!

 

 初叶设置

 由于是新系统, 未有设置过Sql Server, 所以就变得很轻便了. 遵照微软官方的文书档案一步一步就OK...微软设置文书档案

图片 6

是因为是CentOS所以直接选择LANDHEL就OK了....

请认真阅读微软给的提醒...须求标准是

图片 7

1. 下载 Microsoft SQL Server Red Hat 存款和储蓄库配置文件

TAG标签:
版权声明:本文由澳门金莎娱乐网站发布于数据库,转载请注明出处:SqlServer递归查询,性能调优