나는 이것에 나의 머리를 긁고있다.SQL Server 쿼리 최적화 프로그램이 때때로 클러스터 된 기본 키를 간과하는 경우가 있습니까?
나는 완전히 그것을 .... 날짜 필드에 인덱스에 찬성, 쿼리 실행 계획의 기본 키가 무시 클러스터 로 id
있는 테이블 정수 기본 키과 SQL 최적화에 select count(id)
간단하게 실행? ??
실제 테이블 :
CREATE TABLE [dbo].[msgr](
[id] [int] IDENTITY(1,1) NOT NULL,
[dt] [datetime2](3) NOT NULL CONSTRAINT [DF_msgr_dt] DEFAULT (sysdatetime()),
[uid] [int] NOT NULL,
[msg] [varchar](7000) NOT NULL CONSTRAINT [DF_msgr_msg] DEFAULT (''),
[type] [tinyint] NOT NULL,
[cid] [int] NOT NULL CONSTRAINT [DF_msgr_cid] DEFAULT ((0)),
[via] [tinyint] NOT NULL,
[msg_id] [bigint] NOT NULL,
CONSTRAINT [PK_msgr] 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]
무슨 일이 그 이유가 될 수하세요?
SQL Server는 성능면에서 보조 인덱스가 더 유용하다고 생각합니다. 아마도 클러스터 된 인덱스는 리프 수준에서 데이터 페이지를 읽어야하기 때문일 수 있습니다. –
@GordonLinoff 그래서 걱정할 이유가 없나요? –
클러스터되지 않은 인덱스 (필터링 된 레코드는 제외)의 레코드 수는 클러스터 된 인덱스의 레코드 수와 같습니다. 그런 다음 할당 된 페이지 수에 따라 * 가장 작은 * 색인을 사용하여 계산할 수 있으며 더 적은 IO를 소비하면서 정답을 얻을 수 있습니다. 이는 1) WHERE 절이없고 2) id가 클러스터 된 인덱스 키 (아마도 기본 키)이기 때문입니다. 'count (*)'도 동일한 최적화를 활용할 수 있습니다. –