Sulla base di queste domande e delle risposte fornite:
SQL 2008 Server: la perdita di prestazioni potrebbe essere collegata a una tabella molto grande
Ho una tabella in un database SupervisionP definita in questo modo:
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 circa 211 milioni di file.
Corro la seguente dichiarazione:
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;
Il risultato è mostrato qui:
Il terzo SELECT carica anche molti più dati nella cache di memoria di SQL Server.
Perché il terzo SELECT è molto più lento (8,5 s) dei primi due SELECT (16 ms)? Come posso migliorare le prestazioni della terza selezione con OR? Voglio correre seguendo il comando SQL ma mi sembra che la creazione del cursore e l'esecuzione di query separate sia molto più veloce di una singola selezione in questo caso.
SELECT MIN(cas) from PenData p WHERE IDUkazatel IN (SELECT IDUkazatel FROM ...)
MODIFICARE
Come ha suggerito David, ho sorvolato la grassa freccia:
SELECT TOP (1) min_cas=MIN(CAS) ... ORDER BY min_cas;
(ma immagino che il piano sarà lo stesso del tuo.)