我在SQLite和SQLServer中运行了以下查询。在SQLite上查询从未完成运行 - 我让它坐了几个小时仍然继续运行。在SQLServer上运行需要不到一分钟。该表有数十万条记录。有没有办法在SQLite中提高查询的性能?
update tmp_tbl
set prior_symbol = (select o.symbol
from options o
where o.underlying_ticker = tmp_tbl.underlying_ticker
and o.option_type = tmp_tbl.option_type
and o.expiration = tmp_tbl.expiration
and o.strike = (select max(o2.strike)
from options o2
where o2.underlying_ticker = tmp_tbl.underlying_ticker
and o2.option_type = tmp_tbl.option_type
and o2.expiration = tmp_tbl.expiration
and o2.strike < tmp_tbl.strike));
更新:我能够使用一些python代码并处理SQL之外的数据映射来完成我需要的工作。但是,我对SQLite和SQLServer之间的性能差异感到困惑 - 我期待SQLite更快。
当我最初运行上述查询时,两个表都没有除标准主键id之外的任何索引,这与数据无关。我创建了两个索引如下:
create index options_table_index on options(underlying_ticker, option_type, expiration, strike);
和
create index tmp_tbl_index on tmp_tbl(underlying_ticker, option_type, expiration, strike);
但这没有帮助。查询仍然继续没有任何输出时钟 - 我让它运行了将近40分钟。
tmp_tbl的表定义是:
create table tmp_tbl(id integer primary key,
symbol text,
underlying_ticker text,
option_type text,
strike real,
expiration text,
mid real,
prior_symbol real,
prior_premium real,
ratio real,
error_flag bit);
选项表的定义类似,但还有一些字段。