これらの質問と与えられた回答に基づいて:
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;
結果は次のとおりです。
3番目のSELECTは、SQL Serverメモリキャッシュにさらに多くのデータをロードします。
3番目のSELECTが最初の2つのSELECT(16ミリ秒)よりもはるかに遅い(8.5秒)のはなぜですか?ORを使用して3番目の選択のパフォーマンスを向上させるにはどうすればよいですか?次のSQLコマンドを実行したいのですが、この場合、カーソルを作成して個別のクエリを実行する方が、単一の選択よりもはるかに速いようです。
SELECT MIN(cas) from PenData p WHERE IDUkazatel IN (SELECT IDUkazatel FROM ...)
編集
デビッドが示唆したように、私は太い矢印の上にカーソルを合わせました:
SELECT TOP (1) min_cas=MIN(CAS) ... ORDER BY min_cas;
(ただし、プランはあなたのものと同じになると思います。)