Ich habe eine große Website und Datenbank von einem älteren Server (Windows 2008 / SQL Server 2008/16 GB RAM / 2 x 2,5 GHz Quad Core / SAS-Festplatten) auf einen neueren, viel besseren Server (Windows 2008 R2 / SQL Server 2012 SP1 / 64 GB RAM / 2 x 2,1 GHz (16 Core-Prozessoren / SSD-Festplatten).
Ich habe die Datenbankdateien vom alten Server getrennt, sie kopiert und auf dem neuen Server angehängt. Alles ist sehr gut gelaufen.
Danach wechselte ich zur Kompatibilitätsstufe 110, aktualisierte Statistiken, erstellte Indizes neu.
Zu meiner großen Enttäuschung stellte ich fest, dass die meisten SQL-Abfragen auf dem neuen SQL 2012-Server viel langsamer (2-3-4-mal langsamer) sind als auf dem alten SQL 2008-Server.
Beispiel: Bei einer Tabelle mit ca. 700.000 Datensätzen dauerte eine Indexabfrage auf dem alten Server ca. 100 ms. Auf dem neuen Server dauert dieselbe Abfrage ungefähr 350 ms.
Gleiches gilt für alle Abfragen.
Ich würde mich über Hilfe hier freuen. Lassen Sie mich wissen, was zu überprüfen ist. Da ich es kaum glauben kann, dass auf einem besseren Server mit einem neueren SQL Server die Leistung schlechter ist.
Mehr Details:
Der Speicher ist auf max.
Ich habe diese Tabelle und 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]
Ich habe diese Abfrage ausgeführt:
set statistics time on;
select summaryid, count(summaryid) from Answer_Details_23 group by summaryid order by count(summaryid) desc;
set statistics time off;
ALTER SERVER - SQL Server-Ausführungszeiten: CPU-Zeit = 419 ms, verstrichene Zeit = 695 ms.
NEUER SERVER - SQL Server-Ausführungszeiten: CPU-Zeit = 1340 ms, verstrichene Zeit = 1636 ms.
AUSFÜHRUNGSPLÄNE, die hier hochgeladen wurden: http://we.tl/ARbPuvf9t8
Späteres Update:
- AMD 2.1GHz Opteron 16 Core Prozessoren sehen viel schlechter aus als Intel 2.5GHz Quad Core Prozessoren
- Große Verbesserung bei der Änderung der Windows-Energieoptionen von ausgewogen auf hohe Leistung
- Weitere Verbesserung: Maximaler Parallelitätsgrad auf 8 und Kostenschwelle auf 4
Jetzt SQL Server-Ausführungszeiten: CPU-Zeit = 550 ms, verstrichene Zeit = 828 ms.
Es ist immer noch schlimmer als der alte Server, aber nicht so schlimm. Wenn Sie andere Vorschläge (außer Optimierungen für lokale Abfragen) haben, können Sie diese gerne kommentieren.