ou plutot... qui n'aboutit plus !
Bonjour à tous,
Je remarque un comportement étrange chez l'un de nos clients, et je ne parviens pas à le régler, ni même à l'expliquer.
Un jour il nous appelle pour nous signaler des blocages de l'appli. Après vérif du serveur, il y avait un nombre impressionants de verrou sur la base. Bref, j'identifie le verrou "source", le kill et tout repart comme en 14.
J'ai tout de même prit le soin de récupérer la requête. Sans surprise, lorsque je l'exécute dans ssms, je reverrouille tout le monde...
La requête en question, faisait appel à une fonction table...j'explore la fonction qui n'a rien de bien méchant...mais soit ! Je fais une modif et transforme la fonction table, en fonction inline (ce qui m'oblige de faire un drop function avant)
Et hop ça roule...
Afin de retravailler ma fonction correctement je remets la fonction initiale ==> et ça fonctionne également
Nous sommes donc revenu à la fonction de départ, et tout fonctionne (le DROP, CREATE a donc un impact)
Je confirme cette "solution" lorsqu'il me rappelle 2 mois plus tard pour le même problème, je DROP, et CREATE la fonction table : et c'est reparti.
Il doit donc y avoir un fonctionnement de SQLServer (stockage d'info, de stats, ou je ne sais quoi), qui est réinitialisé quand on DROP un objet.
J'ai essayé de reproduire les objet de manière plus simple pour expliquer :
La fonction ressemble à cela :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| Create function Fonction_Table_1(@Param1 int)
Returns @Tab Table(Champ_retour1 int)
AS
BEGIN
if @Param1 = 1
insert @Tab(Champ1)
SELECT A
FROM Table1
WHERE [Conditions]
else if @Param1 = 2
insert @Tab(Champ1)
SELECT A
FROM Table1
WHERE [Autres_Conditions]
else if @Param1 = 3
insert @Tab(Champ1)
SELECT A
FROM Table1 t1
WHERE [Autres_Conditions]
AND NOT EXISTS(SELECT 1 FROM Table2 t2 WHERE t2.champ1 = t1.champ12)
END |
La requete qui créé les verrous :
1 2 3 4 5
| INSERT INTO Table_Temp(Champ1, Champ2, Champ3, Champ4)
SELECT distinct 2, 1500, Champ_retour1, 0
FROM Table1 t1
INNER JOIN Fonction_Table_1 ft1 ON ft1.Champ_retour1 = t1.A
AND [conditions_diverses] |
=> Le simple fait de faire
Select Champ_retour1 FROM Fonctoin_Table_1(3)
génère un problème identique.... Preuve que le soucis vient bien de la fonction table.
Pouvez-vous m'expliquer quel phénomène pourrait expliquer ce comportement ?
Et accessoirement, comment le régler ?
Pour info :
un CHECKDB et une réindexation complète de la base de données est effectué chaque jour sur la base
nous sommes en mode de récupération "complète"
SqlServer ne met pas forcément le serveur "à genoux" à ce moment là
La tempdb grossit assez peu chez ce client (mais j'ai l'impression que le problème ce situerais dans cette dernière ?)
Je reste à votre dispo si vous manquez d'info.
S'il le faut je mettrai le cas réel...
Merci d'avance pour votre aide
Amicalement,
Juvamine
Partager