我对如何让这个查询运行得更快感兴趣。
想法是通过更新从一个表插入另一个表。问题是,较大的表是大约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。
答案 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;