2011-08-05 13 views
0

私はPythonで、次のSQLAlchemyの繰り返しを持っている:2つのSQL反復が異なるのはなぜですか?

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

私は私のリストでは約7000の企業があり、これは下の10ミリ秒で実行されます。すばらしいです!
しかし、より具体的な検索アルゴリズムをサポートしたいと思います。たとえば、&とandなどを一致させたいとします。そこで、私は以下を試した:

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

後者は実行するのに約600msかかる。フィルタコールでSQLAlchemyは何をしているのですか?私はどのようにしてより速くできますか?

ありがとうございます!

答えて

0

SAでは、クエリを最適化することはありません。必要とされていないものを除外し、その後、メモリにデータベースからRDBMS直接負荷

  • 一方と
  • すべての 行の

    1. フィルタデータ:あなたが持っている
      違いが間にあります。

    明らかに、2番目のバージョンは、特に行数が多い場合にはるかに遅くなります。実際には、SAはデータベースのすべての行に対してBusiness個のオブジェクトを作成するため、2番目のバージョンの処理速度が遅くなる場合があります。さらに、eager-load関係があれば、それもロードされます。あなたがはるかに効率的に直接そこにフィルタリングのほとんどを行うことができますように私は、多数のオブジェクトのためのSQLエンジンのフィルタリング機能を使用することをお勧めし

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

    :どれだけ多くの行の各リターン見るために直接データベースに対して下の2つのクエリを実行します

    +0

    ありがとうございます!そのようなフィルタリング機能を提案できますか?私はSQLiteで作業していますが、MySQLもオプションです。 – Raiders

    +0

    @Raiders。私は特別なフィルタリング機能を意味するのではなく、 'WHERE'ステートメントを意味します。実際の違いは、この場合、データベースからデータ行を読み込んでPythonオブジェクトを作成するだけですが、現在の設定では** ALL **行をテーブルから読み込み、Pythonオブジェクトを作成して破棄します一部;それらのオブジェクトはまだすべてがメモリにとどまります。 – van

    関連する問題