J'ai migré un grand site Web et une base de données depuis un serveur plus ancien (Windows 2008 / SQL Server 2008/16 Go de RAM / 2 disques Quad Core / SAS à 2,5 GHz) vers un serveur plus récent et bien meilleur (Windows 2008 R2 / SQL Server 2012 SP1 / 64 Go de RAM / 2 processeurs 16 cœurs 2,1 GHz / disques SSD).
J'ai détaché les fichiers de la base de données sur l'ancien serveur, les ai copiés et attachés sur le nouveau serveur. Tout s'est très bien passé.
Après cela, j'ai changé le niveau de compatibilité en 110, mis à jour les statistiques, reconstruit les index.
À ma grande déception, j'ai remarqué que la plupart des requêtes SQL sont beaucoup plus lentes (2-3-4 fois plus lentement) sur le nouveau serveur SQL 2012 que sur l'ancien serveur SQL 2008.
Par exemple, sur une table avec environ 700k enregistrements, sur l'ancien serveur, une requête sur l'index prenait environ 100 ms. Sur le nouveau serveur, la même requête prend environ 350 ms.
Il en va de même pour toutes les requêtes.
J'apprécierais un peu d'aide ici. Faites-moi savoir quoi vérifier / vérifier. Parce que j'ai du mal à croire que sur un meilleur serveur avec un SQL Server plus récent, les performances sont pires.
Plus de détails:
La mémoire est réglée sur max.
J'ai cette table et cet index:
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]
J'ai exécuté cette requête:
set statistics time on;
select summaryid, count(summaryid) from Answer_Details_23 group by summaryid order by count(summaryid) desc;
set statistics time off;
OLD SERVER - Temps d'exécution SQL Server: temps CPU = 419 ms, temps écoulé = 695 ms.
NOUVEAU SERVEUR - Temps d'exécution SQL Server: temps CPU = 1340 ms, temps écoulé = 1636 ms.
PLANS D'EXÉCUTION téléchargés ici: http://we.tl/ARbPuvf9t8
Mise à jour ultérieure:
- Les processeurs AMD Opteron 16 cœurs à 2,1 GHz sont bien pires que les processeurs à quatre cœurs Intel 2,5 GHz
- Grande amélioration en changeant les options d'alimentation des fenêtres de équilibrée à haute puissance
- Amélioration supplémentaire faisant passer le degré de parallélisme maximal à 8 et le seuil de coût à 4
Maintenant, SQL Server Execution Times: temps CPU = 550 ms, temps écoulé = 828 ms.
C'est toujours pire que l'ancien serveur, mais pas si mal. Si vous avez d'autres suggestions (autres que des optimisations de requêtes locales), n'hésitez pas à commenter.