Com base nessas perguntas e nas respostas dadas:
SQL 2008 Server - perda de desempenho possivelmente conectada a uma tabela muito grande
Eu tenho uma tabela em um banco de dados SupervisionP definido assim:
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]
Ele contém cerca de 211 milhões de linhas.
Eu executo a seguinte declaração:
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;
O resultado é mostrado aqui:
O terceiro SELECT também carrega muito mais dados no cache de memória do SQL Server.
Por que o terceiro SELECT é muito mais lento (8,5 s) do que os dois primeiros SELECTs (16 ms)? Como posso melhorar o desempenho da terceira seleção com OU? Eu quero executar o seguinte comando SQL, mas parece-me que criar cursor e executar consultas separadas é muito mais rápido do que uma única seleção nesse caso.
SELECT MIN(cas) from PenData p WHERE IDUkazatel IN (SELECT IDUkazatel FROM ...)
EDITAR
Como David sugeriu, passei o mouse sobre a flecha gorda:
SELECT TOP (1) min_cas=MIN(CAS) ... ORDER BY min_cas;
(mas acho que o plano será o mesmo que o seu).