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

PostgresでDjangoのテキストクエリの数を改善する方法

    SearchRankを削除した場合 クエリを使用してフィルタリングするだけで、GINインデックスが使用され、はるかに高速に実行されます。

    query = SearchQuery(termo,config='portuguese')
    entries = Article.objects.filter(search_vector=query)
    

    .explain()を追加できます 終了してクエリを確認し、インデックスが使用されているかどうかを確認します。

    print(entries.explain(analyze=True))
    

    ビットマップヒープスキャンを使用してクエリが表示され、実行時間がはるかに速くなるはずです。

    Bitmap Heap Scan on your_table
    ...
    Planning Time: 0.176 ms Execution Time: 0.453 ms
    

    上記のように注釈を付けると、すべてに注釈を付けることになります。 Article オブジェクト-したがって、postgresはSeqスキャン(またはParallel Seq Scan)を実行することを決定します。これはより効率的であると判断します。詳細情報こちら

    .explain(verbose=True)を追加してみてください または.explain(analyze=True) 比較する最初のSearchRankメソッドに。

    query = SearchQuery(termo,config='portuguese')
    search_rank = SearchRank(F('search_vector'), query)
    entries = Article.objects.annotate(rank=search_rank).filter(search_vector=query).order_by('-rank')
    
    print(entries.explain(analyze=True))
    

    私はこの問題に自分で直面しています。テーブルには、約10秒かかる990kエントリが含まれています。他のフィールドを使用してアノテーションの前にクエリをフィルタリングできる場合は、クエリプランナーをインデックスの使用に戻します。

    この回答 から




    1. SQLiteで

    2. SQLクエリで期間の合計を計算する

    3. MYSQLを使用してh:mm pm/am時刻形式をデータベースに挿入します

    4. SQL Server 2016:データベースのバックアップ