2011-10-31 2 views
1

나와있는 쿼리를 제공 I SQL Server의 다음과 같은 테이블이 있습니다적절한 인덱싱

CREATE TABLE [dbo].[Users](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Email] [varchar](128) NOT NULL, 
    [CreatedAt] [datetime] NOT NULL, 
    [SourceId] [int] NOT NULL 
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] 

이 테이블은 큰 성장 잠재력을 가지고 있습니다. 가장 자주 쿼리가이 테이블에서 실행 될 것 같습니다

SELECT * FROM Users WHERE Email = '[email protected]' 
SELECT * FROM Users WHERE Email = '[email protected]' AND SourceId = some integer 
SELECT * FROM Users WHERE CreatedAt BETWEEN '2011-10-01' AND '2011-10-30' 
SELECT * FROM Users WHERE CreatedAt BETWEEN '2011-10-01' AND '2011-10-30' AND SourceId = some integer 

은 현재 내가 설치 다음 인덱스가 :

CREATE INDEX IX_Users_Email_SourceId ON Users (Email, SourceId) 
CREATE INDEX IX_Users_CreatedAt ON Users (CreatedAt) 
CREATE INDEX IX_Users_SourceId ON Users (SourceId) 

이러한 인덱스는 위의 쿼리 유형에 대한 충분한 있습니까? 이 쿼리를 많이 쿼리하는 경우 ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON을 OFF로 설정해야합니까? 인덱스를 올바르게 설정하는 방법에 대해 다소 혼란 스럽습니다.

답변

1

나는 것 인덱스들을 이런 식으로 :

WHERE Email = '[email protected]' 
index: Email 
or Email, SourceId 

WHERE Email = '[email protected]' AND SourceId = some integer 
index: SourceId, Email 
or Email, SourceId 

WHERE CreatedAt BETWEEN '2011-10-01' AND '2011-10-30' 
index: CreatedAt 
or CreatedAt, SourceId 

WHERE CreatedAt BETWEEN '2011-10-01' AND '2011-10-30' AND SourceId = some integer 
index: SourceId, CreatedAt 
or CreatedAt, SourceId 

이 완전히 확인하기 어렵다은 SourceId의 선택 것입니다. 그것에 따라 단일 인덱스로 여러 쿼리를 처리 할 수 ​​있습니다. 처음 두 개는 결합 될 수 있고 마지막 두 개는 결합 될 수 있습니다. SourceId이 매우 선택적인 경우 (각 행과 일치하는 행이 거의 없음) 인덱스를 결합하지 않고 4 개의 인덱스를 사용하여 최대 성능을 얻고 싶습니다.

또한 INSERT/UPDATES가 얼마나 많은지 언급하지 않으므로 더 많거나 적은 인덱스의 오버 헤드가 얼마나 크게 작용할지 판단하기 어렵습니다.

또한 SELECT *은 커버 인덱스 등을 추천 할 수 없게합니다.

+0

감사합니다. KM. 행과 페이지 잠금을 해제해야합니까, 아니면 나쁜 생각입니까? SourceId는 그다지 선택적이 아닙니다. 많은 INSERTS가있을 것입니다 (그러나 많은 UPDATES는 아닙니다). – Thomas

+0

INSERT/UPDATE/DELETE 빈도와 트랜잭션 길이에 따라 잠금에 대해 걱정할 필요가 있습니다. 이 데이터를 주로'선택 '하고 느린 트랜잭션을 변경하지 않는 경우 문제가 발생할 때까지는 걱정하지 않겠습니다. –