sql >> Database >  >> RDS >> PostgreSQL

Hoe te wisselen tussen een geïndexeerde en niet-geïndexeerde bewerking afhankelijk van de invoer?

Ik denk niet dat het in pure SQL kan.

Het is vrij eenvoudig om dit te vertalen naar 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$

Ik heb geverifieerd dat het de geografische index <75 en de btree (reply_count, convo_id) gebruikt index op 75 en hoger.




  1. Wat te doen als een py.test stil blijft hangen?

  2. SQL:Hoe kunnen we een table1 JOIN table2 OP een tabel maken die in een veld in table1 staat?

  3. Wat is de snelste manier om 2 kolommen uit hetzelfde (willekeurige) record in MySQL te selecteren?

  4. vergelijk twee door komma's gescheiden waarden in mysql