慢插入:从表格中选择

时间:2013-12-24 06:28:00

标签: sql performance postgresql

我对如何让这个查询运行得更快感兴趣。

想法是通过更新从一个表插入另一个表。问题是,较大的表是大约150,000行,在我要插入的项目上有PK。较小的表有大约125,000行。我正在寻找的结果是将较大的表中的skus插入到较小的表中,以便它们具有相同的行数。

我尝试了两个不同的查询,但这个查询可能是最明显的:

INSERT INTO item_data 
            (sku) 
SELECT sku 
FROM   item_table 
WHERE  sku NOT IN (SELECT sku 
                   FROM   item_data); 

我也尝试过这种变化:

INSERT INTO item_data 
            (sku) 
SELECT t1.sku 
FROM   (SELECT sku 
        FROM   item_data) AS t1, 
       (SELECT sku 
        FROM   item_table) AS t2 
WHERE  t1.sku <> t2.sku 

(对不起,如果语法稍微偏离这里)。

我开始运行基本选择查询,令我沮丧的是,它非常慢。

我猜我应该尝试不同的连接大小,但我也有兴趣知道为什么这个查询运行速度比乍一看似乎慢,如果可能的话,我应该寻找什么来确定原因这个运行缓慢。

这是一个全新的安装和一个新的数据库,没有索引或其他任何东西,只有几个表,运行最新的PgAdmin。

2 个答案:

答案 0 :(得分:2)

你的第二个查询将基本上从item_data返回所有可能的sku值,甚至一次,因为你在没有任何条件的情况下进行这两个表的笛卡尔连接。 我猜,你应该:

A)。使用左连接或不存在,类似于:

SELECT t1.sku FROM item_data t1 left join item_table t2 on t1.sku = t2.sku
WHERE t2.sku IS NULL

SELECT t1.sku FROM item_data t1
WHERE NOT EXISTS (SELECT 1 FROM item_table t2 WHERE t1.sku = t2.sku)

B)。检查,如果两个表的sku字段都有索引,它们将使查询更快。

答案 1 :(得分:0)

在oracle世界中,你可以试试MINUS ......

INSERT INTO item_data (sku)
  SELECT sku FROM item_table
  MINUS
  SELECT sku FROM item_data;