2010-02-12 6 views
6

Sto avendo un problema di prestazioni molto particolare al lavoro!Come migliorare le prestazioni nella tabella di SQL Server con i campi immagine?

Nel sistema che stiamo usando c'è una tabella che contiene informazioni sul processo attuale del flusso di lavoro. Uno dei campi contiene un foglio di calcolo che contiene metadati sul processo (non chiedermi perché !! e NO NON POSSO CAMBIARE !!)

Il problema è che questo foglio di calcolo è memorizzato in un campo IMMAGINE in un SQL Server 2005 (all'interno di un set di database con compatibilità SQL 2000).

Questa tabella è attualmente 22K + linee e anche una semplice query come questa:

SELECT TOP 100 * 
    FROM OFFENDING_TABLE 

richiede 30 secondi per recuperare i dati in Query Analyzer.

Sto pensando di aggiornare la compatibilità con SQL 2005 (una volta che mi è stato comunicato che l'app può gestirlo).

La seconda cosa che sto pensando è di modificare il tipo di dati della colonna su varbinary(max) ma non so se questo influirà sull'applicazione.

Un'altra cosa che sto considerando è quello di utilizzare sp_tableoption per impostare il large value types out of row-1 come è attualmente 0, ma non ho informazioni se questa operazione migliorerà le prestazioni.

Qualcuno sa come migliorare le prestazioni in tale scenario?


A cura di chiarire

Il mio problema è che non ho alcun controllo su ciò che l'applicazione chiede di SQL Server, e ho fatto qualche riflessione su di essa (l'applicazione è un sito web .NET 1.1) e usa il campo incriminato per alcune cose interne che non ho idea di cosa sia.

Ho bisogno di migliorare le prestazioni generali di questa tabella.

risposta

4

mi consiglia di guardare in salute disposizione della tabella incriminata:

select * from sys.dm_db_index_physical_stats(
     db_id(), object_id('offending_table'), null, null, detailed); 

cose troppo cercare sono avg_fragmentation_in_percent, PAGE_COUNT, avg_page_space_used_in_percent, record_count e ghost_record_count. Cues come l'alta frammentazione, o di un numero elevato di record fantasma, o una percentuale pagina di basso utilizzato indicano problemi e le cose possono essere migliorate un po 'solo ricostruendo l'indice da zero (cioè il tavolo.):

ALTER INDEX ALL ON offending_table REBUILD; 

Lo sto dicendo considerando che non è possibile modificare il tavolo e l'app. Se sei in grado di modificare il tavolo e l'app, il consiglio che hai già ricevuto è un buon consiglio (non usare '*', non selezionare w/oa condition, usare il più recente varbinary (max) tipo etc etc) .

Vorrei anche esaminare la durata media della pagina nei contatori delle prestazioni per capire se il sistema è affamato di memoria. Dalla tua descrizione dei sintomi, il sistema sembra legato all'IO, il che mi porta a pensare che ci sia un piccolo caching delle pagine in corso, e più RAM potrebbe aiutare, così come un sottosistema IO più veloce. Su un sistema SQL 2008 suggerisco anche di attivare la compressione della pagina, ma nel 2005 non è possibile.
E, per sicurezza, assicurati che le query non siano bloccate dalla contesa dall'app stessa, es. la query non spende il 90% dei 30 secondi in attesa di un blocco riga. Guardare a sys.dm_exec_requests mentre la query è in esecuzione, vedere wait_time, wait_type e wait_resource. PAGEIOLATCH_XX? O è una serratura? Inoltre, come è il sys.dm_os_wait_stats sul tuo server, quali sono i motivi di attesa migliori?

1

Una risposta breve è di fare solo SELEZIONA contro più righe quando i campi restituiti non includono il campo dell'immagine incriminato, cioè nessun SELEZIONA *. Se si desidera il valore del campo dell'immagine, recuperarlo caso per caso.

0

L'impostazione dei tipi di valori di grandi dimensioni dell'opzione di riga dovrebbe sicuramente aiutare le prestazioni. La dimensione della riga sarà notevolmente ridotta, SQL Server può eseguire molte letture fisiche per passare attraverso la tabella.

2

Prima di tutto - non fare mai uno SELECT * nel codice di produzione - segnalazione o meno.

Avete tre scelte fondamentali:

  • mossa che blob campo fuori in una tabella separata, se non è sempre necessaria; probabilmente non pratico in quanto si parla non è possibile modificare lo schema

  • essere più attenti con i tuoi SELECT dichiarazioni di selezionare solo i campi che si ha realmente bisogno - e omettere il campo blob

  • vedere se è possibile limitare la query includere una clausola WHERE e trovare un modo per ottimizzare il piano di query ad es. l'aggiunta di un indice adatto al tavolo (se è possibile)

Non c'è nessuna magia "rendere questo più veloce" switch - ma è possibile ottimizzare la query o ottimizzare il layout della tabella. Entrambi gli aiuti. Se non puoi modificare nulla, né il layout della tabella, né aggiungere un indice, né cambiare le query, avrai difficoltà a ottimizzare qualsiasi cosa, temo ....

Basta cambiare il campo a VARBINARY (MAX) non cambierà nulla - nessun miglioramento delle prestazioni è da aspettarsi solo cambiando il tipo di dati.

Problemi correlati