1

と の 2 つのテーブルがcompanyありinvestment、会社のテーブルには、各会社の投資数を含む列が必要です。

ところで、これは sqlite データベースです。

次のクエリを試しました。

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

クエリが正しいと確信しています。単一の会社に対して実行すると、行は正しく更新されます。しかし、30 万行を超えると、クエリの実行が開始され、しばらく時間がかかるようです。

コマンドで単一の企業に対して実行すると、.timer ON使用されるCPUは約0.03です(単位はわかりませんが、秒単位だと思います)

これをより速くする方法についてのアイデアはありますか?

4

2 に答える 2

1

これが最も簡単な解決策です。

alter table company
drop column numlinks

データベースの正規化の第一原則の 1 つは、計算された値を保存しないことです。リンク数を表示したい場合は、必要なときに問い合わせてください。

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

余談ですが、今のデザインだと同じ名前の会社が2社あると困ります。そのため、レコードを識別するために名前フィールドが使用されることはめったにありません。

この答えを理解するのに苦労している場合は、本「Database Design for Mere Mortals」について良いことを聞いたことがあります。

于 2013-02-05T22:53:48.287 に答える
1

あなたがしたいことは、要約を計算し、それらを update ステートメントに結合することです。残念ながら、SQLite は結合 ( here ) をサポートしていません。ただし、このような相関サブクエリ構文を使用する場合を除きます。

これを高速化する 1 つの方法は、次を使用して一時テーブルを作成することです。

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

次に、このテーブルで同じことを行います。

set numlinks = (select cnt from TemporaryTable)

パフォーマンス上の利点は 2 つあります。まず、行ごとに計算をやり直す必要はありません。さらに重要なことは、 にインデックスを作成しcompany_nameて、クエリを大幅に高速化できることです。

于 2013-02-05T22:49:35.967 に答える