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

Jak vyzkoušet více SELECTů, dokud nebude k dispozici výsledek?

LIKE bez zástupného znaku je ekvivalentní = . Za předpokladu, že jste skutečně mysleli name = 'text' .

Indexy jsou klíčem k výkonu.

Testovací nastavení

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

V ideálním případě vytvoříte dva indexy (kromě primárního klíče):

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

Druhý může není nutné, v závislosti na distribuci dat a dalších podrobnostech. Vysvětlení zde:

  • Je složený index vhodný také pro dotazy na první pole?

Dotaz

To by mělo být nejrychlejší možné dotaz pro váš případ:

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 Fiddle.

LIMIT klauzule se vztahuje na celý dotaz. Postgres je dostatečně chytrý, aby se nespustil pozdější větve UNION ALL jakmile najde dostatek řádků pro splnění LIMIT . Následně pro zápas v první SELECT dotazu, výstup EXPLAIN ANALYZE vypadá takto (posuňte se doprava! ):

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

Tučné zdůraznění moje.

Ne ne přidejte ORDER BY doložka , tím by se zrušil účinek. Pak by Postgres musel zvážit všechny řádky, než vrátí horní řádek.

Poslední otázky

Existuje na to obecné řešení?

Toto je generické řešení. Přidejte tolik SELECT prohlášení, jak chcete.

Samozřejmě by se to hodilo, kdyby byl výsledek vyhledávání seřazen podle jeho relevance.

Ve výsledku je pouze jeden řádek s LIMIT 1 . Druh třídění dutin.



  1. Jak získat skript dat SQL Serveru?

  2. Můžete mít v SQL logiku if-then-else?

  3. 2 způsoby, jak vypsat všechny uložené procedury v MySQL

  4. Klauzule SQL GROUP BY pro začátečníky