SQL Server DMV ve DMF – 4

Bu yazımızda DMV ve DMF serisinin 3.’süne bakıyor olacağız. Konuya İlişkin daha detaylı bilgiye sahip olmak isterseniz ya da önceki serileri okumak isterseniz. SQL Server DMV ve DMF – I ve SQL Server DMV – II makalelerine göz gezdirilebilirsiniz. Bu yazımızda SQL Server üzerinde yoğun olarak kullandığımız ve SQL Operating system ile ilişkili bilgilere erişmek istediğimizde ihtiyacımız olan DMV ve DMF’lere göz gezdireceğiz. Bildiğiniz gibi DMV ve DMF’ler problem teşhisinde kullanıldığı gibi monitoring etmek içinde çokça kullanılmaktadır. Özellikle Operating system ile ilgili kullanmak istediğimizd sys.dm_os ile başlayanları kullanabiliriz. Peki biz hangi DMV’leri ne için ve nasıl okuyoruz? SQL Server’ın üzerinde koştuğu Windows’un bilgilerine ulaşmak için; SELECT * FROM sys.dm_os_windows_info; Görsel – 1   Windows_sku: Stock Keeping Unit Stock Keeping Unit değeri Windows_release sonucunun hexadecimal çıktısıdır. Görsel – 2 48 = 0x30 olduğunu biliyoruz. Bu değeri hesaplamak için Hexadecimal değeri Binary değere convert ederek elde edebilirsiniz.   SQL Server ve üzerinde […]

SQL Server DMV ve DMF – 4

Bu yazımızda DMV ve DMF serisinin 3.’süne bakıyor olacağız. Konuya İlişkin daha detaylı bilgiye sahip olmak isterseniz ya da önceki serileri okumak isterseniz. SQL Server DMV ve DMF – I ve SQL Server DMV – II makalelerine göz gezdirilebilirsiniz.

Bu yazımızda SQL Server üzerinde yoğun olarak kullandığımız ve SQL Operating system ile ilişkili bilgilere erişmek istediğimizde ihtiyacımız olan DMV ve DMF’lere göz gezdireceğiz. Bildiğiniz gibi DMV ve DMF’ler problem teşhisinde kullanıldığı gibi monitoring etmek içinde çokça kullanılmaktadır. Özellikle Operating system ile ilgili kullanmak istediğimizd sys.dm_os ile başlayanları kullanabiliriz.

Peki biz hangi DMV’leri ne için ve nasıl okuyoruz?

SQL Server’ın üzerinde koştuğu Windows’un bilgilerine ulaşmak için;

SELECT * FROM sys.dm_os_windows_info;

Görsel – 1

 

Windows_sku: Stock Keeping Unit

Stock Keeping Unit değeri Windows_release sonucunun hexadecimal çıktısıdır.

Görsel – 2

48 = 0x30 olduğunu biliyoruz. Bu değeri hesaplamak için Hexadecimal değeri Binary değere convert ederek elde edebilirsiniz.

 

SQL Server ve üzerinde koştuğu Windows’un kaynak bilgisine sahip olmak istediğimizde;

sys.dm_os_sys_info

DMV’si sql server’ın kullandığı CPU ve Memory kaynaklarına ilişkin detaylı olarak bilgilendirme yapacaktır.

Aynı zamanda Windows ve sql server’ın ne zaman restart olduğu bilgisine erişebilirim.

SELECT

DATEADD(s,((-1)*(OSI.[ms_ticks]/1000)),GETDATE()) AS last_WindowsServer_restart,

OSI.sqlserver_start_time,

(DATEDIFF(s, DATEADD(s,((-1)*(OSI.[ms_ticks]/1000)),GETDATE()), OSI.sqlserver_start_time)) AS recovery_time_seconds

FROM sys.[dm_os_sys_info] OSI;

Görsel – 3

Server’ın ne kadar süre önce restart olduğu bilgisine erişmek istediğimizde;

SELECT

[ms_ticks] AS ms_since_restart,

[ms_ticks]/1000 AS seconds_since_restart,

CAST([ms_ticks]/1000/60.0 AS DECIMAL(15,2)) AS minutes_since_restart,

CAST([ms_ticks]/1000/60/60.0 AS DECIMAL(15,2)) AS hours_since_restart,

CAST([ms_ticks]/1000/60/60/24.0 AS DECIMAL(15,2)) AS days_since_restart,

DATEADD(s,((-1)*([ms_ticks]/1000)),GETDATE()) AS time_of_last_restart

FROM sys.[dm_os_sys_info];

Görsel – 4

CPU hakkında bilgilere erişmek istediğimde;

DECLARE @xp_msver TABLE (

[idx] [int] NULL

,[c_name] [varchar](100) NULL

,[int_val] [float] NULL

,[c_val] [varchar](128) NULL

)

 

INSERT INTO @xp_msver

EXEC ('[master]..[xp_msver]');;

 

WITH [ProcessorInfo]

AS (

SELECT ([cpu_count] / [hyperthread_ratio]) AS [number_of_physical_cpus]

,CASE

WHEN hyperthread_ratio = cpu_count

THEN cpu_count

ELSE (([cpu_count] - [hyperthread_ratio]) / ([cpu_count] / [hyperthread_ratio]))

END AS [number_of_cores_per_cpu]

,CASE

WHEN hyperthread_ratio = cpu_count

THEN cpu_count

ELSE ([cpu_count] / [hyperthread_ratio]) * (([cpu_count] - [hyperthread_ratio]) / ([cpu_count] / [hyperthread_ratio]))

END AS [total_number_of_cores]

,[cpu_count] AS [number_of_virtual_cpus]

,(

SELECT [c_val]

FROM @xp_msver

WHERE [c_name] = 'Platform'

) AS [cpu_category]

FROM [sys].[dm_os_sys_info]

)

SELECT [number_of_physical_cpus]

,[number_of_cores_per_cpu]

,[total_number_of_cores]

,[number_of_virtual_cpus]

,LTRIM(RIGHT([cpu_category], CHARINDEX('x', [cpu_category]) - 1)) AS [cpu_category]

FROM [ProcessorInfo]

 

Yukarıdaki script ile fiziksel core sayısı, cpu başına düşen core sayısına, toplam core sayısına, sanal core sayısına ve kategori sayısına ulaşabiliriz.

SQL Server’ın ve Diğer Process’lerin güncel olarak ne kadar CPU kullandığına bakmak istersek;

 

set nocount on declare @ts_now2 bigint

 
select @ts_now2 = cpu_ticks /( cpu_ticks / ms_ticks ) /*cpu_ticks / convert(float, cpu_ticks_in_ms)*/ from sys.dm_os_sys_info

select top 1 record_id,dateadd(ms, -1 * (@ts_now2 - [timestamp]), GetDate()) as EventTime,

SQLProcessUtilization,SystemIdle,100 - SystemIdle - SQLProcessUtilization as OtherProcessUtilization

from (select record.value('(./Record/@id)[1]', 'int') as record_id,

record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') as SystemIdle,

record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') as SQLProcessUtilization,

timestamp from (select timestamp, convert(xml, record) as record

from sys.dm_os_ring_buffers

where ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' and record like '%<SystemHealth>%') as x

) as y order by record_id desc
 

Bu süreci saat saat izlemek istersek eğer;

DECLARE @ms_ticks_now BIGINT

SELECT @ms_ticks_now = ms_ticks

FROM sys.dm_os_sys_info;

SELECT TOP 100 record_id

,dateadd(ms, - 1 * (@ms_ticks_now - [timestamp]), GetDate()) AS EventTime

,[SQLProcess (%)]

,SystemIdle

,100 - SystemIdle - [SQLProcess (%)] AS [OtherProcess (%)]

FROM (

SELECT record.value('(./Record/@id)[1]', 'int') AS record_id

,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle

,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [SQLProcess (%)]

,[timestamp]

FROM (

SELECT [timestamp]

,convert(XML, record) AS record

FROM sys.dm_os_ring_buffers

WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'

AND record LIKE '%<SystemHealth>%'

) AS x

) AS y

ORDER BY record_id DESC

Görsel – 5

 

 

Benzer Yazılar

SQL Server DMV ve DMF – 3

SQL Server 1 dakika önce

DMV ve DMF serimizin 3. Serisinde sql server executionları arka planda çalışması sonucunda dataları performans anlamında nelere bakabileceğimizi ve bu parametreleri nasıl anlamlandırmamız gerektiğine bakacağız. Özellikle IO ve Memory dar boğazı yaşadığımız zamanlarda arka planda koşan sorgular büyük önem arz etmektedir. Bir önceki makalede kullandığımız DMV ve DMF’lerin detaylandırılmış ve bize hangi sonuçlarını verdiğini bu yazıda öğrenmiş olacağız. Özellikle Expensive Query olarak adlandırdığımız maliyetli sorguları kimi zaman sorun anında bulmak büyük sorunlar teşkil edebilmektedir. Sorunu doğru adreslediğimiz zaman çözüm noktasında ilerleme kaydetmiş oluyoruz. Şimdi hep birlikte performs dar boğazı yaratan sorguları nasıl bulabilirim konusunda bakalım. select top 50 coalesce (db_name(st.dbid), db_name(convert (int, pa.value)), ‘Empty’) as DBName, qs.last_execution_time as LastExecutionTime, SUBSTRING(st.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END – qs.statement_start_offset)/2) + 1) AS StatementText, st.text as ProcedureTextOrBatchText, qs.execution_count as ExecutionCount, (qs.total_worker_time/1000) as CPUTimeTotal, ((qs.total_worker_time/1000)/qs.execution_count) as CPUTimeAvg, (qs.total_elapsed_time/1000) as DurationTimeTotal, ((qs.total_elapsed_time/1000)/qs.execution_count) as DurationTimeAvg, qs.total_physical_reads as PhysicalReadsTotal, (qs.total_physical_reads/qs.execution_count) as PhysicalReadsAvg, […]

Sql Server Database Mirroring Kurulumu

SQL Server 4 gün önce

 İçindekiler2. ÖRNEK Bu makalede Sql Server Database Mirroring kavramını ele alacağız. Uygulamalı olarak işlemlere başlamadan önce database mirroring kavramından bahsedelim. Sql server sunucusunda bulunan bir database’in anlık olarak başka bir sunucuya yazılma işlemidir. Bu işlem database bazlı yapılmaktadır. Bu kopyalama işlemi birden fazla sunucuya aynı anda yapılmaktadır. Mirroring yapılan veritabanımız iki sunucuda aynı büyüklükte ve yapıda tutulmaktadır. Primary olan sunucumuzun başına bir iş geldiğinde veritabanı otomatik veya manuel bir şekilde ikinci sunucuya devri olmaktadır. Ana sunucunun başına herhangi bir sıkıntı geldiğinde Witness sunucu vasıtasıyla yedek sunucu devreye giriyor. Bu işlem failover cluster yapısıyla benzer bir özellik taşır. Arada witness bağlantısı olmadığında da makinalar doğrudan birbirleriyle haberleşiyor. Burada ise failover işlemi otomatik olarak yapılmaz. Herhangi bir sorun anında manuel bir şekilde yapılmaktadır. Aşağıdaki resimde görüldüğü gibi arada herhangi bir bağlantımız yok.   Mirroring durmuşsa, yeniden başlatılmadan önce primary veritabanındaki bütün transaction log backup’lar secondary sunucuya with no recovery ile restore edilmelidir. […]

Partition Tabloya Yeni Bir Function ve Scheme Ekleme

SQL Server 4 gün önce

Bazen partition yapılmış bir tabloya partition yapısını bozulmaması için yeni bir file group eklenme gereği duyulabilir. Bunun için elimizde bulunan partition scheme ve partition function yapısının düzenlenmesi gerekmektedir. Bir veritabanı altındaki partition yapılmış tabloyu aşağıdaki komut ile görebiliriz. use [PartSamp] SELECT OBJECT_NAME(si.object_id) AS object_name ,pf.NAME AS pf_name ,ps.NAME AS partition_scheme_name ,p.partition_number ,ds.NAME AS partition_filegroup ,rv.value AS range_value ,( CASE pf.boundary_value_on_right WHEN 0 THEN ‘RAGE_LEFT’ ELSE ‘RANGE_RIGHT’ END ) AS range_direction ,SUM(CASE WHEN si.index_id IN ( 1 ,0 ) THEN p.rows ELSE 0 END) AS num_rows FROM sys.destination_data_spaces AS dds INNER JOIN sys.data_spaces AS ds ON dds.data_space_id = ds.data_space_id INNER JOIN sys.partition_schemes AS ps ON dds.partition_scheme_id = ps.data_space_id INNER JOIN sys.partition_functions AS pf ON ps.function_id = pf.function_id LEFT JOIN sys.partition_range_values AS rv ON pf.function_id = rv.function_id AND dds.destination_id = CASE pf.boundary_value_on_right WHEN 0 THEN rv.boundary_id ELSE rv.boundary_id + 1 END LEFT JOIN sys.indexes AS si ON dds.partition_scheme_id = si.data_space_id LEFT JOIN […]

0 Yorum

Yorum Yaz

Rastgele