Migré un sitio web grande y una base de datos de un servidor anterior (Windows 2008 / SQL Server 2008/16 GB RAM / 2 x discos Quad Core / SAS de 2.5 GHz) a un servidor más nuevo y mucho mejor (Windows 2008 R2 / SQL Server 2012 SP1 / 64 GB de RAM / 2 x 2,1 GHz 16 procesadores de núcleo / discos SSD).
Separé los archivos de la base de datos en el servidor anterior, los copié y los adjunté en el nuevo servidor. Todo salió muy bien.
Después de eso, cambié al nivel de compatibilidad a 110, actualicé estadísticas, reconstruí índices.
Para mi gran decepción, noté que la mayoría de las consultas SQL son mucho más lentas (2-3-4 veces más lentas) en el nuevo servidor SQL 2012 que en el antiguo servidor SQL 2008.
Por ejemplo, en una tabla con alrededor de 700k registros, en el servidor anterior, una consulta sobre el índice tomaba alrededor de 100 ms. En el nuevo servidor, la misma consulta toma alrededor de 350 ms.
Lo mismo sucede para todas las consultas.
Agradecería un poco de ayuda aquí. Déjame saber qué verificar / verificar. Porque me resulta muy difícil creer que en un mejor servidor con un SQL Server más nuevo, el rendimiento sea peor.
Más detalles:
La memoria está configurada al máximo.
Tengo esta tabla e índice:
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]
Ejecuté esta consulta:
set statistics time on;
select summaryid, count(summaryid) from Answer_Details_23 group by summaryid order by count(summaryid) desc;
set statistics time off;
SERVIDOR ANTIGUO - Tiempos de ejecución del servidor SQL: tiempo de CPU = 419 ms, tiempo transcurrido = 695 ms.
NUEVO SERVIDOR - Tiempos de ejecución de SQL Server: tiempo de CPU = 1340 ms, tiempo transcurrido = 1636 ms.
PLANES DE EJECUCIÓN cargados aquí: http://we.tl/ARbPuvf9t8
Actualización posterior:
- Los procesadores AMD 2.1GHz Opteron 16 core se ven mucho peor que los procesadores Intel quad core 2.5GHz
- Gran mejora al cambiar las opciones de energía de Windows de balanceada a alta potencia
- Mejora adicional cambiando el grado máximo de paralelismo a 8 y el umbral de costo a 4
Ahora, tiempos de ejecución de SQL Server: tiempo de CPU = 550 ms, tiempo transcurrido = 828 ms.
Todavía es peor que el antiguo servidor, pero no está tan mal. Si tiene otras sugerencias (que no sean optimizaciones de consultas locales), no dude en comentar.