dimanche 23 mai 2010

SQL Server Utility Script

-- Some UCP Related queries
-- 24 Hours of PASS
-- Glenn Berry
-- May 19, 2010
-- http://glennberrysqlperformance.spaces.live.com/
-- Twitter: GlennAlanBerry


-- Hardware information from SQL Server 2008 R2
SELECT cpu_count AS [Logical CPU Count], hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count],
physical_memory_in_bytes/1048576 AS [Physical Memory (MB)],
affinity_type_desc, time_source_desc,
process_user_time_ms,
CAST (CAST(process_user_time_ms AS FLOAT) /
(CAST(process_kernel_time_ms AS FLOAT) + CAST (process_user_time_ms AS FLOAT))
* 100 AS DECIMAL(9,2)) AS [% SQL User Time],
process_kernel_time_ms,
CAST (CAST(process_kernel_time_ms AS FLOAT) /
(CAST(process_kernel_time_ms AS FLOAT) + CAST (process_user_time_ms AS FLOAT))
* 100 AS DECIMAL(9,2)) AS [% SQL Kernel Time],
sqlserver_start_time
FROM sys.dm_os_sys_info;


-- Get CPU Utilization History for last 30 minutes (SQL 2008 and 2008 R2)
DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks)FROM sys.dm_os_sys_info);

SELECT TOP(30) SQLProcessUtilization AS [SQL Server Process CPU Utilization],
SystemIdle AS [System Idle Process],
100 - SystemIdle - SQLProcessUtilization AS [Other Process CPU Utilization],
DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [Event Time]
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 '%%') AS x
) AS y
ORDER BY record_id DESC;



-- Look at aggregated managed instance health (msdb)
SELECT mi_count, mi_healthy_count, mi_unhealthy_count, mi_over_utilize_count, mi_under_utilize_count,
mi_on_over_utilized_computer_count, mi_on_under_utilized_computer_count,
mi_with_files_on_over_utilized_volume_count, mi_with_files_on_over_utilized_volume_count,
mi_with_over_utilized_file_count, mi_with_over_utilized_file_count,
mi_with_over_utilized_processor_count, mi_with_under_utilized_processor_count
FROM msdb.dbo.sysutility_ucp_aggregated_mi_health;


-- Look at managed instance information (msdb)
SELECT *
FROM msdb.dbo.sysutility_ucp_managed_instances AS mi
LEFT OUTER JOIN msdb.dbo.sysutility_ucp_mi_health AS mih
ON mi.instance_name = mih.mi_name
LEFT OUTER JOIN msdb.dbo.sysutility_ucp_instances AS inst
ON mi.instance_name = inst.Name
LEFT OUTER JOIN msdb.dbo.sysutility_ucp_computers AS comp
ON mi.virtual_server_name = comp.virtual_server_name;


-- Look at hardware info for managed instances (sysutility_mdw)
SELECT TOP(25)virtual_server_name ,physical_server_name,is_clustered_server,
num_processors ,cpu_name,cpu_caption,cpu_architecture,
cpu_max_clock_speed,cpu_clock_speed,l2_cache_size,l3_cache_size,
percent_total_cpu_utilization
FROM sysutility_mdw.sysutility_ucp_core.latest_computers;


-- Look at server level CPU utilization (sysutility_mdw)
SELECT TOP(1000) physical_server_name, processing_time, percent_total_cpu_utilization
FROM sysutility_mdw.sysutility_ucp_core.cpu_utilization
WHERE object_type = 1
ORDER BY processing_time DESC;


-- Look at instance level CPU utilization (sysutility_mdw)
SELECT TOP(1000) server_instance_name, processing_time, percent_total_cpu_utilization
FROM sysutility_mdw.sysutility_ucp_core.cpu_utilization
WHERE object_type = 3
ORDER BY processing_time DESC;


-- Look at most recent instance level CPU utilization (sysutility_mdw)
SELECT TOP(25)server_instance_name, instance_processor_usage, batch_time
FROM sysutility_mdw.sysutility_ucp_staging.latest_instance_cpu_utilization
ORDER BY server_instance_name;


-- Look at hardware information (sysutility_mdw)
SELECT TOP(25) physical_server_name, num_processors, cpu_name, cpu_caption,
cpu_architecture, cpu_max_clock_speed,cpu_clock_speed, l2_cache_size,
l3_cache_size, server_processor_usage, batch_time
FROM sysutility_mdw.sysutility_ucp_staging.latest_computer_cpu_memory_configuration
ORDER BY [Rank];

-- Look at wait types and categories
SELECT category_name, wait_type, ignore
FROM sysutility_mdw.core.wait_types_categorized
ORDER BY category_name;

samedi 22 mai 2010

Déplacer les fichers DATA et LOG d'une Base Utilisateur

/************************************************************************************
-- Description : déplacer des bases de données SQL Server vers un nouvel emplacement à l'aide des fonctions Détacher et Attacher dans SQL Server (2005 - 2008)
-- Etapes :
-- 1. Déterminer le nom et l'emplacement actuels de tous les fichiers utilisés par la base de données (myBD dans notre cas)

-- 2. Détachez la base de données

-- 3. Copier Manuellelment les fichiers de donnees et journal de transaction

-- 4. Rattacher la base de donnees

-- 5. Verifier le changement d emplacement
************************************************************************************/

--1. Déterminer le nom et l'emplacement actuels de tous les fichiers utilisés par la base de données (myBDdans notre cas)
USE myBD
GO
sp_helpfile
GO

--2. Détachez la base de données
USE master
GO
sp_detach_db 'myBD'
GO

--3. Copier Manuellelment les fichiers de donnees et journal de transaction
-- du repertoire actuel vers le repertoire de destination

--4. Rattacher la base de donnees et pointer les fichiers de donnees et journal vers le nouvel emplacement
USE master
GO
sp_attach_db 'myBD','E:\SQL2005DATA\myBD.mdf','E:\SQL2005DATA\myBD_log.ldf'
go

--5. Verifier le changement d'emplacement
USE myBD
GO
sp_helpfile
GO

Identifier la version SQL SERVER à partir de laquelle un backup a été fait

/**************************************************************************************
-- Pour identifier la version SQL à partir de laquelle a été fait un backup
-- Voir la valeur de la colonne DatabaseVersion à partir de la requête ci-dessous
-- DatabaseVersion = 515 ---> SQL Server 7.0
-- DatabaseVersion = 539 ---> SQL Server 2000
-- DatabaseVersion = 611 ou 612 ---> SQL Server 2005
-- DatabaseVersion = 655 ---> SQL Server 2008
**************************************************************************************/

RESTORE HEADERONLY
FROM DISK = N'\BACKUP\mybak.bak'
WITH NOUNLOAD;
GO

Réduire la taille du journal de transaction (fichier Log)

/**************************************************************************************
-- Les étapes :
--> 0. vérifier le mode de récupération si MODE = FULL alors faire les étapes {1.2.3.4.5.} si MODE=SIMPLE alors faire les étapes {1.3.4.5.}
--> 1. Visualiser l espace occupé dans le fichier de log
--> 2. Faire un BACKUP LOG (backup du journal de transaction)
--> 3. Obtenir le nom logique du fichier LOG de la base de donnees MAIN_COURANTE
--> 4. Diminuer la taille du fichier LOG
--> 5. Visualiser l espace libre dans le fichier LOG
**************************************************************************************/

--0. vérifier le mode de récupération
SELECT recovery_model,
recovery_model_desc
FROM sys.databases
WHERE name ='myBD'

--1.Visualiser la taille du fichier log (Log Size) et espace utilisé (Log Spaced %) de la base myBD
DBCC SQLPERF (LOGSPACE)

--2. Faire un BACKUP LOG (backup du journal de transaction)
BACKUP LOG myBD to disk ='\BACKUP\myBD.tn'

--3. Obtenir le nom logique du fichier LOG (myBD_log dans notre exemple)de la base de donnees myBD
USE myBD
EXEC sp_helpfile

--4. Diminuer la taille du fichier LOG (myBD_log dans notre cas) à 10 Mo
DBCC SHRINKFILE(myBD_log,10)

Historique des requêtes exécutées sur SQL SERVER

/************************************************************************************
-- DESCRIPTION : Historique des requêtes
-- SQL SERVER : 2005 - 2008
-- Date : 2010-04-20
************************************************************************************/

--Afficher les 50 dernières requêtes les plus consommatrices de CPU
SELECT TOP 50 total_worker_time/execution_count AS [Avg CPU Time],
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 statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY total_worker_time/execution_count DESC;

--Afficher les 50 dernières requêtes exécutées
SELECT TOP 50 creation_time,
total_worker_time/execution_count AS [Avg CPU Time],
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 statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY creation_time DESC;

--Afficher les 50 requêtes les + fréquemment exécutées
SELECT TOP 50 creation_time,
total_worker_time/execution_count AS [Avg CPU Time],
total_logical_reads,
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 statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY total_logical_reads DESC;