1

我有 2 个表,companyinvestment,我需要在 company 表中有一个列,其中包含每家公司的投资数量。

顺便说一下,这是一个 sqlite 数据库。

我尝试了以下查询:

UPDATE company SET numlinks = (SELECT count(*) 
                                   FROM investment 
                                   WHERE investment.company_name = company.name);

我很确定查询是正确的。如果我为一家公司运行它,则该行将正确更新。但鉴于我有超过 300K 行,查询开始运行,似乎需要一段时间。

使用命令为单个公司运行它时,.timer ON使用的 CPU 约为 0.03(我不确定单位,我猜它以秒为单位)

关于如何使这更快的任何想法?

4

2 回答 2

1

您想要做的是计算摘要,然后将它们加入到更新语句中。不幸的是,SQLite 不支持连接(这里),除非通过这种相关的子查询语法。

加快速度的一种方法是创建一个临时表:

select company_name, count(*) as cnt
from investment
group by company_name

然后对这张表做同样的事情:

set numlinks = (select cnt from TemporaryTable)

性能优势是双重的。首先,您不必为每一行重新计算。更重要的是,您可以在 上创建索引company_name,显着加快查询速度。

于 2013-02-05T22:49:35.967 回答
1

这是最简单的解决方案。

alter table company
drop column numlinks

数据库规范化的首要原则之一是不存储计算值。想显示链接数时,需要时查询。

select company.name, other_stuff, count(*) links
from company join investment on company.name = investment.company_name
group by company.name, other_stuff

顺便说一句,在您当前的设计中,如果两家公司名称相同,您就有麻烦了。这就是为什么名称字段很少用于标识记录的原因。

如果无法理解这个答案,我听说过这本书的好东西,数据库设计为普通人。

于 2013-02-05T22:53:48.287 回答