为什么我的两个SQL迭代不同?

时间:2011-08-05 02:00:39

标签: sqlalchemy iteration

我在python中有以下SQLAlchemy迭代:

for business in session.query(Business).filter(Business.name.like("%" + term + "%")):
    print business.name  

我的列表中有大约7000个企业,运行时间不到10毫秒。太好了!
但是,我想支持比特定更具体的搜索算法 - 例如,我想匹配&和,等等。所以,我尝试了以下内容:

for business in session.query(Business):
    if term in business.name:
        print business.name

后者需要大约600毫秒才能运行。 SQLAlchemy在其过滤调用中做了什么使迭代变得更快?我怎样才能让我更快?

谢谢!

1 个答案:

答案 0 :(得分:0)

SA无法优化您的查询 你有的不同之处是:

  1. 直接在RDBMS上过滤数据
  2. 所有行从数据库加载到内存中,然后过滤掉那些不需要的行。
  3. 显然,第二个版本会慢很多,特别是如果行数很大的话。事实上,SA甚至可能导致第二个版本变慢,因为它为数据库中的每一行创建Business个对象,这取决于您的模型可能是相对昂贵的操作。此外,如果您有急切负载关系,它也会加载它们。只需直接在数据库下面运行两个查询,看看每个返回多少行:

    SELECT * FROM Business WHERE Name LIKE '%term%';
    SELECT * FROM Business;
    

    我建议对大量对象使用SQL引擎过滤功能,因为你可以更有效地直接进行大部分过滤