我希望标题有点清楚。
情况: 测量表,大约350.000.000条记录在这里。 带有传感器ID的表格,大约有300条记录在这里。
现在,当我需要传感器的特定测量时,我获取传感器ID并使用该传感器ID(以及特定数据或其他)查询测量表。这些查询运行得非常快(传感器id和其他一些列的索引)。
然而,这是一个长期运行的项目,我不知道有多少数据" old" (我无法访问的测量值,因为传感器ID不在我的传感器表中)。让我们说:
measurements table
sensor id
1
2
3
4
5
sensor table
1
4
5
我想从测量表中选择不在传感器表中的所有ID。我通常使用以下查询执行此操作:
SELECT sensor_id
FROM measurement_table
WHERE sensor_id NOT IN (
SELECT sensor_id
FROM sensor_table
WHERE sensor_id IS NOT NULL)
)
GROUP BY sensor_id
在一张“小”的桌子上,比如几千甚至一百万条记录,这是可行的。但是,当我在我的测量表上运行此查询时,它需要太长时间(在将近一小时后取消它)。
有没有办法让我找出测量表中的传感器ID是什么,而不是传感器表?
编辑:
SELECT COUNT(*)
FROM measurements_table
WHERE sensor_id IN (
SELECT sensor_id
FROM sensor_table
)
工作(没有组,计数),给出:
334214244
表中的总数:
337225071
所以我想通过ID找到那些3010827记录......
答案 0 :(得分:4)
SELECT m.sensor_id
FROM measurement_table m
LEFT JOIN sensor_table s ON m.sensor_id = s.sensor_id
WHERE s.sensor_id IS NULL
也许您需要SELECT DISTINCT
。
答案 1 :(得分:2)
通过左连接:
SELECT t1.sensor_id
FROM measurement_table t1
LEFT JOIN sensor_table t2
ON t1.sensor_id = t2.sensor_id
WHERE t2.sensor_id IS NULL
通过存在:
Select t1.sensor_id
From measurement_table t1
where not exists(
select 1 from sensor_table t2 where t2.sensor_id=t1.sensor_id
)
绝不使用NOT IN
左连接和存在可以做这件事,但我们不能说哪个更快。它将取决于你的表中的索引和其他东西,你可以尝试这两个并选择一个更快的