294 messaggi dal 14 novembre 2001
Salve, ho due server su cui sto facendo delle prove sulle loro performance.
Su un server (hw vecchio di 6 anni, 2 processori Xeon 2.0GHz, con 512 Mega di Ram) ho Windows 2000 Server + MS SQL Server 2000.
Sul secondo server (1 Processore Quad 6600, 3 Giga di Ram), ho installato Windows Server 2008 + MS SQL Server 2008 (le versioni di prova a 64 bit).

Ho installato (facendo copia e incolla) le medesime pagine aspx ed il medesimo database, dopo di che ho iniziato a fare dei test x valutare le differenze di velocità. Ebbene il server più nuovo mi ha dato delle ottime risposte (tempi di attesa sempre nettamente inferiori) in tutte le procedure che ho lanciato, TRANNE IN UNA!! Come è possibile ciò?

Vi riporto la query in questione, precisando che la tabella FlussiFornitura è una vista (in entrambe i database ovviamente, essendo l'uno la copia dell'altro):

SELECT AnagraficaAgenti.ID_Agente,
COUNT(DISTINCT AnagraficaRivendite.ID_AnagraficaRivendita) AS ConRiordino
FROM AnagraficaAgenti INNER JOIN
AnagraficaRivendite ON AnagraficaAgenti.ID_Agente = AnagraficaRivendite.ID_Agente INNER JOIN
Flussi_Rivendite ON AnagraficaRivendite.ID_AnagraficaRivendita = Flussi_Rivendite.ID_AnagraficaRivendita
WHERE (AnagraficaRivendite.ID_AnagraficaRivendita IN
(SELECT Flussi_Rivendite.ID_AnagraficaRivendita FROM Flussi_Rivendite WHERE (Flussi_Rivendite.DataFlussoMese >= 200701) AND (Flussi_Rivendite.DataFlussoMese <= 200801) AND (Flussi_Rivendite.CodiceProdottoAAMS = 1277)))
AND AnagraficaRivendite.ID_AnagraficaRivendita NOT IN
(SELECT Flussi_Rivendite.ID_AnagraficaRivendita FROM Flussi_Rivendite WHERE (Flussi_Rivendite.DataFlussoMese >= 200601) AND (Flussi_Rivendite.DataFlussoMese <= 200712) AND (Flussi_Rivendite.CodiceProdottoAAMS = 1277))
AND (AnagraficaRivendite.ID_AnagraficaRivendita IN
(SELECT FlussiFornitura.ID_AnagraficaRivendita FROM FlussiFornitura WHERE (FlussiFornitura.DataFlusso >= 20080101) AND (FlussiFornitura.DataFlusso <= 20080430))) AND
(AnagraficaRivendite.ID_AnagraficaRivendita NOT IN
(SELECT FlussiFornitura.ID_AnagraficaRivendita FROM FlussiFornitura WHERE (FlussiFornitura.DataFlusso >= 20070901) AND (FlussiFornitura.DataFlusso <= 20071231))) AND
(AnagraficaRivendite.ID_AnagraficaRivendita IN
(SELECT Flussi_Rivendite.ID_AnagraficaRivendita FROM Flussi_Rivendite WHERE (Flussi_Rivendite.DataFlussoMese >= 200701) AND (Flussi_Rivendite.DataFlussoMese <= 200809) AND (Flussi_Rivendite.CodiceProdottoAAMS = 1277) GROUP BY Flussi_Rivendite.ID_AnagraficaRivendita HAVING (COUNT(Flussi_Rivendite.ID_AnagraficaRivendita) > 1)))
GROUP BY AnagraficaAgenti.ID_Agente

Ho anche usato il Profiler per vedere i carichi di lavoro, e nel caso del server vecchio mi riporta i seguenti dati:
CPU 3390
READS 34253
DURATION 8123

Il server nuovo invece:
CPU 8062
READS 25156
DURATION 10141

Come è possibile che in quest'unica procedura è più lento il nuovo server? Questa Query che ho riportato ha qualcosa di particolare che SQL Server 2008 non "digerisce" bene oppure....???

Saluti ;)

Campo Testaccio, c'hai tanta gloria...
47 messaggi dal 09 settembre 2008
Molto strano...
Per caso, alcuni dei campi della select hanno qualche codifica particolare ?
294 messaggi dal 14 novembre 2001
no... nessuna codifica particolare. I dati in SQL Server 2008 ce li ho messi stoppando il servizio ed incollando i file MDF e LDF dal server vecchio, e poi riavviando il servizio. Ho anche controllato che mi avesse tenuto tutti gli indici.

Campo Testaccio, c'hai tanta gloria...
47 messaggi dal 09 settembre 2008
Hai provato a sostituire il JOIN con una clausola WHERE sulle chiavi?
Non é una soluzione elegante, ma serve ad escludere altri punti...
294 messaggi dal 14 novembre 2001
Io veramente più che intervenire sul codice volevo capire perché, a parità di codice e di dati, SQL Server 2008 (o più in generale il nuovo Server) in quell'unica occasione rendeva meno di SQL Server 2000

Campo Testaccio, c'hai tanta gloria...
47 messaggi dal 09 settembre 2008
Hai perfettamente ragione, pensavo che la tua priorità fosse risolvere il problema.

Ti rilascio a questo articolo ben fatto per comprendere i concetti di HyperThreading in Sql Server:

http://technet.microsoft.com/it-it/magazine/cc137784.aspx/
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
maurodii wrote:
no... nessuna codifica particolare. I dati in SQL Server 2008 ce li ho messi stoppando il servizio ed incollando i file MDF e LDF dal server vecchio, e poi riavviando il servizio. Ho anche controllato che mi avesse tenuto tutti gli indici.

prova ad aggiornare le statistiche di tutte le tabelle WITH FULLSCAN.. saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
294 messaggi dal 14 novembre 2001
Ho aggiornato le statistiche di tutte le tabelle con WITH FULLSCAN come tu mi hai detto, ho migliorato solo di un secondo :(

Allora ho usato il profiler su SQL Server 2008 il quale mi ha suggerito dei nuovi indici, che ho applicato sia al catalogo di SQL Server 2008 sia a quello del vecchio SQL Server 2000. Il risultato è stato che sul server vecchio la prestazione è rimasta identica mentre sul nuovo ora raggiungo quasi i risultati del server vecchio...

Comunque rimane qualcosa di strano, penso mi sfugga qualcosa perché con altre query eseguite su quella tabella gigantesca (che è Flussi_Rivendite, 1.000.000 di record circa) sul server nuovo ho dei risultati enormemente migliori.
Forse l'uso di COUNT crea problemi a SQL Server 2008?

Campo Testaccio, c'hai tanta gloria...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.