2011-12-19 91 views
-1

可能重複:
How can I speed up the following update query?如何加快以下sql查詢?

我想運行在一個可接受的時間內現代臺式計算機上的以下查詢(例如最多15分鐘)運行的PostgreSQL 8.4:

UPDATE cap_options_rule_items 
    SET cap_option_id = O.id 
    FROM cap_options_rule_items I 
    JOIN cap_options_rules R 
    ON R.id = I.cap_options_rule_id 
    JOIN cap_options O 
    ON R.cap_engine_id = O.cap_engine_id 
    AND O.code = I.cap_option_code; 

我想知道是否有明顯的錯誤,我正在做的索引的選擇查詢。

查詢中的表有下列多項紀錄:

  • cap_options_rule_item:2208705
  • cap_options_rule:430268
  • cap_options:1628188

而且下面的模式(包括索引)

-- Table: cap_options_rule_items 
CREATE TABLE cap_options_rule_items 
(
    id serial NOT NULL, 
    cap_options_rule_id integer, 
    cap_option_code integer, 
    "primary" boolean, 
    cap_option_id integer, 
    CONSTRAINT cap_options_rule_items_pkey PRIMARY KEY (id) 
) 
WITH (
OIDS=FALSE 
); 

-- Index: index_cap_options_rule_items_on_cap_option_id 
CREATE INDEX index_cap_options_rule_items_on_cap_option_id 
    ON cap_options_rule_items 
USING btree (cap_option_code); 

-- Index: index_cap_options_rule_items_on_cap_option_rule_id 
CREATE INDEX index_cap_options_rule_items_on_cap_option_rule_id 
    ON cap_options_rule_items 
USING btree (cap_options_rule_id); 

-- Table: cap_options_rules 
CREATE TABLE cap_options_rules 
(
    id serial NOT NULL, 
    rule_type character varying(255), 
    cap_engine_id integer, 
    CONSTRAINT cap_options_rules_pkey PRIMARY KEY (id) 
) WITH (OIDS=FALSE 
); 

-- Index: index_cap_options_rules_on_cap_engine_id 
CREATE INDEX index_cap_options_rules_on_cap_engine_id 
    ON cap_options_rules 
USING btree (cap_engine_id); 

-- Table: cap_options 
CREATE TABLE cap_options 
(id serial NOT NULL, 
    description character varying(255), 
    cap_engine_id integer, 
    cap_option_category_id integer, 
    basic_price numeric, 
    vat numeric, 
    default_option boolean, 
    created_at timestamp without time zone, 
    updated_at timestamp without time zone, 
    code integer, 
    CONSTRAINT cap_options_pkey PRIMARY KEY (id) 
) WITH (OIDS=FALSE 
); 


-- Index: index_code_and_cap_engine_id_on_cap_options 
CREATE INDEX index_code_and_cap_engine_id_on_cap_options 
ON cap_options 
    USING btree (code, cap_engine_id); 

謝謝!

+0

向我們展示了'cap_options'表;你有什麼指數嗎? – 2011-12-19 19:38:26

+0

cap_options表格位於我粘貼的模式的末尾。 – soulnafein 2011-12-19 19:56:35

回答

3

由於您正在更新cap_options_rule_items中的所有行,因此您的查詢很慢。

我覺得你真的希望是這樣的:

UPDATE cap_options_rule_items I 
    SET cap_option_id = O.id 
    FROM cap_options_rules R 
    join cap_options O on R.cap_engine_id = O.cap_engine_id 
WHERE I.cap_options_rule_id = R.id 
    and I.cap_option_code = O.code; 
+0

+1,用於發現無意的自加入 – 2011-12-19 20:03:04

+0

我不知道您不必在update from子句中指定更新表。做得好!查詢現在只需要150秒。這很好。非常感謝你!我愛Stackoverflow! – soulnafein 2011-12-19 23:56:40