CustPassMaster
16 개의 열 이있는 테이블 이 있는데 그 중 하나는 CustNum varchar(8)
이며 인덱스를 만들었습니다 IX_dbo_CustPassMaster_CustNum
. SELECT
진술서를 실행할 때 :
SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678'
인덱스를 완전히 무시합니다. 이 CustDataMaster
방법은 더 많은 열 (55) 이있는 다른 테이블이 있으므로 혼란 스럽습니다 CustNum varchar(8)
. IX_dbo_CustDataMaster_CustNum
이 테이블 의이 열 ( )에 색인을 생성하고 실제로 동일한 쿼리를 사용합니다.
SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678'
그리고 내가 만든 색인을 사용합니다.
이것 뒤에 특별한 이유가 있습니까? 왜에서 색인을 사용 CustDataMaster
하지만 의 색인을 사용 하지 CustPassMaster
않습니까? 열 수가 적기 때문입니까?
첫 번째 쿼리는 66 개의 행을 반환합니다. 두 번째는 1 행이 반환됩니다.
또한 추가 참고 사항 : CustPassMaster
4991 개의 레코드 CustDataMaster
가 있고 5376 개의 레코드가 있습니다. 이것이 색인을 무시하는 이유일까요? CustPassMaster
또한 동일한 CustNum
값 을 가진 중복 레코드가 있습니다 . 이것이 또 다른 요인입니까?
나는이 주장을 두 쿼리의 실제 실행 계획 결과에 근거하고 있습니다.
다음은 CustPassMaster
(사용되지 않은 인덱스 가있는) DDL입니다 .
CREATE TABLE dbo.CustPassMaster(
[CustNum] [varchar](8) NOT NULL,
[Username] [char](15) NOT NULL,
[Password] [char](15) NOT NULL,
/* more columns here */
[VBTerminator] [varchar](1) NOT NULL
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_dbo_CustPassMaster_CustNum] ON dbo.CustPassMaster
(
[CustNum] ASC
) WITH (PAD_INDEX = OFF
, STATISTICS_NORECOMPUTE = OFF
, SORT_IN_TEMPDB = OFF
, DROP_EXISTING = OFF
, ONLINE = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
그리고 DDL CustDataMaster
(나는 관련이없는 많은 필드를 생략했습니다) :
CREATE TABLE dbo.CustDataMaster(
[CustNum] [varchar](8) NOT NULL,
/* more columns here */
[VBTerminator] [varchar](1) NOT NULL
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_dbo_CustDataMaster_CustNum] ON dbo.CustDataMaster
(
[CustNum] ASC
)WITH (PAD_INDEX = OFF
, STATISTICS_NORECOMPUTE = OFF
, SORT_IN_TEMPDB = OFF
, DROP_EXISTING = OFF
, ONLINE = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
해당 테이블 중 하나에 클러스터 된 인덱스가없고 하나의 비 클러스터형 인덱스 만 있습니다.
데이터 유형이 저장되는 데이터 유형과 완전히 일치하지 않는다는 사실을 무시하십시오. 이 필드는 IBM AS / 400 DB2 데이터베이스의 백업이며 호환 가능한 데이터 유형입니다. (이 백업 데이터베이스를 정확히 동일한 쿼리로 쿼리하고 정확히 동일한 결과를 얻을 수 있어야 합니다.)
이 데이터는 명령문 에만 사용됩니다 SELECT
. 백업 응용 프로그램이 AS / 400에서 데이터를 복사하는 경우를 제외하고는 그에 대해 INSERT
/ UPDATE
/ DELETE
문을 수행하지 않습니다 .