sql >> Databasteknik >  >> RDS >> PostgreSQL

Sätt att prova flera SELECT tills ett resultat är tillgängligt?

LIKE utan jokertecken motsvarar = . Förutsatt att du faktiskt menade name = 'text' .

Index är nyckeln till prestanda.

Testa installationen

CREATE TABLE image (
  image_id serial PRIMARY KEY
, group_id int NOT NULL
, name     text NOT NULL
);

Helst skapar du två index (utöver primärnyckeln):

CREATE INDEX image_name_grp_idx ON image (name, group_id);
CREATE INDEX image_grp_idx ON image (group_id);

Den andra maj inte nödvändigt, beroende på datadistribution och andra detaljer. Förklaring här:

  • Är ett sammansatt index också bra för frågor i det första fältet?

Fråga

Detta bör vara snabbast möjliga fråga för ditt ärende:

SELECT * FROM image WHERE name = 'name105' AND group_id = 10
UNION ALL
SELECT * FROM image WHERE name = 'name105'
UNION ALL
SELECT * FROM image WHERE group_id = 10
LIMIT  1;

SQL-fiol.

LIMIT klausulen gäller för hela frågan. Postgres är smart nog att inte köra senare delen av UNION ALL så snart den har hittat tillräckligt många rader för att uppfylla LIMIT . Följaktligen för en match i den första SELECT av frågan, utdata från EXPLAIN ANALYZE ser ut så här (rulla åt höger! ):

Limit  (cost=0.00..0.86 rows=1 width=40) (actual time=0.045..0.046 rows=1 loops=1)
  Buffers: local hit=4
  ->  Result  (cost=0.00..866.59 rows=1002 width=40) (actual time=0.042..0.042 rows=1 loops=1)
        Buffers: local hit=4
        ->  Append  (cost=0.00..866.59 rows=1002 width=40) (actual time=0.039..0.039 rows=1 loops=1)
              Buffers: local hit=4
              ->  Index Scan using image_name_grp_idx on image  (cost=0.00..3.76 rows=2 width=40) (actual time=0.035..0.035 rows=1 loops=1)
                    Index Cond: ((name = 'name105'::text) AND (group_id = 10))
                    Buffers: local hit=4
              ->  Index Scan using image_name_grp_idx on image  (cost=0.00..406.36 rows=500 width=40) (never executed)
                    Index Cond: (name = 'name105'::text)
              ->  Index Scan using image_grp_idx on image  (cost=0.00..406.36 rows=500 width=40) (never executed)
                    Index Cond: (group_id = 10)
Total runtime: 0.087 ms

Djärv betoning min.

Gör det inte lägg till en ORDER BY klausul , detta skulle ogiltigförklara effekten. Då skulle Postgres behöva överväga alla rader innan den återvänder till den översta raden.

Sista frågor

Finns det en allmän lösning för det?

Detta är den generiska lösningen. Lägg till så många SELECT uttalanden som du vill.

Naturligtvis skulle det vara praktiskt när sökresultatet sorteras efter dess relevans.

Det finns bara en rad i resultatet med LIMIT 1 . Typ av tomrumssortering.



  1. Hur kan jag importera en databas med MySQL från terminal?

  2. Division ( / ) ger inte mitt svar i postgresql

  3. Rent sätt att använda postgresql-fönsterfunktioner i django ORM?

  4. Vad är SQLite-webbläsaren och hur använder man den?