2017-12-14 13 views
1

이것은 Firebird 2.5를위한 것입니다.Firebird 여러 컬럼의 SQL 인덱스

색인이 2 열인 표 T가 있습니다 (예 : ColA 및 ColB). 내가하는 일 : SELECT * FROM T WHERE ColA=..., WHERE 절이 A 열에 만 존재하므로 Firebird가 ColB 열에 대해 기본 값을 지정하고 해당 인덱스를 선취합니까? 아니면이 인덱스를 모두 사용할 수 없습니까?

문맥 : 나는 db 업그레이드를하고있다. 여기에 내가 무엇을 가지고 :

CREATE TABLE user(
    newid BIGINT NOT NULL, 
    oldid BIGINT NOT NULL, 
    anotherCol INT); 

CREATE INDEX idx ON user(oldid, anotherCol); 

CREATE TABLE order(
    RefUser BIGINT); 

order.RefUser는 oldid했고 나는 NEWID로 변경해야합니다. , 따라서 인덱스 및 NEWID의 생성을이 시점에서

UPDATE order o SET o.refuser = (SELECT u.newid FROM user u WHERE u.oldId = o.refuser); 

, oldid 여전히 독특하지만, 나중에 유니시티에 전용 (oldid, anotherCol)에 대한 guaranted 될 것이다 : 나는이 쿼리를 사용합니까 .

사용자 테이블은 몇 백만 개의 레코드이며 주문 테이블은 수십억 개입니다.이 쿼리에는 1 시간 이상이 걸립니다. 나는 그것을 향상시키는 방법을보고 싶다. (그 시간 동안 중요한 서비스를 중단시키는 것이 중요하지 않다.)

+1

A와 B 열에이 순서로 색인이있는 경우 FB는 WHERE에 A가 있거나 A와 B가 동시에있는 조건을 포함하지만 WHERE 절에 B 열만있는 경우 색인을 사용하지 않을 때이 색인을 사용합니다 . –

+0

@Andrej : yes 인덱스는 A, B에 있고, A는 WHERE 절에 있습니다. 그래서 당신이 말하는 것은 파이어 버드가 인덱스를 사용할 것입니다 ... 그래서 그 측면의 최적화는 ... 고맙습니다. 이 정확한 대답! – SoyonsPrecis

+0

@SoyonsPrecis 당신은 쿼리를 준비하고 실행 계획을 읽을 수 있습니다. 인덱스가 사용되는지 아닌지는 테이블의 특정 날짜 (일명 인덱스 SELECTIVITY)에 따라 파이어 버드에 의해 결정됩니다. 그러나 일반적으로 복합 인덱스는 첫 번째 열의 A 또는 A & B 또는 A & B & C 등의 하위 집합에 사용될 수 있습니다. –

답변

3

인덱스 통계가 최신이거나 적어도 최적화 프로그램에 충분하다고 가정하면 모든 열이 where 절의 일부가 아닌 경우 Firebird에서 다중 열 인덱스를 사용할 수 있습니다. . 유일한 제한은 첫 번째 열 (또는 인덱스의 '접두사')에만 사용할 수 있다는 것입니다.

파이어 버드 where anotherCol = 'something' 단지 where oldid = 'something'에 대한 좋은,하지만 인덱스 idx을 사용할 수 있습니다

CREATE INDEX idx ON user(oldid, anotherCol); 

와 그래서.

아니요, Firebird는 "열 [anotherCol]에 기본 값을 입력하지 않았습니다"이 아닙니다. 인덱스에서 범위 스캔을 수행하고 일치하는 oldid 접두사가있는 모든 행을 반환합니다.

기술적으로는, 파이어 인덱스의 값을 의미 Firebird for the Database Expert: Episode 1 - Indexes에 기술 된 바와 같이 열을 조합하여 인덱스 키로 생성은 무언가 같은

0<oldid> 1<anotherCol> : row_id 

예 (실제와 같이 간략화 파이어도 프리픽스를 수행 압축)는 단일에 0val1 1%에 대한 문자열 검색을하는 것처럼

0val1 1other1 : rowid1 
0val1 1other2 : rowid4 
0val1 1other3 : rowid6 
0val2 1other1 : rowid2 
... 

where oldid = 'val1'를 사용하여, 파이어 버드 (0val1 1로 시작하는 모든 항목에 대한 인덱스를 검색합니다 기둥). 이 경우 rowid1, rowid4 및 rowid6과 일치합니다.

oldid에서 많은 쿼리를 수행하는 경우 oldid에만 단일 열 인덱스를 만드는 것이 좋습니다.이 인덱스는 더 작을 것이므로 레코드를 검색 할 때 더 빨리 트래버스 할 수 있습니다. 단점은 물론 삽입, 업데이트 및 삭제에 더 많은 인덱스가 성능에 영향을 미친다는 것입니다.

Concatenated Indexes (Use The Index, Luke)도 참조하십시오.

+0

'인덱스 통계가 최신이거나 옵티마이 저가 충분히 좋다면 두 번째 부분 만 서버가 사용할지 결정합니다 :-) 통계를 최신으로 유지하는 것은 중요하지만 인덱스 선택성을 비교하는 결정이 이루어집니다 그들이 알려져 있기 때문에. 데이터가 오래 되었다면 - 옵티마이 저는 알고있을지라도 옵티마이 저가 여전히 그것을 사용합니다 - 단지 업데이트 할 것입니다 :-D –