Comment pouvez-vous utiliser IIf dans Transact-SQL?

bonjour

Une nouvelle fonction logiques a était introduits, à partir de SQLServer2012 C’est la Fonction   « IIF » qui peuvent prochainement remplacer la fonction case when then 

Syntaxe  :IIF (boolean_expression, true_value, valeur_faux)  Le premier paramètre est l’instruction conditionnelle. Le deuxième paramètre est la valeur de retour si la condition est remplie. . Le troisième paramètre est la valeur retourné

Examples:

declare @a int ,@b int 
set @a=10
set @b=20
select 
case 
when @a<@b then 'true'
else 'false'
end as test 
GO
declare @a int ,@b int 
set @a=10
set @b=20
SELECT IIF(@a<@b,'true','false') as test

Gérer le parallélisme sur SQL Server

bonjour

Ce billet évoque le parallélisme, et tout particulièrement le type d’attente CXPACKET

Détection d’un CXPACKET

La meilleure façon de détecter ce type d’attente est d’utiliser la DMV sys.dm_os_wait_stats :

parralélisme

Comment résoudre les problèmes d’attentes CXPACKET ?

CXPACKET élevé => parallélisme => passer le a 1

Note : La valeur 0 signifie que le serveur détermine le degré maximal de parallélisme à utiliser

Sur une machine multiprocesseur il est normal d’avoir du CXPACKET. mais Lorsque ça dépasse le 80% des attentes et que ça peut être corrélé avec une charge CPU importante, alors oui il faut regarder les requêtes qui parallélisent.

Il faut bien se souvenir que la raison pour laquelle l’optimiseur décide de compiler un plan parallèle, c’est d’abord le coût. Donc il faut en premier s’attaquer à cette question, pourquoi les requêtes coûtent si cher ? (manque d’index ,index trop fragmenté,statistique obsolète …)

Ci joint une imprime écran sur quel colonne il faut pointer pour changer la valeur max degré du parallélisme

Sans titre                                         en mode transact

sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
sp_configure 'max degree of parallelism', 8;
GO
RECONFIGURE WITH OVERRIDE;
GO

noter bien que certaines personnes recommandent une valeur de « max degree of parallelism » égale au nombre de processeurs divisés par 2 Exemple pour 16 processeurs, maxdop = 8 il faut ajuster cette valeur en faisant des tests de performance

sur le plan d’exécution du requête tu aurai ce type d’affichage (deux flèches avec un couleur jaune)

Sans titre3                                           il est aussi possible de fixer le MAXDOP au niveau de la requête

SELECT ...
FROM...
...
OPTION (MAXDOP 1)

Pour trouver les requêtes ayant fait du parallélisme, utilisez cette requête :

SELECT TOP 10 text AS SQL_REQUEST, query_plan AS EXECUTION_PLAN
FROM   sys.dm_exec_query_stats AS s WITH(NOLOCK)
       CROSS APPLY sys.dm_exec_query_plan(s.plan_handle) p
       CROSS APPLY sys.dm_exec_sql_text(s.plan_handle) AS q
WHERE  p.query_plan.value('declare namespace p="http://schemas.microsoft.com/sqlserver/2004/07/showplan";
                           max(//p:RelOp/@Parallel)', 'float') > 0
ORDER BY total_worker_time/execution_count DESC
OPTION (MAXDOP 1);

Dans tous les cas, avant de désactiver définitivement le parallélisme, un audit général est recommandé

Pour plus  information, David Baffaleuf a fait récemment une session très complète sur le parallélisme dans SQL Server

https://www.youtube.com/watch?v=6ywngaqLjsg

cordialement

Comment détecter les Interblocages ?

Bonjour

Dans ce billet on va définir le phénomène d’interblocage ainsi que la solution proposé pour résoudre le problème dé qu’il apparaît

l’interblocage se produit lorsque deux ou plusieurs tâches se bloquent mutuellement parce que chacune d’elles détient un verrou sur une ressource que les autres tâches essaient de verrouiller

il  se présente lorsque plusieurs processus (transactions sql) se bloquent de façon à ce qu’aucun de ces processus ne peut se débloquer quelque soit la durée d’attente

image

Avec SQL Server, quand plusieurs processus se trouvent en situation de « deadlock« , au bout d’un certain temps (« timeout »), SQL Server décide de  tuer un (généralement, celui qui affecte le moins d’enregistrements, afin de minimiser le nombre de « rollbacks »)

Comment identifier les processus  responsable du deadlock ?

1

SELECT session_id,start_time,wait_time,status,wait_type,command,blocking_session_id,transaction_id 
FROM sys.dm_exec_requests 
WHERE blocking_session_id <> 0 

2)

exec sp_who2

3)

SELECT spid,open_tran,blocked 
from sys.sysprocesses WHERE blocked <> 0

4)

DECLARE @xml xml 
SELECT @xml = CAST(st.target_data as xml) 
FROM sys.dm_xe_session_targets st 
INNER JOIN sys.dm_xe_sessions s on s.address = st.event_session_address 
INNER JOIN sys.server_event_sessions es on s.name = es.name 
WHERE s.name = 'system_health' AND st.target_name = 'ring_buffer' 
-- and convert(varchar(8),s.create_time,112) = '20120422' -- cibler une date particulière 
SELECT @xml.query('/RingBufferTarget/event [@name="xml_deadlock_report"]')

 

sans-titre

Detection l’interblocage avec  Profiler

Sans titre

comment Tuer le processus bloquant?

utiliser l’instruction transact KILL  http://technet.microsoft.com/fr-fr/l…/ms173730.aspx

Quelques Conseils pour la réduction des risques de deadlocks

  1. Assurez-vous que vos transactions soient suffisamment courtes
  2. Bien considerer le niveau d’isolation necessaire
  3. Utiliser un pool de connexion
  4. Acceder aux tables dans le meme ordre dans toutes les procedures
  5. Si le parallélisme génère trop de threads en attente conduisant ainsi à des deadlocks, envisagez un passage du MAXDOP à 1.
  6. Considerer la pagination des donnees
  7. ……Et la liste est longue….(https://technet.microsoft.com/en-us/library/ms191242(v=sql.105).aspx)                                                                                                                                                                                                                                                                                                                                       cordialement