Przeprowadziłem migrację dużej witryny i bazy danych ze starszego serwera (Windows 2008 / SQL Server 2008/16 GB RAM / 2 x 2,5 GHz Quad Core / SAS) na nowszy, znacznie lepszy serwer (Windows 2008 R2 / SQL Server 2012 SP1 / 64 GB RAM / 2 x 2,1 GHz 16 rdzeni / dysków SSD).
Odłączyłem pliki bazy danych na starym serwerze, skopiowałem je i załączyłem na nowym serwerze. Wszystko poszło bardzo dobrze.
Następnie zmieniłem poziom zgodności na 110, zaktualizowałem statystyki, odbudowałem indeksy.
Ku mojemu ogromnemu rozczarowaniu zauważyłem, że większość zapytań SQL jest znacznie wolniejsza (2-3-4 razy wolniejsza) na nowym serwerze SQL 2012 niż na starym serwerze SQL 2008.
Na przykład w tabeli z około 700 000 rekordów na starym serwerze zapytanie dotyczące indeksu trwało około 100 ms. Na nowym serwerze to samo zapytanie zajmuje około 350 ms.
To samo dzieje się w przypadku wszystkich zapytań.
Byłbym wdzięczny za pomoc tutaj. Daj mi znać, co sprawdzić / zweryfikować. Ponieważ trudno mi uwierzyć, że na lepszym serwerze z nowszym programem SQL Server wydajność jest gorsza.
Więcej szczegółów:
Pamięć jest ustawiona na maks.
Mam tę tabelę i indeks:
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]
Wykonałem to zapytanie:
set statistics time on;
select summaryid, count(summaryid) from Answer_Details_23 group by summaryid order by count(summaryid) desc;
set statistics time off;
STARY SERWER - Czasy wykonania programu SQL Server: czas procesora = 419 ms, czas, który upłynął = 695 ms.
NOWY SERWER - Czasy wykonania programu SQL Server: czas procesora = 1340 ms, czas, który upłynął = 1636 ms.
PLANY WYKONANIA przesłane tutaj: http://we.tl/ARbPuvf9t8
Późniejsza aktualizacja:
- 16-rdzeniowe procesory AMD 2.1 GHz Opteron wyglądają znacznie gorzej niż czterordzeniowe procesory Intel 2,5 GHz
- Ogromna poprawa zmieniająca opcje zasilania systemu Windows z wyważonego na wysoką
- Dalsza poprawa zmieniająca maksymalny stopień równoległości na 8 i próg kosztów na 4
Teraz czasy wykonania programu SQL Server: czas procesora = 550 ms, czas, który upłynął = 828 ms.
Wciąż jest gorszy niż stary serwer, ale nie jest taki zły. Jeśli masz jakieś inne sugestie (inne niż lokalne optymalizacje zapytań), prosimy o komentarz.