이것은 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 시간 이상이 걸립니다. 나는 그것을 향상시키는 방법을보고 싶다. (그 시간 동안 중요한 서비스를 중단시키는 것이 중요하지 않다.)
A와 B 열에이 순서로 색인이있는 경우 FB는 WHERE에 A가 있거나 A와 B가 동시에있는 조건을 포함하지만 WHERE 절에 B 열만있는 경우 색인을 사용하지 않을 때이 색인을 사용합니다 . –
@Andrej : yes 인덱스는 A, B에 있고, A는 WHERE 절에 있습니다. 그래서 당신이 말하는 것은 파이어 버드가 인덱스를 사용할 것입니다 ... 그래서 그 측면의 최적화는 ... 고맙습니다. 이 정확한 대답! – SoyonsPrecis
@SoyonsPrecis 당신은 쿼리를 준비하고 실행 계획을 읽을 수 있습니다. 인덱스가 사용되는지 아닌지는 테이블의 특정 날짜 (일명 인덱스 SELECTIVITY)에 따라 파이어 버드에 의해 결정됩니다. 그러나 일반적으로 복합 인덱스는 첫 번째 열의 A 또는 A & B 또는 A & B & C 등의 하위 집합에 사용될 수 있습니다. –