Sobre la base de estas preguntas y las respuestas dadas:
SQL 2008 Server: pérdida de rendimiento posiblemente conectada con una tabla muy grande
Tengo una tabla en una base de datos SupervisionP definida así:
CREATE TABLE [dbo].[PenData](
[IDUkazatel] [smallint] NOT NULL,
[Cas] [datetime2](0) NOT NULL,
[Hodnota] [real] NULL,
[HodnotaMax] [real] NULL,
[HodnotaMin] [real] NULL,
CONSTRAINT [PK_Data] PRIMARY KEY CLUSTERED
(
[IDUkazatel] ASC,
[Cas] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[PenData] WITH NOCHECK ADD CONSTRAINT [FK_Data_Ukazatel] FOREIGN KEY([IDUkazatel])
REFERENCES [dbo].[Ukazatel] ([IDUkazatel])
ALTER TABLE [dbo].[PenData] CHECK CONSTRAINT [FK_Data_Ukazatel]
Contiene aproximadamente 211 millones de filas.
Ejecuto la siguiente declaración:
DECLARE @t1 DATETIME;
DECLARE @t2 DATETIME;
SET @t1 = GETDATE();
SELECT min(cas) from PenData p WHERE IDUkazatel=24
SELECT min(cas) from PenData p WHERE IDUkazatel=25
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;
SET @t1 = GETDATE();
SELECT min(cas) from PenData p WHERE IDUkazatel=24 OR IDUkazatel=25
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;
El resultado se muestra aquí:
El tercer SELECT también carga muchos más datos en la memoria caché de SQL Server.
¿Por qué el tercer SELECT es mucho más lento (8.5 s) que los dos primeros SELECT (16 ms)? ¿Cómo puedo mejorar el rendimiento de la tercera selección con OR? Quiero ejecutar el siguiente comando SQL, pero me parece que crear cursor y ejecutar consultas separadas es mucho más rápido que una sola selección en este caso.
SELECT MIN(cas) from PenData p WHERE IDUkazatel IN (SELECT IDUkazatel FROM ...)
EDITAR
Como David sugirió, he estado sobre la flecha gorda:
fuente
SELECT TOP (1) min_cas=MIN(CAS) ... ORDER BY min_cas;
(pero supongo que el plan será el mismo que el suyo).