Dựa trên những câu hỏi và câu trả lời được đưa ra:
Máy chủ SQL 2008 - mất hiệu năng có thể được kết nối với một bảng rất lớn
Tôi có một bảng trong cơ sở dữ liệu SupervisionP được định nghĩa như thế này:
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]
Nó chứa cca 211 hàng hàng.
Tôi chạy theo tuyên bố sau:
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;
Kết quả được hiển thị ở đây:
CHỌN thứ ba cũng tải nhiều dữ liệu hơn vào bộ nhớ cache của SQL Server.
Tại sao CHỌN thứ ba chậm hơn nhiều (8,5 giây) sau đó hai CHỌN đầu tiên (16 ms)? Làm cách nào tôi có thể cải thiện hiệu suất của lựa chọn thứ ba bằng OR? Tôi muốn chạy theo lệnh SQL nhưng dường như với tôi rằng việc tạo con trỏ và chạy các truy vấn riêng biệt nhanh hơn nhiều so với một lần chọn trong trường hợp này.
SELECT MIN(cas) from PenData p WHERE IDUkazatel IN (SELECT IDUkazatel FROM ...)
BIÊN TẬP
Như David đề nghị tôi đã di chuột qua mũi tên béo:
SELECT TOP (1) min_cas=MIN(CAS) ... ORDER BY min_cas;
(nhưng tôi đoán kế hoạch sẽ giống với bảng của bạn.)