2 votes

Concurrence dans SQL Server 2008

Il existe une procédure stockée :

 CREATE PROCEDURE [dbo].[TestProc]
 AS
 BEGIN 
     SET NOCOUNT ON;

     create table #thistable (rid char(32))
     insert into #thistable(rid)
     select A0RID from tblCdbA0 with (nolock)
  END

Lorsque la procédure est exécutée seule, elle prend 400-500 ms, mais lorsque 10 threads exécutent la même procédure en parallèle, le premier thread se termine en 1300 ms, le dernier en 6000 ms et la moyenne est de 4800 ms. Comme vous pouvez le constater, il n'y a pas de verrouillage où les threads attendent que les autres terminent leur exécution. De plus, le processeur du serveur est chargé à moins de 100 %, c'est-à-dire qu'il y a suffisamment de ressources pour les exécuter en même temps. Comment cela est-il possible ?

EDIT : J'ai trouvé un bon article sur les inserts concurrents : Résolution de la contestation PAGELATCH dans les charges de travail INSERT hautement concurrentes

2voto

KM. Points 51800

Pourquoi sélectionner la même table 8 fois, il suffit de dupliquer les lignes une fois que vous les avez obtenues la première fois, essayez ceci :

CREATE PROCEDURE [dbo].[TestProc]
AS
SET NOCOUNT ON;

create table #thistable (rid char(32))

;WITH AllNumbers AS
(
    SELECT 1 AS Number
    UNION ALL
    SELECT Number+1
        FROM AllNumbers
        WHERE Number<8
)
insert into #thistable
        (rid)
    select A0RID 
        from tblCdbA0               t with (nolock)
        INNER JOIN AllNumbers       a ON 1=1

RETURN 0
GO

si vous le faites avec les UNIONs, vous avez 8 scans de table par thread, et cela s'additionne et affecte les performances.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X