我的SQLite内部连接在每个数据集的10Gb数据上存在效率问题。
我正在运行以下内容,
CREATE TABLE merged AS
SELECT * FROM xrootd
INNER JOIN condor ON
SUBSTR(xrootd.[U.mAppInfo], 0, INSTR(xrootd.[U.mAppInfo], '_')) ==
SUBSTR(condor.User, 6, INSTR(condor.User, '@'))
AND abs(xrootd.[F.mOpenTime] - condor.JobStartDate) <= 60;
我让它在周末没有时间限制的情况下继续运行,但它没有完成,所以我停止了它以添加时间限制因为我担心它可能会产生大量的数据来解释长期运行时间。
SQL列看起来像,
sqlite> SELECT [U.mAppInfo], [F.mOpenTime] FROM xrootd LIMIT 5;
U.mAppInfo|F.mOpenTime
drberry_ST_t-channel_4f_leptonDecays_13TeV_1fv53a_156_1_vrm|1439703600.0
drberry_QCD_Pt_600to800_TuneCUETP8M1_13TeV_7ys53a_79_1_oLf|1439705100.0
drberry_ST_t-channel_4f_leptonDecays_13TeV_1fv53a_176_1_uwo|1439703660.0
drberry_QCD_Pt_800to1000_TuneCUETP8M1_13TeV_r5d9t3_72_1_6S1|1439705050.0
sqlite> SELECT User, JobStartDate FROM condor LIMIT 5;
uscms5616@cms|1439764892.0
uscms5050@cms|1439615574.0
uscms5111@cms|1439965560.0
uscms3850@cms|1440081782.0
uscms3850@cms|1440081527.0
有没有更好的方法呢?我尝试过简单的BASH(停止因为事实并非如此简单)和Python(内存溢出)。我可以从CERN获得根树格式的数据,但SQLite似乎更好。
我的想法
我宁愿在不知道什么可能效果更好的情况下连续几天运行,但我会让它在同一时间运行。
答案 0 :(得分:1)
对我跳出的第一件事就是你在JOIN中得到的等同于WHERE子句:
AND abs(xrootd.[F.mOpenTime] - condor.JobStartDate) <= 60;
尝试将其移至WHERE子句,看看它是否加快了速度:
CREATE TABLE merged AS
SELECT *
FROM xrootd
INNER JOIN condor
ON SUBSTR(xrootd.[U.mAppInfo], 0, INSTR(xrootd.[U.mAppInfo], '_')) == SUBSTR(condor.User, 6, INSTR(condor.User, '@'))
WHERE abs(xrootd.[F.mOpenTime] - condor.JobStartDate) <= 60;
为了进一步提供帮助,我们需要更多细节。
您宣布了哪些索引?
关于使用已计算的子字符串创建新表的观点听起来是值得的,特别是如果你放入一些适当的索引。
答案 1 :(得分:-1)
有更好的方法吗?是的,当您的数据很大时,请不要使用SQLite。使用功能齐全的DBMS。