加速SQL语句以查找条件参数,从而产生一定数量的记录

时间:2012-12-14 05:40:18

标签: sql performance sqlite

为简单起见,我将问题转化为员工/工资问题。

拥有员工记录emp,例如:

| id | salary (in 1000s) |

根据“num”数字,找到工资“sal”,其中接收salary<=sal的员工人数为>=num(类似于统计中曲线问题下的区域) 。 我们使用的是Python和Sqlite,但问题并非特定于它们:

我正在做以下(天真的起始解决方案):

num = some_num
sal = 1000 # starting miminmum value
count = 0
while count < num:
    sql = 'select count(*) from (select 1 from emp where salary<=? limit ?)' 
    # using limit so that we don't keep counting more than num - might help (?)
    (count,) = cursor.execute(sql, (sal, num)).next() # using apsw sqlite adapter
    sal += 1000

print sal

我们如何才能提高效率? (算法上使用标准SQL或等价物,但不使用给定系统的怪癖)

否则:通过在记录中添加额外字段可以提高效率,可以在插入/更新操作上保持最新而不需要太多开销吗?

1 个答案:

答案 0 :(得分:1)

如果您正在使用准备好的声明,我相信您可以将准备步骤移出循环以使其更快。

sql = 'select count(*) from (select 1 from emp where salary<=? limit ?)' 
# using limit so that we don't keep counting more than num - might help (?)
while count < num:
    (count,) = cursor.execute(sql, (sal, num))
    sal += 1000

如果您还希望提高性能并且数据库大小相当小,则可以将整个数据加载到数组中并执行操作。

如果您先按工资对数组进行排序,我认为可以进一步优化。之后,您可以执行二元搜索到<条件翻转的位置,该点的索引+ 1将成为计数。

修改

解决方案比看起来简单。如果记录按工资排序,则#num'th记录的薪水将是所需的答案,因此这成为selecting the n'th row的问题:

num = some_num
sql = 'select salary from emp order by salary limit 1 offset ?'
(sal,) = cursor.execute(sql, (num-1,)).next()
print sal