Basierend auf diesen Fragen und den gegebenen Antworten:
SQL 2008 Server - Leistungsverlust, möglicherweise verbunden mit einer sehr großen Tabelle
Ich habe eine Tabelle in einer Datenbank SupervisionP wie folgt definiert:
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]
Es enthält ca. 211 Millionen Reihen.
Ich führe folgende Aussage aus:
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;
Das Ergebnis wird hier gezeigt:
Das dritte SELECT lädt auch viel mehr Daten in den SQL Server-Speichercache.
Warum ist der dritte SELECT so viel langsamer (8,5 s) als die ersten beiden SELECTs (16 ms)? Wie kann ich die Leistung der dritten Auswahl mit ODER verbessern? Ich möchte den folgenden SQL-Befehl ausführen, aber es scheint mir, dass das Erstellen eines Cursors und das Ausführen separater Abfragen in diesem Fall viel schneller ist als eine einzelne Auswahl.
SELECT MIN(cas) from PenData p WHERE IDUkazatel IN (SELECT IDUkazatel FROM ...)
BEARBEITEN
Wie David vorgeschlagen hat, habe ich über dem fetten Pfeil schweben lassen:
SELECT TOP (1) min_cas=MIN(CAS) ... ORDER BY min_cas;
(aber ich denke, der Plan wird der gleiche sein wie Ihr.)