AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-27210

oxfist's questions

Martin Hope
oxfist
Asked: 2014-02-07 04:38:19 +0800 CST

Como obter o tempo de execução da consulta em PL/pgSQL para ser tão rápido quanto o tempo de execução da consulta do console?

  • 3

Basicamente, quero atribuir o resultado de uma consulta a um atributo de tipo personalizado. No entanto, notei que a consulta diretamente do console do PostgreSQL foi de cerca de 0,071 ms e dentro da função foi de 0,400 ms e 0,170 ms após algumas chamadas. explain analyzeainda mostra o uso de índices no primeiro caso, mas não no segundo.

Aqui está o que estou fazendo.

CREATE OR REPLACE FUNCTION fun_isliked(
    par_client client.id%type,
    par_feed feed.id%type
)
RETURNS boolean
AS
$$
BEGIN
    RETURN (
        EXISTS(
            SELECT
                1
            FROM
                feedlike fl
            WHERE
                fl.client = par_client
                AND fl.feed = par_feed
                AND fl.state = 1
        )
    );
END;
$$ LANGUAGE plpgsql STABLE;

Aqui estão as saídas dos explain analyzedois casos descritos acima:

postgres=# explain analyze select exists (select 1 from feedlike where client = 13 and feed = 68 and state = 1);
                                                                  QUERY PLAN                                                                  
----------------------------------------------------------------------------------------------------------------------------------------------
 Result  (cost=8.30..8.31 rows=1 width=0) (actual time=0.037..0.037 rows=1 loops=1)
   InitPlan 1 (returns $0)
     ->  Index Scan using feedlike_client_feed_unique on feedlike  (cost=0.28..8.30 rows=1 width=0) (actual time=0.034..0.034 rows=1 loops=1)
           Index Cond: ((client = 13) AND (feed = 68))
           Filter: (state = 1)
 Total runtime: 0.086 ms

postgres=# explain analyze select * from fun_isliked(13, 68);
                                                QUERY PLAN                                                
----------------------------------------------------------------------------------------------------------
 Function Scan on fun_isliked  (cost=0.25..0.26 rows=1 width=1) (actual time=0.398..0.398 rows=1 loops=1)
 Total runtime: 0.416 ms

Qual é uma possível solução alternativa para obter efetivamente o mesmo tempo de execução dentro da função? É mesmo possível? Além disso, estou executando o PostgreSQL 9.3.

Descobri que essa pergunta no SO tinha o que eu precisava, mas depois de tentar de tudo na resposta selecionada e não ter sucesso em reduzir o tempo de execução, decidi fazer uma nova pergunta.

postgresql performance
  • 1 respostas
  • 2370 Views
Martin Hope
oxfist
Asked: 2014-01-28 04:07:20 +0800 CST

Como retornar corretamente um resultado de consulta apenas se não for NULL?

  • 4

Estou escrevendo uma função PL/pgSQL que cria um cursor para uma consulta que preciso verificar se ela retorna algo.

O que estou fazendo é isso:

  1. Execute a consulta
  2. Verifique se ele retorna algo.
  3. Caso contrário, duplique um parâmetro e execute a consulta novamente.
  4. Caso contrário, retorne todas as linhas da consulta.

Achei que verificar se a consulta retornava algo com um cursor era a melhor escolha, pois é uma consulta muito longa (juntando 5 tabelas e muitas colunas) e SELECT ... INTOnão parecia certo, porque eu teria que criar uma TYPEvez que o consulta tem colunas de uma tabela e uma coluna para um cálculo de distância.

O problema é que atualmente estou usando o cursor apenas para verificar se a consulta retornou algo dentro de um loop onde eu abro e fecho. Depois que a consulta retorna algo, saio do loop e retorno a consulta. Eu posso dizer imediatamente que esta é uma solução feia para o que eu preciso. Talvez alguém possa me ajudar com esta questão.

Aqui está um código que mostra o que estou fazendo atualmente.

CREATE FUNCTION store_distance(
    latitude double precision,
    longitude double precision,
    radius double precision,
    tries integer
)
RETURNS TABLE(
    store_id store.id%type,
    store_name store.name%type,
    distance double precision
)
AS
$$
DECLARE
    cur_stores CURSOR FOR
        SELECT
            store.id,
            store.name,
            get_distance(latitude, longitude, store.latitude, store.longitude) distance
        FROM
            store
        WHERE
            store.latitude BETWEEN (latitude - radius) AND (latitude + radius)
            AND store.longitude BETWEEN (longitude - radius) AND (longitude + radius)
        ORDER BY
            distance ASC;
    count int := 0;
    storerow RECORD;
BEGIN
    LOOP
        IF count = tries THEN
            EXIT;
        END IF;
        OPEN cur_stores;
        FETCH cur_stores INTO storerow;
        IF FOUND THEN
            EXIT;
        END IF;
        radius := radius * 2;
        count := count + 1;
        CLOSE cur_stores;
    END LOOP;
    RETURN QUERY
    SELECT
        store.id,
        store.name,
        get_distance(latitude, longitude, store.latitude, store.longitude) distance
    FROM
        store
    WHERE
        store.latitude BETWEEN (latitude - radius) AND (latitude + radius)
        AND store.longitude BETWEEN (longitude - radius) AND (longitude + radius)
    ORDER BY
        distance ASC;
END;
$$ LANGUAGE PLPGSQL;

Portanto, meu objetivo é fornecer coordenadas, raio e número de tentativas e tentar encontrar lojas nessa caixa de pesquisa. Se nenhuma loja for encontrada, dobro o raio e tento novamente até que algo seja retornado pela consulta ou até que o número de tentativas seja atingido.
A RETURN TABLEparte é basicamente porque quero voltar a distância, então RETURN SETOF storenão adiantou.

postgresql performance
  • 1 respostas
  • 3351 Views
Martin Hope
oxfist
Asked: 2014-01-21 04:45:15 +0800 CST

Como listar todas as colunas da tabela em ordem de classificação?

  • 10

Eu sei que \d table_namelista todas as colunas dessa tabela, mas existe uma maneira de listá-las em ordem alfabética?

postgresql table
  • 2 respostas
  • 18030 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve