私はSQLiteを学び、クエリを高速化する技術を探しています。ここでいくつかは、私が簡単にメガ秒になると、MSを絞り出すためにしようとしています。私は3つのテーブルを照会するだけですが、私は4つのテーブルを持つ1つのSQLiteデータベースを持っています。ここでは(私は、クエリを呼び出すためにRを使用しています)クエリです:私は、日付とシンボルとちょうど真空により各テーブルにインデックスを持っているSQLiteでGROUP BYのUNIONでINNER JOINを実行するには時間が必要ですか?
SELECT a.date, a.symbol, SUM (a.oi*a.contract_close) AS oi, c.ret, c.prc
FROM (SELECT date, symbol, oi, contract_close FROM ann
UNION
SELECT date, symbol AS sym, oi, contract_close FROM qtr
WHERE oi > 100 AND contract_close > 0 AND date > 20090600) a
INNER JOIN
(SELECT date, symbol || '1C' AS sym, ret, prc FROM crsp
WHERE prc > 5 AND date>20090600) c
ON a.date = c.date AND a.symbol = c.sym
GROUP BY a.date, a.symbol
が、それは時間のように、まだ非常に遅いですプラス(と私は6ヶ月のサブセットを探していることに気付く...私は本当に2003年に戻って質問したい)。
これは単なるキャッシュサイズの問題ですか?私は比較的新しいノートパソコン(4GBのRAMを搭載したMacBook Pro)を持っています。ありがとう!ここで
は.schema
です:
CREATE TABLE ann
("date" INTEGER,
symbol TEXT,
contract_type_1 TEXT,
contract_type_2 TEXT,
product_type TEXT,
block_volume INTEGER,
oi_change INTEGER,
oi INTEGER,
efp_volume INTEGER,
total_volume INTEGER,
name TEXT,
contract_change INTEGER,
contract_open INTEGER,
contract_high INTEGER,
contract_low INTEGER,
contract_close INTEGER,
contract_settle INTEGER
);
CREATE TABLE crsp
("date" INTEGER,
symbol TEXT,
permno INTEGER,
prc REAL,
ret REAL,
vwretd REAL,
ewretd REAL,
sprtrn REAL
);
CREATE TABLE dly
("date" INTEGER,
symbol TEXT,
expiration INTEGER,
product_type TEXT,
shares_per_contract INTEGER,
"open" REAL,
high REAL,
low REAL,
"last" REAL,
settle REAL,
change REAL,
total_volume INTEGER,
efp_volume INTEGER,
block_volume INTEGER,
oi INTEGER
);
CREATE TABLE qtr
("date" INTEGER,
symbol TEXT,
total_volume INTEGER,
block_volume INTEGER,
efp_volume INTEGER,
contract_high INTEGER,
contract_low INTEGER,
contract_open INTEGER,
contract_close INTEGER,
contract_settle INTEGER,
oi INTEGER,
oi_change INTEGER,
shares_per_contract INTEGER,
expiration INTEGER,
product_type TEXT,
unk TEXT,
name TEXT
);
CREATE INDEX idx_ann_date_sym ON ann (date, symbol);
CREATE INDEX idx_crsp_date_sym ON ann (date, symbol);
CREATE INDEX idx_dly_date_sym ON ann (date, symbol);
CREATE INDEX idx_qtr_date_sym ON ann (date, symbol);
これらの作業に感謝します。行数は次のとおりです:ann-1.5m、qtr-2.1m、crsp-14m –
SELECT FROM crspの文字列連結は、スピードの点であなたを傷つけているはずです。 –
ええ、私は本当にそう思っています...私はあなたが推薦した他の変更を行いました。それはまだ30分後になります。私はデータベースをそのままにしたいと思っていましたが、私はcrspテーブルをダンプして "1C"を見つけます。 –