현재 완료하는 데 평균 2500ms가 걸리는 쿼리가 있습니다. 내 테이블은 매우 좁지 만 4,400 만 행이 있습니다. 성능을 향상시키기 위해 어떤 옵션이 필요합니까?
쿼리
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
탁자
CREATE TABLE [dbo].[Heartbeats](
[ID] [int] IDENTITY(1,1) NOT NULL,
[DeviceID] [int] NOT NULL,
[IsPUp] [bit] NOT NULL,
[IsWebUp] [bit] NOT NULL,
[IsPingUp] [bit] NOT NULL,
[DateEntered] [datetime] NOT NULL,
CONSTRAINT [PK_Heartbeats] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
색인
CREATE NONCLUSTERED INDEX [CommonQueryIndex] ON [dbo].[Heartbeats]
(
[DateEntered] ASC,
[DeviceID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
색인을 추가하면 도움이됩니까? 그렇다면 어떤 모습일까요? 쿼리는 가끔씩 만 실행되기 때문에 현재 성능이 허용되지만 학습 연습으로 궁금합니다. 더 빨리 할 수있는 방법이 있습니까?
최신 정보
강제 색인 힌트를 사용하도록 쿼리를 변경하면 쿼리가 50ms 내에 실행됩니다.
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WITH(INDEX(CommonQueryIndex))
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
올바른 선택적 DeviceID 절을 추가하면 50ms 범위에 도달합니다.
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' AND DeviceID = 4;
ORDER BY [DateEntered], [DeviceID]
원래 쿼리에 추가 하면 50ms 범위에 있습니다.
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
ORDER BY [DateEntered], [DeviceID];
이들은 모두 내가 기대했던 색인 (CommonQueryIndex)을 사용하므로 내 질문이 있다고 생각합니다.이 색인을 이와 같은 쿼리에 사용하도록 강요 할 수 있습니까? 아니면 내 테이블의 크기가 옵티 마이저를 너무 많이 ORDER BY
버려서 또는 힌트를 사용해야 합니까?