2013-07-16 53 views
0

我有一個非常大的數據庫,大小高達2GB左右。 數據庫包含10個表和一個表有60列和行13902134 (vt_owner)VLDB中的查詢優化

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) 

執行這個查詢花費了大量的時間!目前使用btree索引。 我想優化這個查詢,並希望得到一些關於如何去做的建議。 使用postgres 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所有的三個B樹索引。 –

+0

需要年齡進行分析.. 「Insert on insurance.uninsured_vehicle(cost = 2.95..855121.64 rows = 6951225 width = 42)」 「 - > Seq Scan on insurance.vt_owner a(cost = 2.95..855121.64 rows = 6951225輸出:a.regn_no,a.chasi_no,a.rto_cd,(a.state_cd)::變化字符(3),a.regn_dt,a.vh_class「 」過濾器:(NOT(散列) SubPlan 1))「 」SubPlan 1「 」 - > Seq Scan on insurance.irda_insurance(cost = 0.00..2.76 rows = 76 width = 11)「 」輸出:irda_insurance.regn_no「 –

+0

與您的EXPLAIN VERBOSE命令查詢.. 成本出來比現有的更高。 尚未在insurance.uninsured_vehicle上使用觸發器。 –