【发布时间】:2011-12-01 08:08:24
【问题描述】:
我在 Python 中使用 SQLite 作为大型文件管理系统。我有一个大的平面文件(1 亿行),我想使用 3 列(整数)的值对其进行排序,以便我可以迭代并进行一些计算。
我使用带有大 SELECT ... ORDER BY 的 SQLite(在一列上有一个索引)。由于这个大的SELECT 占用太多内存,我需要多次调用它(使用OFFSET 和LIMIT)。
我可以使用 Linux 排序,但我希望它独立于平台。它工作正常(只要正确设置了正确的 PRAGMA),但速度很慢。如何优化?
命令如下:
PRAGMA journal_mode = OFF
PRAGMA synchronous = 0
PRAGMA locking_mode = EXCLUSIVE
PRAGMA count_change = OFF
PRAGMA temp_store = 2
CREATE TABLE tmpTranscripts_arm_3R_transcripts (id INTEGER PRIMARY KEY, name varchar(255), chromosome varchar(255), start int(11), end int(11), direction tinyint(4), tags varchar(1023), bin int(11), exons varchar(10000))
CREATE INDEX 'iTranscript_arm_3R_14943' ON 'tmpTranscripts_arm_3R_transcripts' (start, end, direction)
INSERT INTO tmpTranscripts_arm_3R_transcripts (name, chromosome, start, end, direction, tags, bin, exons) VALUES ('SRR060644.1', 'arm_3R', 11450314, 11450337, -1, 'feature=transcript;bestRegion=(self);nbGaps=0;nbMismatches=0;ID=SRR060644.1;identity=100.0', 300011450, '')
(this, more than 10 millions times)
SELECT * FROM tmpTranscripts_arm_3R_transcripts ORDER BY start, end, direction LIMIT 0, 10000
(this, as much as needed)
【问题讨论】:
-
您是否为这 3 列创建了索引?添加索引确实提高了排序操作的速度。但它当然有它的代价——数据库会更大,插入操作会更慢。
-
如果 3 个单独的索引不能很好地工作,那么如果您的 SELECT 始终以相同的方式排序,则可能创建 1 个多列索引。检查这个答案stackoverflow.com/questions/179085/…
-
好吧,它似乎并没有更好地工作......它需要大约 8 小时来迭代“仅”1000 万行......我尝试了两种解决方案......另一个想法?
标签: sqlite select sql-order-by pysqlite