Domanda

Di recente ho ereditato una base di codice con una grande quantità di procedure memorizzate. Il sistema che stanno supportando sta incontrando numerosi problemi di prestazione in cui sto cercando.

Alcune procedure memorizzate hanno un modello come questo:

  1. Crea tabella temp
  2. Crea una query SQL dinamica per inserire un sacco di record, ad esempio

    DECLARE @sql VARCHAR(MAX)
    SET @sql = 'INSERT INTO @tempTable
    SELECT SomeColumn, SomeColumn2, SomeColumn3, etc FROM MyTable'
    
    IF @someParam = [SomeValue]
        SET @sql = @sql + 'WHERE SomeColumn = [SomeValue]';
    
    IF @someOtherParam = [SomeOtherValue]
        SET @sql = @sql + 'WHERE SomeOtherColum = [SomeOtherValue]';
    
  3. Eseguire questo SQL dinamico

    EXEC(@sql);
    
  4. Selezionare dalla tabella Temp e portare un sacco di informazioni aggiuntive per tornare al client.

    SELECT
    
       ...
    
    FROM
    
       @tempTable
       INNER JOIN ...
    

I miei pensieri immediati sono:

  • C'è SQL dinamico, quindi nessun piano di cache, che significa piani generati ogni volta.
  • C'è un INSERT SELECT Modello, quindi è più probabile che il blocco della tabella sia un problema.

In questo modo ho riscritto alcune delle procedure memorizzate:

    SELECT 

       ...

    FROM

        MyTable 
        INNER JOIN ...

    WHERE

    (
        @someParam != SomeValue
        OR
        SomeColumn = SomeValue
    )
    AND
    (
        @someOtherParam != SomeOtherValue
        OR
        SomeOtherColumn = SomeOtherValue
    )        

Dal confronto dei piani di esecuzione e delle statistiche dei clienti in SQL Management Studio, non ho accelerato le procedure memorizzate, quindi sono preoccupato di suggerire riscritti all'ingrosso di tutte le procedure memorizzate.

Sto cercando di creare un po 'di profilazione di uno scenario di clienti dal vivo, ma non sono stato ancora in grado di dimostrare i miei pensieri.

Qualcuno può offrire qualche conferma della teoria dietro i miei pensieri o qualche modo migliore per dimostrare i miei sospetti?

Il problema è che ho letto che SQL dinamico non è sempre una custodia chiusa, cioè dipende da come viene utilizzato. La mia comprensione del blocco cade anche al fatto che da nessuna parte posso ottenere una conferma al 100% di come questo tipo di INSERT SELECT bloccerà i tavoli.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top