sql >> Databáze >  >> RDS >> PostgreSQL

Jak zlepšit počet textových dotazů pro Django s Postgres

Pokud vynecháte SearchRank a stačí filtrovat pomocí dotazu, použije index GIN a bude fungovat mnohem, mnohem rychleji:

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

Můžete přidat .explain() na konec, abyste se podívali na dotaz a zjistili, zda je index použit:

print(entries.explain(analyze=True))

Měli byste vidět dotaz pomocí Bitmap Heap Scan a doba provádění by měla být mnohem rychlejší.

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

Když přidáváte poznámky jako výše, přidáváte poznámky každý Article objekt - takže postgres se rozhodne provést Seq Scan (nebo Parallel Seq Scan), který je podle něj efektivnější. Další informace zde

Zkuste přidat .explain(verbose=True) nebo .explain(analyze=True) k vaší původní metodě SearchRank k porovnání.

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))

Sám čelím tomuto problému, s tabulkou s 990 000 záznamy, která trvá ~ 10 sekund. Pokud můžete filtrovat dotaz před anotací pomocí jakýchkoli jiných polí – posune to plánovač dotazů zpět k použití indexu.

Z této odpovědi




  1. Jak získat milisekundové časové razítko od roku 1970 UTC v Oracle SQL?

  2. vytvořit vlastní funkci pro rozdíl v datech s výjimkou víkendů a svátků v Oracle SQL

  3. Osvědčený vícejazyčný web

  4. Jak vytvořit další a předchozí odkazy pomocí php?