Sur la base de ces questions et des réponses données:
SQL 2008 Server - perte de performances éventuellement liée à une très grande table
J'ai une table dans une base de données SupervisionP définie comme ceci:
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]
Il contient environ 211 millions de lignes.
Je lance la déclaration suivante:
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;
Le résultat est affiché ici:
Le troisième SELECT charge également beaucoup plus de données dans le cache mémoire de SQL Server.
Pourquoi le troisième SELECT est-il tellement plus lent (8,5 s) que les deux premiers SELECT (16 ms)? Comment puis-je améliorer les performances de la troisième sélection avec OR? Je veux exécuter la commande SQL suivante, mais il me semble que la création d'un curseur et l'exécution de requêtes distinctes sont beaucoup plus rapides qu'une simple sélection dans ce cas.
SELECT MIN(cas) from PenData p WHERE IDUkazatel IN (SELECT IDUkazatel FROM ...)
ÉDITER
Comme David l'a suggéré, j'ai survolé la grosse flèche:
la source
SELECT TOP (1) min_cas=MIN(CAS) ... ORDER BY min_cas;
(mais je suppose que le plan sera le même que le vôtre.)