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-260654

Alessandro Jeanteur's questions

Martin Hope
Alessandro Jeanteur
Asked: 2024-12-10 05:09:11 +0800 CST

No postgres, por que (5999.999999999999::float8)::numeric = 6000?

  • 5

Vi algumas perguntas relacionadas, mas nenhuma deu uma resposta satisfatória para isso.

select
    ((5999.999999999999)::numeric) as num,
    ((5999.999999999999)::float8) as f64,
    ((5999.999999999999)::float8)::numeric as f64_to_num,
    ((5999.999999999999)::numeric)::float8 as num_to_f64;

      num          |      f64          | f64_to_num |      num_to_f64       
-------------------+-------------------+------------+-------------------
 5999.999999999999 | 5999.999999999999 |    6000    | 5999.999999999999
(1 row)

Isso é surpreendentemente inconsistente, porque um número que é representado no mesmo lugar em numeric e float8, eu não esperaria que ele fosse arredondado para cima ao converter.

O que está errado?

postgresql
  • 2 respostas
  • 46 Views
Martin Hope
Alessandro Jeanteur
Asked: 2022-09-15 08:26:31 +0800 CST

Como posso fazer consultas em conjuntos de dados distorcidos com mais desempenho no Postgres

  • 1

Eu tenho uma consulta aparentemente simples que infelizmente é extremamente lenta.

Acredito que sei por que é lento, mas não como torná-lo rápido, então gostaria de ver como isso poderia ser melhorado.

vamos chamar a tabela em questão de "PriceHistory", que rastreia o "preço" (número) para um "productId", tem milhões de linhas e milhares de entradas por productId.

Há um índice btree no productId e outro no preço.

Crucialmente (eu acho!) à medida que novos productIds são criados, seus dados de preço permanecem agrupados, então provavelmente há milhões de linhas relacionadas a diferentes productIds antes de chegar à primeira linha relacionada a um determinado productId.

Consulta super lenta:

EXPLAIN ANALYZE SELECT min(price) FROM PriceHistory WHERE productId = 'someId'

Result (cost=555.25..555.26 rows=1 width=32) (actual time=100084.212..100084.213 rows=1 loops=1)
 InitPlan 1 (returns $0)
 -> Limit (cost=0.43..555.25 rows=1 width=6) (actual time=100084.209..100084.209 rows=1 loops=1)
 -> Index Scan using "PriceHistory_btree_price" on "PriceHistory" (cost=0.43..2492270.00 rows=4492 width=6) (actual time=100084.207..100084.208 rows=1 loops=1)
 Index Cond: (price IS NOT NULL)
 Filter: ((productId)::text = 'someId'::text)
 Rows Removed by Filter: 1140612
Planning Time: 0.124 ms
Execution Time: 100084.230 ms

Consulta equivalente rápida que força o uso de um índice melhor

> EXPLAIN ANALYZE WITH x as (SELECT price_number FROM tradingcards_live."custom$0card_prices" where "card_custom_card" = '1348695171700984260__LOOKUP__1587446850514x224832321163624450') SELECT min(price_number) from x
Aggregate (cost=14964.82..14964.83 rows=1 width=32) (actual time=1584.004..1584.005 rows=1 loops=1)
 -> Index Scan using "PriceHistory_btree_productid" on "PriceHistory" (cost=0.56..14953.58 rows=4493 width=6) (actual time=0.909..1582.147 rows=4674 loops=1)
 Index Cond: ((productId)::text = 'someId'::text)
Planning Time: 0.149 ms
Execution Time: 1584.027 ms

Meu entendimento aqui é que as estatísticas básicas dizem ao postgres que o índice numérico do preço espera que ele atinja uma correspondência no productId "mais cedo", dado quantas linhas correspondem a algumId (neste caso, 4673 - então ~ dentro das primeiras 1000 linhas assumindo uma distribuição uniforme de 5 milhões de linhas), e talvez isso faça com que o postgres pense que é mais barato verificar os valores de preço até a primeira correspondência em vez de corresponder aos valores corretos do productId e fazer a agregação na memória.

Essa suposição está correta e como podemos fazer com que a consulta inicial escolha automaticamente o melhor índice, dada a distorção de dados - "valores que correspondem à coluna X são agrupados, não igualmente espalhados e altos o suficiente para que uma varredura percorrer muitas linhas primeiro" ?

postgresql postgresql-performance
  • 2 respostas
  • 25 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