sql >> データベース >  >> RDS >> PostgreSQL

このDjango(1.6)の注釈カウントが非常に遅いのはなぜですか?

    遅い理由 :単に2つのManyToManyフィールドによる注釈を使用した場合 次に、不要なこれらすべてのテーブルの大きな結合を作成します 一緒。評価する必要のある行のデカルト積のサイズは、およそHave.objects.count() * Want.objects.count()です。 。次にdistinct=Trueと書きました 最終的に重複するアイテムの数を制限して、無効な巨大な結果が得られないようにします。

    古いDjangoの修正:queryset.annotate(have_count=Count("have"))のみを使用する場合 distinct=Trueがなくても、正しい結果をすばやく得ることができます または同じ結果も明確に高速です。次に、Pythonによる2つのクエリの結果をメモリ内で組み合わせることができます。

    解決策 Django> =1.11で優れたソリューションが可能です (質問から2年後)クエリを使用して 2つのサブクエリHave用に1つ 1つはWant用です 、すべて1つのリクエストで。ただし、すべてのテーブルを混在させることはできません。

    from django.db.models import Count, OuterRef, Subquery
    
    sq = Collection.objects.filter(pk=OuterRef('pk')).order_by()
    have_count_subq = sq.values('have').annotate(have_count=Count('have')).values('have_count')
    want_count_subq = sq.values('want').annotate(have_count=Count('want')).values('want_count')
    queryset = queryset.annotate(have_count=Subquery(have_count_subq),
                                 want_count=Subquery(want_count_subq))
    

    確認str(my_queryset.query)を出力すると、遅いSQLクエリと修正されたSQLクエリの両方を確認できます。 上記のとおりです。




    1. SQL:2つのフィールドに基づく選択から重複する値を削除します

    2. RStudioをSQLServerに接続する

    3. JDBC / MySQLで動作しているTRANSACTION_REPEATABLE_READを確認するにはどうすればよいですか?

    4. Opencartカスタム管理領域->テーブルの最初のレコードのみを表示するクエリ