我正在研究一个比较引擎,该引擎从许多折扣站点获取折扣,然后将其货架并堆放在特定商店中。

我有一个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_1rebates_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);


这将加快您的第一个查询。

08-19 21:59