优化大型表上的SQL连接
我正在PostgreSQL数据库上对一个大表运行一组sql查询,每天新增7000000行,在第一次查看时遇到了一些性能问题,现在正在创建表。我使用的大多数命令类似于以下查询:优化大型表上的SQL连接,sql,performance,postgresql,join,bigdata,Sql,Performance,Postgresql,Join,Bigdata,我正在PostgreSQL数据库上对一个大表运行一组sql查询,每天新增7000000行,在第一次查看时遇到了一些性能问题,现在正在创建表。我使用的大多数命令类似于以下查询: CREATE TABLE events_tb AS SELECT * FROM (SELECT column1, column2, column3, column4, column5 FROM test_database_1 WHERE column6 = 'value1' AND date_column &
CREATE TABLE events_tb AS
SELECT *
FROM
(SELECT column1, column2, column3, column4, column5
FROM test_database_1
WHERE column6 = 'value1'
AND date_column > '2012-07-01'
AND date_column < '2012-07-10'
) a
INNER JOIN ( SELECT DISTINCT column1 FROM test_database_2) b
ON (a.column1 = b.column1);
有没有办法改进上述语句集合,以说明查询是针对非常大的表运行的?我对PostgreSQL的优化器一无所知,但您可以尝试用IN-SELECT替换内部联接。。。结构:
CREATE TABLE events_tb AS
SELECT column1, column2, column3, column4, column5
FROM test_database_1
WHERE column6 = 'value1'
AND date_column > '2012-07-01'
AND date_column < '2012-07-10'
AND column1 IN ( SELECT DISTINCT column1 FROM test_database_2 )
我对PostgreSQL的优化器一无所知,但您可以尝试用IN-SELECT替换内部联接。。。结构:
CREATE TABLE events_tb AS
SELECT column1, column2, column3, column4, column5
FROM test_database_1
WHERE column6 = 'value1'
AND date_column > '2012-07-01'
AND date_column < '2012-07-10'
AND column1 IN ( SELECT DISTINCT column1 FROM test_database_2 )
这应该更简单、更快:
CREATE TABLE events_tb AS
SELECT column1, column2, column3, column4, column5
FROM test_database_1 t1
WHERE column6 = 'value1'
AND date_column > '2012-07-01'
AND date_column < '2012-07-10'
AND EXISTS (
SELECT 1
FROM test_database_2 t2
WHERE t2.column1 = t1.column1
);
按照您的方式,在新创建的表中会两次包含column1,这将导致一条错误消息
应该比联接或IN表达式快,因为它可以在第一次查找时停止执行。这对于重复项尤其有益——从查询中的不同点来看,您似乎拥有重复项。这应该更简单、更快:
CREATE TABLE events_tb AS
SELECT column1, column2, column3, column4, column5
FROM test_database_1 t1
WHERE column6 = 'value1'
AND date_column > '2012-07-01'
AND date_column < '2012-07-10'
AND EXISTS (
SELECT 1
FROM test_database_2 t2
WHERE t2.column1 = t1.column1
);
按照您的方式,在新创建的表中会两次包含column1,这将导致一条错误消息
应该比联接或IN表达式快,因为它可以在第一次查找时停止执行。这对于副本尤其有益——从您的查询中的差异来看,您似乎有副本。请向我们展示执行计划。上传给您的解释分析更倾向于提到一组语句,但我只看到一个查询?请向我们展示执行计划。上传给您的解释分析更倾向于提到一组语句,但我只看到一个查询?因为您将其移动到了一个不同的位置,所以不再需要。这可能会改善或恶化性能,具体取决于数据是什么样的。date_列和column6是否有索引?在选择中。。。通常不会比PostgreSQL中的联接快。因为您已将其移动到distinct中的,所以不再需要。这可能会改善或恶化性能,具体取决于数据是什么样的。date_列和column6是否有索引?在选择中。。。通常不比PostgreSQL中的联接快。