提高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,则创建索引;
    。将更新问题。如果需要临时表,请使用
    创建临时表…