我正在研究一个比较引擎,该引擎从许多折扣站点获取折扣,然后将其货架并堆放在特定商店中。
我有一个idlinks
表,该表将商店的折扣站点的ID与主商店列表相关联:
idlinks (rebate_site_id int,
store_id_from_site text,
store_id_master text)
然后,我在
rebates
表中为所有商店编译来自所有站点的折扣:rebates (rebate_site_id int,
store_id_from_site text,
rebate_amount text)
由于新的商店和折扣一直在出现,因此我想挑选出尚未与主列表相关的折扣。为此,我运行一个查询:
select * from rebates
left join idlinks on (rebates.rebate_site_id = idlinks.rebate_site_id and
rebates.store_id_from_site = idlinks.store_id_from_site)
where (idlinks.rebate_site_id is null and idlinks.store_id_from_site is null)
此方法有效,但是每个表中约3万行仅花费约5分钟,这似乎很长。我在不太古老的Windows 7计算机上使用Python中的sqlite3 3.7.4。我的代码:
import sqlite3
conn = sqlite3.connect('my.db')
c = conn.cursor()
c.execute('''<the SQL statement above>''')
conn.close()
我认为将所有两个表的两个字段进行比较一直很耗时。我认为,如果我一次只能比较一个特定的折扣站点,那会更快。基本上,分别对每个
rebate_site_id
执行此操作,然后合并:idlinks_1: select * from idlinks where rebate_site_id = 1
rebates_1: select * from rebates where rebate_site_id = 1
unmatched_1 = select * from rebates_1
left join idlinks_1
on rebates_1.store_id_from_site = idlinks_1.store_id_from_site
where idlinks_1.store_id_from_site is null
idlinks_1
和rebates_1
查询速度很快。我在子表上针对特定折扣站点测试了unmatched_1
查询,它的速度要快得多。我尝试使用子查询来执行此操作,但并没有缩短执行时间:
select * from rebates
left join (select * from idlinks where idlinks.rebate_site_id = 1)
on rebates.store_id_from_site = idlinks.store_id_from_site
where rebates.rebate_site_id = 1 and idlinks.store_id_from_site is null
有没有一种方法可以重写查询,使其仅对一个特定折扣站点的表部分执行联接?或者,是否可以将快速查询的结果输入另一个
execute
语句,而我可以遍历所有rebate_site_id
? 最佳答案
尝试创建索引:
CREATE INDEX idlinks_i1 ON idlinks(rebate_site_id,store_id_from_site);
CREATE INDEX rebates_i1 ON rebates(rebate_site_id,store_id_from_site);
这将加快您的第一个查询。