На основании этих вопросов и ответов даны:
SQL 2008 Server - потеря производительности, возможно, связана с очень большой таблицей
У меня есть таблица в базе данных SupervisionP, определенная так:
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]
Он содержит около 211 миллионов строк.
Я запускаю следующее утверждение:
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;
Результат показан здесь:
Третий SELECT также загружает гораздо больше данных в кэш памяти SQL Server.
Почему третий SELECT намного медленнее (8,5 с), чем первые два SELECT (16 мс)? Как я могу улучшить производительность третьего выбора с помощью ИЛИ? Я хочу выполнить следующую команду SQL, но мне кажется, что создание курсора и выполнение отдельных запросов в этом случае выполняется намного быстрее, чем один выбор.
SELECT MIN(cas) from PenData p WHERE IDUkazatel IN (SELECT IDUkazatel FROM ...)
РЕДАКТИРОВАТЬ
Как предположил Дэвид, я завис над жирной стрелой:
SELECT TOP (1) min_cas=MIN(CAS) ... ORDER BY min_cas;
(но я думаю, что план будет таким же, как у вас.)