Domanda

Se stai creando una tabella temporanea all'interno di una procedura memorizzata e desideri aggiungervi uno o due indici, per migliorare le prestazioni di eventuali istruzioni aggiuntive effettuate su di essa, qual è l'approccio migliore?Sybase dice Questo:

"la tabella deve contenere dati al momento della creazione dell'indice.Se si crea la tabella temporanea e si crea l'indice su una tabella vuota, Adaptive Server non crea statistiche di colonna come istogrammi e densità.Se inserisci righe di dati dopo aver creato l'indice, l'ottimizzatore avrà statistiche incomplete."

ma recentemente un collega ha affermato che se creo la tabella temporanea e gli indici in una procedura memorizzata diversa da quella che utilizza effettivamente la tabella temporanea, l'ottimizzatore del server adattivo Volere poterli utilizzare.

Nel complesso, non sono un grande fan delle procedure wrapper che aggiungono poco valore, quindi in realtà non ho avuto il tempo di testarle, ma ho pensato di porre la domanda là fuori, per vedere se qualcuno ne avesse altre approcci o consigli?

È stato utile?

Soluzione

Alcuni pensieri:

  • Se la tua tabella temporanea è così grande che devi indicizzarla, esiste un modo migliore per risolvere il problema?
  • Puoi forzarlo a utilizzare l'indice (se sei sicuro che l'indice sia il modo corretto per accedere alla tabella) fornendo un suggerimento per l'ottimizzatore, nella forma:

    SELECT * 
    FROM   #table (index idIndex) 
    WHERE  id = @id
    

Se sei interessato a suggerimenti sulle prestazioni in generale, ho risposto in modo abbastanza approfondito a un paio di altre domande al riguardo qui:

Altri suggerimenti

Qual è il problema con l'aggiunta degli indici dopo aver inserito i dati nella tabella temporanea?

Una cosa di cui devi tenere conto è la visibilità dell'indice ad altre istanze della procedura che potrebbero essere in esecuzione contemporaneamente.

Mi piace aggiungere una guida a questo tipo di tabelle temporanee (e agli indici), per assicurarmi che non ci siano mai conflitti.L'altro vantaggio di questo approccio è che potresti semplicemente trasformare la tabella temporanea in una vera tabella.

Inoltre, assicurati di dover eseguire una query sui dati in queste tabelle temporanee più di una volta durante l'esecuzione della procedura memorizzata, altrimenti il ​​costo della creazione dell'indice supererà il vantaggio per la selezione.

In Sybase se crei una tabella temporanea e poi la usi in una procedura, il piano per la selezione viene creato utilizzando una stima di 100 righe nella tabella.(Il piano viene creato quando la procedura inizia prima che le tabelle vengano popolate.) Ciò può comportare la scansione della tabella temporanea poiché contiene solo "100 righe".La chiamata a un'altra procedura fa sì che Sybase crei il piano per la selezione con il numero effettivo di righe, ciò consente all'ottimizzatore di scegliere un indice migliore da utilizzare.Ho notato miglioramenti significativi utilizzando questo approccio, ma prova sul tuo database poiché a volte non c'è differenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top