提高SQL查询性能,需要澄清
我有一个股票信息数据库,并试图从中挖掘数据 首先,我设置索引:提高SQL查询性能,需要澄清,sql,sqlite,Sql,Sqlite,我有一个股票信息数据库,并试图从中挖掘数据 首先,我设置索引: CREATE INDEX IF NOT EXISTS s1 on Income (symbol, period); CREATE INDEX IF NOT EXISTS s2 on BalanceSheet (symbol, period); CREATE INDEX IF NOT EXISTS s3 on CashFlow (symbol, period); 然后我设置了一个临时表: DROP TABLE IF EXISTS _
CREATE INDEX IF NOT EXISTS s1 on Income (symbol, period);
CREATE INDEX IF NOT EXISTS s2 on BalanceSheet (symbol, period);
CREATE INDEX IF NOT EXISTS s3 on CashFlow (symbol, period);
然后我设置了一个临时表:
DROP TABLE IF EXISTS _;
CREATE TABLE _(symbol, period);
INSERT INTO _(symbol, period) VALUES ('AAPL', 'Annual');
然后我选择:
SELECT
a.yearmonth [Date], a.symbol, a.periodtype [Period],
-- Income and revenues
COALESCE(MAX(CASE WHEN a.statementitem = 'Revenues' THEN a.value END), 0) Revenue,
COALESCE(MAX(CASE WHEN a.statementitem = 'Other Operating Expense/(Income)' THEN a.value END),0) [Other Operating Expense/(Income)],
-- ...
-- ...
-- ...
COALESCE(MAX(CASE WHEN c.statementitem = 'Depreciation & Amortization, Total' THEN c.value END),0) [Depreciation & Amortization, Total], -- This one comes from CashFlow
-- ...
-- ...
-- ...
COALESCE(MAX(CASE WHEN b.statementitem = 'Cash And Equivalents' THEN b.value END),0) [Cash And Equivalents],
COALESCE(MAX(CASE WHEN b.statementitem = 'Total Cash & ST Investments' THEN b.value END),0) [Total Cash & ST Investments],
-- ...
-- ...
-- ...
FROM _
INNER JOIN Income a ON a.symbol = _.symbol AND a.periodtype = _.period
INNER JOIN BalanceSheet b ON b.symbol = _.symbol AND b.periodtype = _.period
INNER JOIN CashFlow c ON c.symbol=_.symbol AND c.periodtype = _.period
GROUP BY a.yearmonth, a.symbol, a.periodtype
上述两件事:
我能做些什么使它更快呢?所有表格的索引都应该在
(符号,句号)
上。然而,我不认为这会有很大的影响
据我所知,你无能为力。数据需要聚合大量数据,这可能需要时间。您所有的联接都是
内部联接,但实际上您所做的是表的交叉联接:Income
,BalanceSheet
和CashFlow
针对symbol='AAPL'和periodtype='Annual'的行进行过滤
我不认为需要临时表。
三个表的交叉
连接总是很昂贵,索引可能会有所帮助。
您可以做的是使交叉
联接的结果变轻,即在联接之前删除临时表和过滤器:
...............................
FROM (SELECT * FROM Income WHERE symbol = 'AAPL' AND periodtype = 'Annual') a
CROSS JOIN (SELECT * FROM BalanceSheet WHERE symbol = 'AAPL' AND periodtype = 'Annual') b
CROSS JOIN (SELECT * FROM CashFlow WHERE symbol = 'AAPL' AND periodtype = 'Annual') c
GROUP BY a.yearmonth, a.symbol, a.periodtype
看起来不像是他干的。当我做1次加入时,我会得到即时结果,2次需要4秒(几乎是即时的。3次加入需要超过5-6秒)minutes@JamesRaitsev…所有的表在两列上都应该有一个索引--我看到您在joins.Right中添加了附加条件。我现在在两个Symbol/Period上都做索引如果收入(Symbol,Period)上不存在s1,则创建索引;
。将更新问题。如果需要临时表,请使用创建临时表…
。