【问题标题】:Does column of integers contains value整数列是否包含值
【发布时间】:2013-12-01 05:50:16
【问题描述】:
检查整数列是否包含特定值的最快的性能方法是什么?
我在 postgresql 8.4 中有一个包含 1000 万行的表。我需要每秒至少进行 10000 次检查。
目前我正在查询SELECT id FROM table WHERE id = my_value,然后检查DataReader 是否有行。但这很慢。有什么方法可以在不将整列加载到内存的情况下加快速度?
【问题讨论】:
标签:
sql
performance
postgresql
【解决方案1】:
您可以改为选择COUNT:
SELECT COUNT(*) FROM table WHERE id = my_value
它将只返回一个整数值 - 符合您的选择条件的行数。
【解决方案2】:
你需要两件事,
正如 Marcin 指出的那样,如果您只需要知道有多少,您想使用 COUNT(*)。您还需要该列的索引。该指数将很快找到答案。如果没有索引,Postgresql 仍然需要遍历整个表来计算那个数字。
CREATE INDEX id_idx ON table (id) ASC NULLS LAST;
类似的东西应该能让你到达那里。以 10,000/秒的速度运行查询是否足够。将取决于您的硬件...
【解决方案3】:
如果您使用where id = X,则将返回所有匹配X 的值。假设1000 的值与X 匹配,则将返回1000 的值。
现在,如果您只想检查该值是否至少有一次,那么在您匹配第一个值之后,无需处理另一个 999。即使你计算了这些值,你仍然会遍历所有这些值。
在这种情况下我会做的是:
SELECT 1 FROM table
WHERE id = my_value
LIMIT 1
请注意,我什至没有返回 id 本身。因此,如果您获得一条记录,那么价值就在那里。
当然,为了改进此查询,请确保您在id 列上有索引。