在同一列中不存在某些 ID 的大表中选择数据。加快查询

Posted

技术标签:

【中文标题】在同一列中不存在某些 ID 的大表中选择数据。加快查询【英文标题】:selecting data in big table for which certain IDs don't exist in same columns. Speed up query 【发布时间】:2017-11-10 21:08:39 【问题描述】:

我正在尝试在表格中为不同类型/ID 的数据选择不存在的公司和日期的数据。

换一种说法,如果wh_calc_id = 368 不存在相同的company_id/dates_id 组合,我想要company_id, dates_id, daily_val 其中wh_calc_id = 344

我大致遵循这个例子: Select rows which are not present in other table

这是我的两次尝试:

尝试 1:

SELECT distinct on (company_id, dates_id) company_id, dates_id, daily_val
FROM   daily_data d1
WHERE  NOT EXISTS (
                       SELECT 1              
                       FROM   daily_data d2
                       WHERE  d1.company_id = d2.company_id
                              and d1.dates_id = d2.dates_id
                              and d1.wh_calc_id = 368
                              and d2.wh_calc_id = 368
                   )
    and d1.wh_calc_id = 344

问题: 超级慢:27 分钟

尝试 2:[已删除]

多合一(巨型)表: company_id int(索引), dates_id int(索引), wh_calc_id int(索引), daily_val 数字

我愿意添加一个有助于加快速度的索引,但是什么索引呢?

Postgres 10

PS - 我不得不在完成之前杀死这两个查询,所以我真的不知道它们是否写得正确。希望我的描述有所帮助。

【问题讨论】:

我会用这种方式左连接:SELECT distinct on (company_id, dates_id) company_id, dates_id, daily_val FROM daily_data d1 LEFT JOIN daily_data d2 ON d1.company_id = d2.company_id 和 d1。 dates_id = d2.dates_id 和 d1.wh_calc_id = 368 和 d2.wh_calc_id = 368 其中 d1.wh_calc_id = 344 和 d2.company_id 为 NULL;并在要使用的列上创建索引:在表 daily_data (company_id, dates_id, wh_calc_id) 上创建索引; 【参考方案1】:

我会以这种方式使用左连接:

SELECT distinct on (company_id, dates_id) company_id, dates_id, daily_val FROM daily_data d1 LEFT JOIN daily_data d2 ON d1.company_id = d2.company_id and d1.dates_id = d2.dates_id and d1.wh_calc_id = 368 and d2.wh_calc_id = 368 WHERE d1.wh_calc_id = 344 AND d2.company_id IS NULL;

并在要使用的列上创建索引:

Create index on table daily_data ( company_id, dates_id, wh_calc_id);

【讨论】:

事实证明这并没有达到我想要的效果。【参考方案2】:

这就是我想要的:

   SELECT 
    d1.* 
from 
    daily_data d1
LEFT JOIN
    daily_data d2
ON
    d1.company_id     = d2.company_id
    AND d1.dates_id   = d2.dates_id
    AND d2.wh_calc_id = 368
    AND d1.wh_calc_id = 344

where
   and  d1.wh_calc_id = 344
   and d2.wh_calc_id is null

【讨论】:

以上是关于在同一列中不存在某些 ID 的大表中选择数据。加快查询的主要内容,如果未能解决你的问题,请参考以下文章

从mysql中的大表中快速选择随机行

在 BigQuery 中的大表中取消透视日期列

HIVE:如何仅从两个表中的两列中选择第三个表中不存在的不同值?

从mysql中的大表中快速选择随机行

SQL查询从某些表中不存在的子选择返回值?

从 SQL Server 中的大表中删除大部分数据的策略