2013-07-16 2 views
0

저는 매우 큰 데이터베이스를 가지고 있습니다. 크기는 최대 2GB입니다. 데이터베이스는 10 표를 포함하고 테이블 중 하나는이 쿼리를 실행하는 것은 시간이 많이 걸립니다쿼리 최적화

Insert into insurance.uninsured_vehicle 
      select a.regn_no,a.chasi_no,a.rto_cd,a.state_cd,a.regn_dt,a.vh_class 
from insurance.vt_owner a 
      where a.regn_no not in(select regn_no from insurance.irda_insurance) 

60 열과 13902134 행 (vt_owner)가 있습니다! 현재 btree 인덱싱을 사용하고 있습니다. 이 쿼리를 최적화하고 싶습니다.이 쿼리를 수행하는 방법에 대한 제안이 필요했습니다. 포스트 그레스 사용 9.2

나는 테이블을 세로로 분할 한 다음 다양한 파티션에 인덱싱을 적용하기로 결정했습니다.

vt_owner 테이블 정의는

CREATE TABLE insurance.vt_owner 
(
    regn_no character varying(10) NOT NULL, 
    regn_dt timestamp without time zone, 
    purchase_dt timestamp without time zone, 
    owner_sr numeric(5,0), 
    owner_name character varying(150), 
    pan_no character varying(10), 
    f_name character varying(150), 
    c_add1 character varying(50), 
    c_add2 character varying(50), 
    c_city character varying(50), 
    c_district character varying(30), 
    c_pincode character varying(6), 
    p_add1 character varying(50), 
    p_add2 character varying(50), 
    p_city character varying(50), 
    p_district character varying(30), 
    p_pincode character varying(6), 
    owner_cd numeric(5,0), 
    owner_cd_desc character varying(50), 
    regn_type character varying(1), 
    regn_type_desc character varying(50), 
    vh_class numeric(5,0), 
    vh_class_desc character varying(50), 
    chasi_no character varying(30), 
    eng_no character varying(30), 
    maker numeric(5,0), 
    maker_desc character varying(50), 
    maker_model character varying(50), 
    body_type character varying(3), 
    body_type_desc character varying(50), 
    no_cyl numeric(2,0), 
    hp character varying(10), 
    seat_cap numeric(3,0), 
    stand_cap numeric(3,0), 
    sleeper_cap numeric(2,0), 
    unld_wt numeric(9,0), 
    ld_wt numeric(9,0), 
    fuel numeric(3,0), 
    fuel_desc character varying(50), 
    color character varying(50), 
    manu_mon numeric(2,0), 
    manu_yr numeric(4,0), 
    fit_dt timestamp without time zone, 
    norms numeric(2,0), 
    norms_desc character varying(50), 
    wheelbase character varying(10), 
    cubic_cap character varying(10), 
    floor_area numeric(7,3), 
    ac_fiitted character(1), 
    audio_fiitted character(1), 
    video_fiitted character(1), 
    vch_purchase_as character(1), 
    vch_catg character(3), 
    dealer_cd numeric(5,0), 
    dealer_cd_desc character varying(50), 
    sale_amt numeric(9,0), 
    laser_code character varying(10), 
    garage_add character varying(50), 
    state_cd character varying(2) NOT NULL, 
    rto_cd character varying(3) NOT NULL, 
    CONSTRAINT vt_owner_pkey PRIMARY KEY (state_cd, rto_cd, regn_no) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE insurance.vt_owner 
    OWNER TO postgres; 

-- Index: insurance."index_VT_OWNER" 

-- DROP INDEX insurance."index_VT_OWNER"; 

CREATE INDEX "index_VT_OWNER" 
    ON insurance.vt_owner 
    USING btree 
    (regn_no COLLATE pg_catalog."default", chasi_no COLLATE pg_catalog."default", state_cd COLLATE pg_catalog."default", rto_cd COLLATE pg_catalog."default"); 

나는 또한 괘를 만드는 생각했다. 제발 좀 도와주세요.

답변

1

insurance.vt_owner.regn_no의 색인이 생성 되었습니까?

insurance.irda_insurance.regn_no에 대한 인덱스가 있습니까?

ANALYZE 최근에 실행 한 적이 있습니까?

insurance.uninsured_vehicle에 트리거가 있습니까?

이 쿼리는 더 잘 수행됩니까?

INSERT INTO insurance.uninsured_vehicle 
SELECT a.regn_no,a.chasi_no,a.rto_cd,a.state_cd,a.regn_dt,a.vh_class 
FROM insurance.vt_owner a 
WHERE NOT EXISTS (SELECT 1 FROM insurance.irda_insurance WHERE regn_no = a.regn_no) 
+0

보험은 스키마 .. vt_owner, irda_insurance이며, 모든 세 uninsured_vehicle BTREE 인덱싱됩니다. –

+0

분석 할 나이를 취합니다. "보험에 가입하십시오. 보험에 가입하지 않은 차량 (비용 = 2.95..855121.64 행 = 6951225 너비 = 42)" "-> Seq가 insurance.vt_owner a에서 스캔합니다 (비용 = 2.95..855121.64 행 = 6951225 width : 42) " "출력 : a.regn_no, a.chasi_no, a.rto_cd (a.state_cd) :: 문자 변경 (3), a.regn_dt, a.vh_class " "필터 : (NOT (해쉬 된 (비용 = 0.00..2.76 행 = 76 너비 = 11) " "서브 Pllan 1 " "-> Seq는 insurance.irda_insurance를 스캔합니다. (비용 = 0.00..2.76 행 = 76 너비 = 11) " "출력 : irda_insurance.regn_no " –

+0

EXPLAIN VERBOSE 명령을 사용합니다. 쿼리 .. 비용이 기존 것보다 높아집니다. insurance.uninsured_vehicle에서 트리거가 사용되었습니다. –