Tengo una consulta de la siguiente manera;Rendimiento SQL lento
SELECT COUNT(Id) FROM Table
La tabla contiene 33 millones de registros: contiene una clave principal en Id y ningún otro índice.
La consulta tarda 30 segundos.
El plan de ejecución real muestra que utiliza un análisis de índice agrupado.
Hemos analizado la tabla y hemos encontrado que no está fragmentada utilizando la primera consulta que se muestra en este enlace: http://sqlserverpedia.com/wiki/Index_Maintenance.
Alguna idea de por qué esta consulta es tan lenta y cómo solucionarla.
la tabla de definición:
CREATE TABLE [dbo].[DbConversation](
[ConversationID] [int] IDENTITY(1,1) NOT NULL,
[ConversationGroupID] [int] NOT NULL,
[InsideIP] [uniqueidentifier] NOT NULL,
[OutsideIP] [uniqueidentifier] NOT NULL,
[ServerPort] [int] NOT NULL,
[BytesOutbound] [bigint] NOT NULL,
[BytesInbound] [bigint] NOT NULL,
[ServerOutside] [bit] NOT NULL,
[LastFlowTime] [datetime] NOT NULL,
[LastClientPort] [int] NOT NULL,
[Protocol] [tinyint] NOT NULL,
[TypeOfService] [tinyint] NOT NULL,
CONSTRAINT [PK_Conversation_1] PRIMARY KEY CLUSTERED
(
[ConversationID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Una cosa que he notado es la base de datos se espera que crezca en trozos 1 MB.
Es un sistema en vivo, por lo que restringimos en lo que podemos jugar, ¿alguna idea?
ACTUALIZACIÓN:
OK - hemos mejorado el rendimiento de la consulta real de interés mediante la adición de nuevos índices no agrupados en columnas apropiadas así que no es un tema crítico más.
SELECT COUNT
sigue siendo lento - lo probé con consejos NOLOCK - no hay diferencia.
Todos pensamos que es algo relacionado con el crecimiento automático establecido en 1Mb en lugar de un número mayor, pero sorprende que tenga este efecto. ¿La fragmentación de MDF en el disco puede ser una posible causa?
Pregunta 1: ¿realmente necesita el recuento exacto? ¿O solo una estimación? –
Ninguno: esta es solo una consulta que ejecutamos después de observar el rendimiento lento en otra cosa. Nos sorprendió bastante descubrir que era muy lento. Voy a intentar actualizar las estadísticas, pero están configuradas para actualizarse automáticamente. – BonyT
¿No puedes usar una constante? Quiero decir, ¿cómo le afecta la diferencia entre tener 33 millones ~ o tener realmente 33.212.293 registros? – bevacqua