Aumento della RAM, prestazioni peggiori


9

Impostare:

  • Windows Server 2008 R2
  • SQL Server 2008 R2 SP1
  • 240 GB di RAM
  • TempDB è un file di dati 8x16 GB senza crescita automatica (128 GB in totale)
  • Server fisico / autonomo

Questo server viene utilizzato per l'elaborazione ETL. Abbiamo appena installato più RAM in questo server per un totale di 240 GB di RAM. I servizi di SQL Server sono le uniche cose reali in esecuzione.

La memoria si presenta bene nel BIOS, OpenManage e Windows.

Se configuro SQL Server per utilizzare una memoria Min / Max di 70 / 100GB, non abbiamo problemi. Tuttavia, una volta aumentato a 120/150 GB, quando eseguo uno dei nostri processi ETL viene visualizzato il seguente errore:

Impossibile allocare spazio per l'oggetto "<oggetto di sistema temporaneo: 422234507706368>" nel database "tempdb" perché il filegroup "PRIMARY" è pieno. Crea spazio su disco eliminando i file non necessari, rilasciando oggetti nel filegroup, aggiungendo altri file al filegroup o impostando la crescita automatica per i file esistenti nel filegroup. (Messaggio 1105, stato 2, procedura sconosciuta, riga 1)

Non abbiamo mai riscontrato questo problema prima di modificare la configurazione della memoria. Dopo la riconfigurazione ai 70 / 100GB originali, non viene visualizzato questo errore.

Cose che ho provato:

  1. Impostare i file di dati TempDB su crescita automatica. Ciò comporta semplicemente la crescita automatica dei file fino al raggiungimento della capacità del disco e quindi non riesce.
  2. Aggiungi altri file di dati TempDB. Stesso errore mostrato.
  3. Aumenta la dimensione TempDB a 8x32 GB (256 GB in totale)

Sono in perdita su ciò che potrebbe causare questo problema.


2
La tua memoria è bilanciata tra i nodi NUMA? E i tuoi processori? Il registro di SQL Server mostra quante CPU sono in uso durante l'avvio?
Aaron Bertrand

1
Cosa stai usando per i processi ETL? SSIS o qualche strumento simile? Se si tratta di uno strumento esterno a SQL Server, lo si esegue sullo stesso server dell'istanza di SQL Server?
Mike Fal,

1
Questo è un buon punto @Mike, se il processo ETL non è in grado di catturare abbastanza memoria per fare la sua cosa, perché SQL Server sta usando troppo, quindi potrebbe dover spingere il lavoro su tempdb.
Aaron Bertrand

1
Ecco un buon inizio per monitorare l'utilizzo di tempdb: msdn.microsoft.com/en-us/library/ms176029(v=SQL.105).aspx . Questo dovrebbe darti un'idea di ciò che sta accadendo.
Thomas Stringer,

2
Hai fatto qualche analisi di ciò che è effettivamente in esecuzione quando il tuo TempDB si sta effettivamente espandendo? Un semplice sp_who2 / sp_whoisactive? Mi sembra che tu abbia alcune transazioni a lungo termine che potrebbero essere gestite meglio, ma difficili da dire. Personalmente, non mi collegherei alla modifica della memoria, ma prima guardo il codice e vedo se funziona correttamente.
Mike Fal,

Risposte:


3

Grazie a tutti per il vostro aiuto.

Dopo aver completato alcuni piani di esecuzione, si scopre che c'è un JOIN che viene elaborato in modo diverso in base alla quantità di RAM disponibile. Con meno RAM lo valuta con un hash; con più RAM, utilizza una serie di Merge Joins.

Quindi fondamentalmente si è trattato di T-SQL scritto male, che sto attualmente refactoring.


4
È abbastanza intuitivo perché un join hash richiede una concessione di memoria, mentre l'unione no. Esiste un'operazione di ordinamento aggiuntiva per supportare l'unione unione?
Martin Smith,

1

Questa non è una risposta alla domanda, solo un po 'di codice che non volevo pubblicare in un commento. Per visualizzare il saldo dei programmatori e della memoria tra i nodi NUMA (e anche per vedere se alcuni nodi non sono visibili online):

SELECT 
  parent_node_id, 
  [status],
  AVG(current_tasks_count) AS avg_tasks_count, 
  AVG(load_factor) AS avg_load_factor,
  scheduler_count = COUNT(*)
FROM sys.dm_os_schedulers
GROUP BY parent_node_id, [status];

SELECT 
  memory_node_id, 
  name, 
  SUM(single_pages_kb + multi_pages_kb) AS memory_kb
FROM sys.dm_os_memory_clerks
GROUP BY memory_node_id, name;

(In SQL Server 2012, l'ultimo SUMdovrebbe essere SUM(pages_kb)dato che non ci sono più allocatori separati per pagina singola e multi pagina.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.