Я пытаюсь изучить SQLite и ищу способы ускорить мой запрос.Я вижу здесь некоторых, пытающихся выжать мс, когда я легко за мега секунд.У меня есть одна база данных SQLite с четырьмя таблицами, хотя я запрашиваю только три таблицы.Вот запрос (я использую R для вызова запроса):
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
У меня есть индекс для каждой таблицы по дате и символу и просто VACUUMed, но он все еще очень медленный, как в течение часа плюс(и обратите внимание, что я ищу подмножество на шесть месяцев ... Я действительно хочу вернуться к 2003 году).
Это просто проблема размера кэша?У меня относительно новый ноутбук (MacBook Pro с 4 Гб оперативной памяти).Спасибо!
Вот это .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);