根据这些问题和给出的答案:
SQL 2008 Server-性能损失可能与非常大的表有关
具有历史数据的大表分配了过多的SQL Server 2008 Std。内存-其他数据库的性能损失
我在数据库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]
它包含cca 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比前两个SELECT(16毫秒)慢得多(8.5 s)?如何使用OR提高第三选择的性能?我想运行以下SQL命令,但在我看来,在这种情况下,创建游标和运行单独的查询比单次选择要快得多。
SELECT MIN(cas) from PenData p WHERE IDUkazatel IN (SELECT IDUkazatel FROM ...)
编辑
正如大卫建议的那样,我将鼠标悬停在粗箭头上:
SELECT TOP (1) min_cas=MIN(CAS) ... ORDER BY min_cas;
(但我想这个计划将是一样的你。)