Ho migrato un sito Web e un database di grandi dimensioni da un server più vecchio (Windows 2008 / SQL Server 2008/16 GB RAM / 2 dischi Quad Core / SAS da 2,5 GHz) a un server più recente e molto migliore (Windows 2008 R2 / SQL Server 2012 SP1 / 64 GB RAM / 2 processori Core / 2 dischi SSD da 16 GHz).
Ho rimosso i file di database sul vecchio server, copiati e collegati al nuovo server. È andato tutto molto bene.
Successivamente, sono passato al livello di compatibilità a 110, ho aggiornato le statistiche, ricostruito gli indici.
Con mia grande delusione, ho notato che la maggior parte delle query sql sono molto più lente (2-3-4 volte più lente) sul nuovo server SQL 2012 rispetto al vecchio server SQL 2008.
Ad esempio, su una tabella con circa 700.000 record, sul vecchio server una query sull'indice ha richiesto circa 100 ms. Sul nuovo server, la stessa query richiede circa 350 ms.
Lo stesso accade per tutte le domande.
Gradirei un aiuto qui. Fammi sapere cosa controllare / verificare. Perché trovo molto difficile credere che su un server migliore con un SQL Server più recente, le prestazioni siano peggiori.
Più dettagli:
La memoria è impostata su max.
Ho questa tabella e indice:
CREATE TABLE [dbo].[Answer_Details_23](
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NOT NULL,
[SurveyID] [int] NOT NULL,
[CustomerID] [int] NOT NULL default 0,
[SummaryID] [int] NOT NULL,
[QuestionID] [int] NOT NULL,
[RowID] [int] NOT NULL default 0,
[OptionID] [int] NOT NULL default 0,
[EnteredText] [ntext] NULL,
CONSTRAINT [Answer_Details_23_PK] PRIMARY KEY NONCLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IDX_Answer_Details_23_SummaryID_QuestionID] ON [dbo].[Answer_Details_23]
(
[SummaryID] ASC,
[QuestionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Ho eseguito questa query:
set statistics time on;
select summaryid, count(summaryid) from Answer_Details_23 group by summaryid order by count(summaryid) desc;
set statistics time off;
VECCHIO SERVER - Tempi di esecuzione di SQL Server: tempo CPU = 419 ms, tempo trascorso = 695 ms.
NUOVO SERVER - Tempi di esecuzione di SQL Server: tempo CPU = 1340 ms, tempo trascorso = 1636 ms.
PIANI DI ESECUZIONE caricati qui: http://we.tl/ARbPuvf9t8
Aggiornamento successivo:
- I processori core AMD Opteron 16 da 2,1 GHz sembrano molto peggiori dei processori quad core Intel da 2,5 GHz
- Grande miglioramento cambiando le opzioni di alimentazione di Windows da bilanciate ad alta potenza
- Ulteriore miglioramento che modifica il grado massimo di parallelismo a 8 e la soglia di costo a 4
Ora, tempi di esecuzione di SQL Server: tempo CPU = 550 ms, tempo trascorso = 828 ms.
È ancora peggio del vecchio server, ma non è poi così male. Se hai altri suggerimenti (oltre alle ottimizzazioni di query locali), non esitare a commentare.