sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan skifter man mellem en indekseret og ikke-indekseret operation afhængigt af input?

Jeg tror ikke, det kan lade sig gøre i ren SQL.

Det er ret ligetil at oversætte dette til PL/pgSQL.

CREATE OR REPLACE FUNCTION public.usp_get_data(i_distance_choice integer, i_longitude double precision, i_latitude double precision)
 RETURNS TABLE(convo_id bigint)
 LANGUAGE plpgsql
 STABLE
AS $function$
    BEGIN
      IF i_distance_choice < 75 then
        return query SELECT po.convo_id
          FROM post po
          WHERE ST_DWithin(po.geog, ST_SetSRID(ST_MakePoint(i_longitude, i_latitude), 4326), i_distance_choice * 1609.34)
          ORDER BY po.reply_count DESC, convo_id DESC
          LIMIT 10;
      ELSE
        return query SELECT po.convo_id
          FROM post po
          WHERE po.geog<->ST_SetSRID(ST_MakePoint(i_longitude, i_latitude), 4326) < i_distance_choice * 1609.34
          ORDER BY po.reply_count DESC, convo_id DESC
          LIMIT 10;
      END IF;
    END
$function$

Jeg har bekræftet, at den bruger geografiindekset <75 og btræet (reply_count, convo_id) indeks ved 75 og derover.




  1. Sådan markeres et bestemt antal rækker i tabellen ved samtidig adgang

  2. system() returnerer -1, errno=10, når du er logget på Oracle

  3. Sådan fungerer LIKE-operatøren i SQLite

  4. hvordan kan jeg få alle id'er fra et givet id rekursivt i en postgresql-tabel, der refererer til sig selv?