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 / dba / 问题

All perguntas(dba)

Martin Hope
kadircancetin
Asked: 2024-10-10 17:34:28 +0800 CST

ONDE A=x DISTINTO EM (B), com um índice composto em (A, B, C)

  • 7

Tenho uma tabela enorme com um índice composto em (A, B, C).

-- psql (13.16 (Debian 13.16-0+deb11u1), server 14.12)

\d index_a_b_c
         Index "public.index_a_b_c"
  Column  |         Type          | Key? | 
----------+-----------------------+------+
 A        | character varying(44) | yes  |
 B        | numeric(20,0)         | yes  |
 C        | numeric(20,0)         | yes  |
btree, for table "public.table_a_b_c"

Preciso de todos Bos s distintos.

Esta consulta é executada com Index Only Scan, mas, verifica todas as Acorrespondências. O que não é escala para o meu caso, pois para alguns As há milhões de linhas. Milhões de Index Only Scanlinhas são lentos.

EXPLAIN (ANALYZE true) 
SELECT DISTINCT ON ("B") "B"
  FROM "table_a_b_c"
 WHERE "A" = 'astring'

-- Execution time: 0.172993s
-- Unique  (cost=0.83..105067.18 rows=1123 width=5) (actual time=0.037..19.468 rows=67 loops=1)
--  ->  Index Only Scan using index_a_b_c on table_a_b_c  (cost=0.83..104684.36 rows=153129 width=5) (actual time=0.036..19.209 rows=1702 loops=1)
--        Index Cond: (A = 'astring'::text)
--        Heap Fetches: 351
-- Planning Time: 0.091 ms
-- Execution Time: 19.499 ms

Como você pode ver, ele executa mais de 1,7 mil linhas, filtra manualmente e retorna 67 linhas. 20 ms, obtendo dezenas de segundos quando 1,7 mil chega a milhões.

Também preciso de todos os maiores Cs para Bs distintos.

Mesma coisa que em 1) . Em teoria, o Postgres poderia conhecer possíveis Bs, e não precisaria verificar toda a lista correspondida a A.

EXPLAIN (ANALYZE true)
SELECT DISTINCT ON ("B") *
  FROM "table_a_b_c"
 WHERE "A" = 'astring'
 ORDER BY "B" DESC,
          "C" DESC

-- Execution time: 0.822705s 
-- Unique  (cost=0.83..621264.51 rows=1123 width=247) (actual time=0.957..665.927 rows=67 loops=1)
--   ->  Index Scan using index_a_b_c on table_a_b_c  (cost=0.83..620881.69 rows=153130 width=247) (actual time=0.955..664.408 rows=1702 loops=1)
--         Index Cond: (a = 'astring'::text)
-- Planning Time: 0.116 ms
-- Execution Time: 665.978 ms

Mas, por exemplo, isto é rápido:

SELECT * WHERE A="x" AND B=1 ORDER BY C DESC
  UNION
SELECT * WHERE A="x" AND B=2 ORDER BY C DESC
  UNION
....

para todos Bos s possíveis. É como um loop com número de Btempo.

Questões

a) O índice on não deveria (A, B, C)ser um superconjunto de (A, B)em teoria? (A, B)será super rápido para distinct.

b) Por que é difícil encontrar Bs distintos para o Postgres?

c) Como lidar com isso sem um novo índice?

postgresql
  • 1 respostas
  • 26 Views
Martin Hope
Chip Douglas
Asked: 2024-10-10 04:58:55 +0800 CST

Como resolvo um erro intermitente do Oracle ao tentar chamar uma dll externa: ORA-28576: conexão RPC perdida com o agente de procedimento externo?

  • 6

Estou vendo um erro oracle intermitente há algumas semanas ao tentar chamar um procedimento/dll externo. A mensagem recebida é:

ORA-28576: conexão RPC perdida com agente de procedimento externo

Alguém mais encontrou isso? Se sim, quais etapas foram tomadas para resolver? Estou usando o Oracle Standard Edition 19c com o patch mais recente, 19.24.0, e estou em um host Windows.

oracle
  • 1 respostas
  • 27 Views
Martin Hope
Sicilian-Najdorf
Asked: 2024-10-09 17:09:35 +0800 CST

Estatísticas de atualização automática - Plano de consulta ruim

  • 7

Tenho uma consulta que atinge uma tabela de 1,4 bilhão de linhas.

Tudo funciona bem com essa consulta, em menos de um segundo.

Então, uma vez a cada 5 dias, mais ou menos, as estatísticas de atualização automática entram em ação e a consulta começa a ser executada por quase 60 segundos. Ela adota um plano diferente.

Verifiquei e quando as estatísticas de atualização automática são ativadas, a taxa de amostragem é inferior a 1% da tabela.

Agora, minha pergunta é: uma atualização automática de estatísticas pode fazer com que o otimizador escolha um plano pior do que o anterior?

Posso ver que as estimativas do plano ruim são muito diferentes das do plano bom.

Bom plano:

insira a descrição da imagem aqui

Plano Ruim:

insira a descrição da imagem aqui

As estimativas estão claramente erradas para o plano ruim e, ainda assim, a quantidade de linhas retornadas pela consulta é a mesma.

Neste ponto, estou tentando confirmar se uma atualização automática de estatísticas pode fazer isso?

O que estou tentando agora é fazer uma atualização de estatísticas com uma amostra de 10% e ver o que acontece.

Atualização: Concluí uma atualização de estatísticas com taxa de amostragem de 10% e as consultas estão indo bem novamente.

Tornei isso uma tarefa a ser executada regularmente.

query-performance
  • 1 respostas
  • 69 Views
Martin Hope
mtbossa
Asked: 2024-10-07 20:30:50 +0800 CST

Mesma consulta, mesmos dados, um planejador de consulta de servidor custa 50.000, outro custa 100

  • 6
Esta pergunta foi migrada do Stack Overflow porque pode ser respondida no Database Administrators Stack Exchange. Migrada há 4 dias .

Estou executando duas instâncias RDS do Postgres 15 ( PostgreSQL 15.7 em x86_64-pc-linux-gnu, compilado pelo gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-12), 64 bits ) na AWS, uma para meu ambiente de preparação e outra para meu ambiente de produção . Estamos executando uma consulta que está demorando muito mais no ambiente de produção do que no ambiente de preparação . O ambiente de produção tem até menos dados do que o de preparação (pelo menos nas tabelas selecionadas/unidas). Além disso, o ambiente de produção não está sendo muito usado, estamos em um estágio inicial de teste, então há basicamente uma pessoa usando-o à noite para fins de teste.

Esta é a consulta:

SELECT arenas.id,
       arenas.display_name,
       arenas.cover_image_path,
       arenas.slug,
       addresses.zip_code,
       addresses.street,
       addresses.number,
       addresses.complement,
       addresses.district,
       addresses.latitude,
       addresses.longitude,
       cities.NAME                                       AS city_name,
       states.NAME                                       AS state_name,
       states.uf                                         AS state_uf,
       Array_to_json(Array_agg(DISTINCT ss2.sport_code)) AS available_sports,
       Earth_distance(Ll_to_earth (addresses.latitude, addresses.longitude),
       Ll_to_earth (-10.5555, -41.2751))                 AS
       meters_distance_between_user_and_arena
FROM   "arenas"
       INNER JOIN "addresses"
               ON "arenas"."id" = "addresses"."addressable_id"
                  AND "addresses"."addressable_type" = 'App\Models\Arena'
                  AND "addresses"."type" = 'COMMERCIAL'
                  AND Earth_distance(Ll_to_earth (addresses.latitude,
                                     addresses.longitude),
                          Ll_to_earth (-10.5555, -41.2751)) < 20000
       INNER JOIN "services"
               ON "services"."arena_id" = "arenas"."id"
                  AND "services"."status" = 'A'
                  AND "services"."deleted_at" IS NULL
                  AND "is_private" = false
       INNER JOIN "service_sport"
               ON "service_sport"."service_id" = "services"."id"
                  AND "service_sport"."sport_code" = 'BEACH_TENNIS'
       INNER JOIN "service_prices"
               ON "service_prices"."service_id" = "services"."id"
                  AND "service_prices"."is_default" = true
       INNER JOIN "field_service"
               ON "field_service"."service_id" = "services"."id"
       INNER JOIN "fields"
               ON "fields"."arena_id" = "arenas"."id"
                  AND "fields"."status" = 'A'
                  AND "fields"."deleted_at" IS NULL
       INNER JOIN "contacts"
               ON "contacts"."contactable_id" = "arenas"."id"
                  AND "contacts"."contactable_type" = 'App\Models\Arena'
                  AND "contacts"."is_main" = true
       INNER JOIN "field_time_slots"
               ON "field_time_slots"."arena_id" = "arenas"."id"
       INNER JOIN "cities"
               ON "cities"."ibge_code" = "addresses"."city_ibge_code"
       INNER JOIN "states"
               ON "states"."ibge_code" = "cities"."state_ibge_code"
       INNER JOIN "sports"
               ON "sports"."code" = "service_sport"."sport_code"
       INNER JOIN "service_sport" AS "ss2"
               ON "ss2"."arena_id" = "arenas"."id"
WHERE  "approved_at" IS NOT NULL
       AND EXISTS (SELECT *
                   FROM   "subscriptions"
                   WHERE  "arenas"."id" = "subscriptions"."arena_id"
                          AND "type" = 'access'
                          AND ( "ends_at" IS NULL
                                 OR ( "ends_at" IS NOT NULL
                                      AND "ends_at" > '2024-10-06 01:31:18' ) )
                          AND "stripe_status" != 'incomplete_expired'
                          AND "stripe_status" != 'unpaid'
                          AND "stripe_status" != 'past_due'
                          AND "stripe_status" != 'incomplete')
       AND "business_hours_data" IS NOT NULL
       AND "arenas"."deleted_at" IS NULL
GROUP  BY "arenas"."id",
          "arenas"."cover_image_path",
          "addresses"."latitude",
          "addresses"."longitude",
          "addresses"."zip_code",
          "addresses"."street",
          "addresses"."number",
          "addresses"."complement",
          "addresses"."district",
          "cities"."name",
          "states"."name",
          "states"."uf"
ORDER  BY "meters_distance_between_user_and_arena" ASC;

Esta é a ANÁLISE EXPLICATIVA do ambiente de produção :

Sort  (cost=55657.12..55795.57 rows=55380 width=315) (actual time=563.084..563.104 rows=1 loops=1)
  Sort Key: (sec_to_gc(cube_distance((ll_to_earth((addresses.latitude)::double precision, (addresses.longitude)::double precision))::cube, '(3491544.0649759113, -4339378.172513269, -3108045.069568795)'::cube)))
  Sort Method: quicksort  Memory: 25kB
  ->  GroupAggregate  (cost=12417.08..43152.98 rows=55380 width=315) (actual time=563.077..563.097 rows=1 loops=1)
        Group Key: arenas.id, addresses.latitude, addresses.longitude, addresses.zip_code, addresses.street, addresses.number, addresses.complement, addresses.district, cities.name, states.name, states.uf
        ->  Sort  (cost=12417.08..12555.53 rows=55380 width=286) (actual time=222.049..445.141 rows=102240 loops=1)
              Sort Key: arenas.id, addresses.latitude, addresses.longitude, addresses.zip_code, addresses.street, addresses.number, addresses.complement, addresses.district, cities.name, states.name, states.uf
              Sort Method: external merge  Disk: 28144kB
              ->  Hash Join  (cost=17.39..668.95 rows=55380 width=286) (actual time=0.709..15.847 rows=102240 loops=1)
                    Hash Cond: (arenas.id = field_time_slots.arena_id)
                    ->  Hash Join  (cost=9.60..37.48 rows=260 width=382) (actual time=0.604..1.425 rows=480 loops=1)
                          Hash Cond: (arenas.id = ss2.arena_id)
                          ->  Nested Loop  (cost=7.39..32.21 rows=52 width=339) (actual time=0.523..1.121 rows=96 loops=1)
                                ->  Seq Scan on sports  (cost=0.00..1.16 rows=1 width=9) (actual time=0.006..0.009 rows=1 loops=1)
                                      Filter: (code = 'BEACH_TENNIS'::text)
                                      Rows Removed by Filter: 12
                                ->  Hash Join  (cost=7.39..30.53 rows=52 width=350) (actual time=0.515..1.070 rows=96 loops=1)
                                      Hash Cond: (cities.state_ibge_code = states.ibge_code)
                                      ->  Nested Loop  (cost=5.78..28.77 rows=52 width=340) (actual time=0.488..0.953 rows=96 loops=1)
                                            ->  Nested Loop  (cost=5.49..11.03 rows=52 width=332) (actual time=0.466..0.640 rows=96 loops=1)
                                                  Join Filter: (arenas.id = services.arena_id)
                                                  ->  Nested Loop  (cost=2.05..4.72 rows=4 width=305) (actual time=0.422..0.444 rows=4 loops=1)
                                                        Join Filter: (arenas.id = fields.arena_id)
                                                        ->  Nested Loop  (cost=2.05..3.62 rows=1 width=289) (actual time=0.412..0.417 rows=1 loops=1)
                                                              Join Filter: (arenas.id = addresses.addressable_id)
                                                              ->  Merge Join  (cost=2.05..2.08 rows=1 width=174) (actual time=0.023..0.027 rows=1 loops=1)
                                                                    Merge Cond: (arenas.id = contacts.contactable_id)
                                                                    ->  Sort  (cost=1.02..1.02 rows=1 width=158) (actual time=0.012..0.013 rows=1 loops=1)
                                                                          Sort Key: arenas.id
                                                                          Sort Method: quicksort  Memory: 25kB
                                                                          ->  Seq Scan on arenas  (cost=0.00..1.01 rows=1 width=158) (actual time=0.006..0.006 rows=1 loops=1)
                                                                                Filter: ((approved_at IS NOT NULL) AND (business_hours_data IS NOT NULL) AND (deleted_at IS NULL))
                                                                    ->  Sort  (cost=1.03..1.04 rows=1 width=16) (actual time=0.008..0.009 rows=1 loops=1)
                                                                          Sort Key: contacts.contactable_id
                                                                          Sort Method: quicksort  Memory: 25kB
                                                                          ->  Seq Scan on contacts  (cost=0.00..1.02 rows=1 width=16) (actual time=0.006..0.006 rows=1 loops=1)
                                                                                Filter: (is_main AND ((contactable_type)::text = 'App\Models\Arena'::text))
                                                                                Rows Removed by Filter: 1
                                                              ->  Seq Scan on addresses  (cost=0.00..1.52 rows=1 width=115) (actual time=0.386..0.387 rows=1 loops=1)
                                                                    Filter: (((addressable_type)::text = 'App\Models\Arena'::text) AND ((type)::text = 'COMMERCIAL'::text) AND (sec_to_gc(cube_distance((ll_to_earth((latitude)::double precision, (longitude)::double precision))::cube, '(3491544.0649759113, -4339378.172513269, -3108045.069568795)'::cube)) < '20000'::double precision))
                                                        ->  Seq Scan on fields  (cost=0.00..1.05 rows=4 width=16) (actual time=0.009..0.020 rows=4 loops=1)
                                                              Filter: ((deleted_at IS NULL) AND ((status)::text = 'A'::text))
                                                  ->  Materialize  (cost=3.43..5.57 rows=13 width=27) (actual time=0.011..0.035 rows=24 loops=4)
                                                        ->  Hash Join  (cost=3.43..5.50 rows=13 width=27) (actual time=0.041..0.092 rows=24 loops=1)
                                                              Hash Cond: (service_prices.service_id = service_sport.service_id)
                                                              ->  Seq Scan on service_prices  (cost=0.00..1.75 rows=36 width=8) (actual time=0.006..0.032 rows=36 loops=1)
                                                                    Filter: is_default
                                                                    Rows Removed by Filter: 39
                                                              ->  Hash  (cost=3.41..3.41 rows=2 width=51) (actual time=0.030..0.036 rows=3 loops=1)
                                                                    Buckets: 1024  Batches: 1  Memory Usage: 9kB
                                                                    ->  Hash Join  (cost=2.20..3.41 rows=2 width=51) (actual time=0.025..0.034 rows=3 loops=1)
                                                                          Hash Cond: (service_sport.service_id = services.id)
                                                                          ->  Hash Join  (cost=1.07..2.27 rows=3 width=27) (actual time=0.014..0.019 rows=3 loops=1)
                                                                                Hash Cond: (field_service.service_id = service_sport.service_id)
                                                                                ->  Seq Scan on field_service  (cost=0.00..1.13 rows=13 width=8) (actual time=0.003..0.004 rows=13 loops=1)
                                                                                ->  Hash  (cost=1.06..1.06 rows=1 width=19) (actual time=0.005..0.006 rows=1 loops=1)
                                                                                      Buckets: 1024  Batches: 1  Memory Usage: 9kB
                                                                                      ->  Seq Scan on service_sport  (cost=0.00..1.06 rows=1 width=19) (actual time=0.003..0.004 rows=1 loops=1)
                                                                                            Filter: (sport_code = 'BEACH_TENNIS'::text)
                                                                                            Rows Removed by Filter: 4
                                                                          ->  Hash  (cost=1.07..1.07 rows=4 width=24) (actual time=0.008..0.009 rows=4 loops=1)
                                                                                Buckets: 1024  Batches: 1  Memory Usage: 9kB
                                                                                ->  Seq Scan on services  (cost=0.00..1.07 rows=4 width=24) (actual time=0.004..0.006 rows=4 loops=1)
                                                                                      Filter: ((deleted_at IS NULL) AND (NOT is_private) AND ((status)::text = 'A'::text))
                                                                                      Rows Removed by Filter: 2
                                            ->  Memoize  (cost=0.29..8.31 rows=1 width=24) (actual time=0.001..0.001 rows=1 loops=96)
                                                  Cache Key: addresses.city_ibge_code
                                                  Cache Mode: logical
                                                  Hits: 95  Misses: 1  Evictions: 0  Overflows: 0  Memory Usage: 1kB
                                                  ->  Index Scan using cities_ibge_code_unique on cities  (cost=0.28..8.30 rows=1 width=24) (actual time=0.016..0.016 rows=1 loops=1)
                                                        Index Cond: (ibge_code = addresses.city_ibge_code)
                                      ->  Hash  (cost=1.27..1.27 rows=27 width=16) (actual time=0.020..0.020 rows=27 loops=1)
                                            Buckets: 1024  Batches: 1  Memory Usage: 10kB
                                            ->  Seq Scan on states  (cost=0.00..1.27 rows=27 width=16) (actual time=0.006..0.010 rows=27 loops=1)
                          ->  Hash  (cost=2.15..2.15 rows=5 width=43) (actual time=0.076..0.078 rows=5 loops=1)
                                Buckets: 1024  Batches: 1  Memory Usage: 9kB
                                ->  Nested Loop  (cost=1.03..2.15 rows=5 width=43) (actual time=0.070..0.074 rows=5 loops=1)
                                      Join Filter: (ss2.arena_id = subscriptions.arena_id)
                                      ->  HashAggregate  (cost=1.03..1.04 rows=1 width=16) (actual time=0.060..0.061 rows=1 loops=1)
                                            Group Key: subscriptions.arena_id
                                            Batches: 1  Memory Usage: 24kB
                                            ->  Seq Scan on subscriptions  (cost=0.00..1.02 rows=1 width=16) (actual time=0.008..0.009 rows=1 loops=1)
                                                  Filter: (((ends_at IS NULL) OR ((ends_at IS NOT NULL) AND (ends_at > '2024-10-06 01:31:18'::timestamp without time zone))) AND ((stripe_status)::text <> 'incomplete_expired'::text) AND ((stripe_status)::text <> 'unpaid'::text) AND ((stripe_status)::text <> 'past_due'::text) AND ((stripe_status)::text <> 'incomplete'::text) AND ((type)::text = 'access'::text))
                                      ->  Seq Scan on service_sport ss2  (cost=0.00..1.05 rows=5 width=27) (actual time=0.006..0.007 rows=5 loops=1)
                    ->  Hash  (cost=5.13..5.13 rows=213 width=16) (actual time=0.098..0.099 rows=213 loops=1)
                          Buckets: 1024  Batches: 1  Memory Usage: 18kB
                          ->  Seq Scan on field_time_slots  (cost=0.00..5.13 rows=213 width=16) (actual time=0.023..0.055 rows=213 loops=1)
Planning Time: 8.780 ms
Execution Time: 568.033 ms

Esta é a EXPLAIN ANALYSE do ambiente de preparação :

Sort  (cost=102.30..102.31 rows=2 width=405) (actual time=85.416..85.430 rows=1 loops=1)
  Sort Key: (sec_to_gc(cube_distance((ll_to_earth((addresses.latitude)::double precision, (addresses.longitude)::double precision))::cube, '(3491544.0649759113, -4339378.172513269, -3108045.069568795)'::cube)))
  Sort Method: quicksort  Memory: 25kB
  ->  GroupAggregate  (cost=101.18..102.29 rows=2 width=405) (actual time=85.406..85.420 rows=1 loops=1)
        Group Key: arenas.id, addresses.latitude, addresses.longitude, addresses.zip_code, addresses.street, addresses.number, addresses.complement, addresses.district, cities.name, states.name, states.uf
        ->  Sort  (cost=101.18..101.19 rows=2 width=397) (actual time=65.212..66.575 rows=10800 loops=1)
              Sort Key: arenas.id, addresses.latitude, addresses.longitude, addresses.zip_code, addresses.street, addresses.number, addresses.complement, addresses.district, cities.name, states.name, states.uf
              Sort Method: quicksort  Memory: 3448kB
              ->  Nested Loop  (cost=72.78..101.17 rows=2 width=397) (actual time=34.249..43.485 rows=10800 loops=1)
                    ->  Index Only Scan using sports_pkey on sports  (cost=0.15..8.17 rows=1 width=32) (actual time=0.019..0.024 rows=1 loops=1)
                          Index Cond: (code = 'BEACH_TENNIS'::text)
                          Heap Fetches: 1
                    ->  Hash Join  (cost=72.63..92.98 rows=2 width=429) (actual time=34.228..41.163 rows=10800 loops=1)
                          Hash Cond: (ss2.arena_id = arenas.id)
                          ->  Seq Scan on service_sport ss2  (cost=0.00..17.50 rows=750 width=48) (actual time=0.004..0.011 rows=5 loops=1)
                          ->  Hash  (cost=72.62..72.62 rows=1 width=493) (actual time=34.210..34.221 rows=2700 loops=1)
                                Buckets: 4096 (originally 1024)  Batches: 1 (originally 1)  Memory Usage: 1053kB
                                ->  Nested Loop  (cost=50.45..72.62 rows=1 width=493) (actual time=0.641..31.447 rows=2700 loops=1)
                                      ->  Nested Loop  (cost=50.30..72.44 rows=1 width=452) (actual time=0.629..23.566 rows=2700 loops=1)
                                            ->  Nested Loop Semi Join  (cost=50.01..64.14 rows=1 width=468) (actual time=0.617..7.491 rows=2700 loops=1)
                                                  Join Filter: (arenas.id = subscriptions.arena_id)
                                                  ->  Hash Join  (cost=49.88..61.77 rows=8 width=452) (actual time=0.605..2.421 rows=2700 loops=1)
                                                        Hash Cond: (field_time_slots.arena_id = arenas.id)
                                                        ->  Seq Scan on field_time_slots  (cost=0.00..10.23 rows=423 width=16) (actual time=0.004..0.047 rows=423 loops=1)
                                                        ->  Hash  (cost=49.86..49.86 rows=1 width=436) (actual time=0.589..0.596 rows=18 loops=1)
                                                              Buckets: 1024  Batches: 1  Memory Usage: 14kB
                                                              ->  Nested Loop  (cost=9.47..49.86 rows=1 width=436) (actual time=0.317..0.582 rows=18 loops=1)
                                                                    Join Filter: (arenas.id = contacts.contactable_id)
                                                                    Rows Removed by Join Filter: 18
                                                                    ->  Nested Loop  (cost=9.47..48.81 rows=1 width=420) (actual time=0.312..0.543 rows=18 loops=1)
                                                                          Join Filter: (services.id = service_sport.service_id)
                                                                          ->  Nested Loop  (cost=9.32..48.58 rows=1 width=412) (actual time=0.299..0.474 rows=58 loops=1)
                                                                                Join Filter: (services.id = field_service.service_id)
                                                                                ->  Nested Loop  (cost=0.57..34.38 rows=1 width=404) (actual time=0.289..0.377 rows=34 loops=1)
                                                                                      Join Filter: (arenas.id = fields.arena_id)
                                                                                      Rows Removed by Join Filter: 30
                                                                                      ->  Nested Loop  (cost=0.42..26.21 rows=1 width=388) (actual time=0.279..0.335 rows=16 loops=1)
                                                                                            Join Filter: (services.id = service_prices.service_id)
                                                                                            Rows Removed by Join Filter: 76
                                                                                            ->  Nested Loop  (cost=0.42..25.01 rows=1 width=380) (actual time=0.272..0.305 rows=4 loops=1)
                                                                                                  Join Filter: (addresses.addressable_id = arenas.id)
                                                                                                  ->  Nested Loop  (cost=0.28..16.84 rows=1 width=268) (actual time=0.262..0.288 rows=4 loops=1)
                                                                                                        Join Filter: (addresses.addressable_id = services.arena_id)
                                                                                                        Rows Removed by Join Filter: 4
                                                                                                        ->  Index Scan using addresses_addressable_type_addressable_id_index on addresses  (cost=0.14..8.67 rows=1 width=244) (actual time=0.254..0.272 rows=2 loops=1)
                                                                                                              Index Cond: ((addressable_type)::text = 'App\Models\Arena'::text)
                                                                                                              Filter: (((type)::text = 'COMMERCIAL'::text) AND (sec_to_gc(cube_distance((ll_to_earth((latitude)::double precision, (longitude)::double precision))::cube, '(3491544.0649759113, -4339378.172513269, -3108045.069568795)'::cube)) < '20000'::double precision))
                                                                                                        ->  Index Scan using services_arena_id_name_deleted_at_unique on services  (cost=0.14..8.16 rows=1 width=24) (actual time=0.004..0.006 rows=4 loops=2)
                                                                                                              Filter: ((NOT is_private) AND ((status)::text = 'A'::text))
                                                                                                              Rows Removed by Filter: 1
                                                                                                  ->  Index Scan using arenas_pkey on arenas  (cost=0.14..8.16 rows=1 width=112) (actual time=0.003..0.003 rows=1 loops=4)
                                                                                                        Index Cond: (id = services.arena_id)
                                                                                                        Filter: ((approved_at IS NOT NULL) AND (business_hours_data IS NOT NULL) AND (deleted_at IS NULL))
                                                                                            ->  Seq Scan on service_prices  (cost=0.00..1.12 rows=6 width=8) (actual time=0.002..0.004 rows=23 loops=4)
                                                                                                  Filter: is_default
                                                                                      ->  Index Scan using fields_arena_id_name_deleted_at_unique on fields  (cost=0.14..8.16 rows=1 width=16) (actual time=0.001..0.002 rows=4 loops=16)
                                                                                            Filter: ((status)::text = 'A'::text)
                                                                                ->  Bitmap Heap Scan on field_service  (cost=8.76..14.14 rows=5 width=8) (actual time=0.001..0.001 rows=2 loops=34)
                                                                                      Recheck Cond: (service_id = service_prices.service_id)
                                                                                      Heap Blocks: exact=34
                                                                                      ->  Bitmap Index Scan on field_service_arena_id_service_id_field_id_unique  (cost=0.00..8.76 rows=5 width=0) (actual time=0.001..0.001 rows=2 loops=34)
                                                                                            Index Cond: (service_id = service_prices.service_id)
                                                                          ->  Index Only Scan using service_sport_service_id_sport_code_unique on service_sport  (cost=0.15..0.22 rows=1 width=40) (actual time=0.001..0.001 rows=0 loops=58)
                                                                                Index Cond: ((service_id = field_service.service_id) AND (sport_code = 'BEACH_TENNIS'::text))
                                                                                Heap Fetches: 18
                                                                    ->  Seq Scan on contacts  (cost=0.00..1.04 rows=1 width=16) (actual time=0.001..0.001 rows=2 loops=18)
                                                                          Filter: (is_main AND ((contactable_type)::text = 'App\Models\Arena'::text))
                                                                          Rows Removed by Filter: 1
                                                  ->  Index Scan using subscriptions_arena_id_stripe_status_index on subscriptions  (cost=0.14..0.28 rows=1 width=16) (actual time=0.001..0.001 rows=1 loops=2700)
                                                        Index Cond: (arena_id = field_time_slots.arena_id)
                                                        Filter: (((ends_at IS NULL) OR ((ends_at IS NOT NULL) AND (ends_at > '2024-10-06 01:31:18'::timestamp without time zone))) AND ((stripe_status)::text <> 'incomplete_expired'::text) AND ((stripe_status)::text <> 'unpaid'::text) AND ((stripe_status)::text <> 'past_due'::text) AND ((stripe_status)::text <> 'incomplete'::text) AND ((type)::text = 'access'::text))
                                            ->  Index Scan using cities_ibge_code_unique on cities  (cost=0.28..8.30 rows=1 width=24) (actual time=0.005..0.005 rows=1 loops=2700)
                                                  Index Cond: (ibge_code = addresses.city_ibge_code)
                                      ->  Index Scan using states_pkey on states  (cost=0.15..0.18 rows=1 width=56) (actual time=0.002..0.002 rows=1 loops=2700)
                                            Index Cond: (ibge_code = cities.state_ibge_code)
Planning Time: 6.426 ms
Execution Time: 85.641 ms

Alguma ideia do por que isso pode estar acontecendo? Não foquei no desempenho porque estamos em um estágio inicial e pensei que não importaria agora porque temos tão poucos dados.

Já tentamos atualizar a instância do servidor de um db.t3.micro para db.t3.small, nada mudou. Também tentamos restaurá-lo em outra zona de disponibilidade, nada aconteceu. Tentei restaurar o dump de produção localmente e executar a consulta, e custou 6000, mas ainda assim, muito menos que 50000. Ao executar a consulta em um ambiente de desenvolvimento local, também custa 100.

Obviamente, posso reescrever e melhorar essa consulta, farei isso muito em breve. Mas eu realmente gostaria de entender o que está acontecendo aqui.

EDIT: quantidade de dados

WITH tbl AS
  (SELECT table_schema,
          TABLE_NAME
   FROM information_schema.tables
   WHERE TABLE_NAME not like 'pg_%'
     AND table_schema in ('public'))
SELECT sum((xpath('/row/c/text()', query_to_xml(format('select count(*) as c from %I.%I', table_schema, TABLE_NAME), FALSE, TRUE, '')))[1]::text::int) AS rows_n
FROM tbl
ORDER BY rows_n DESC;

Quantidade de produção de linhas em cada tabela: https://pastebin.com/7gj5PxRw

Quantidade de linhas de preparação em cada tabela: https://pastebin.com/507x3mP0

EDIT 2: A sugestão de Laurenz realmente ajudou, e o Tempo de Execução melhorou, no entanto, ainda não consigo entender por que o plano tinha tantas linhas. Eu realmente gostaria de me aprofundar nisso. Por enquanto, separei essa consulta em 2 consultas distintas, e o desempenho aumentou abruptamente.

postgresql
  • 1 respostas
  • 23 Views
Martin Hope
Simon A
Asked: 2024-10-09 16:41:19 +0800 CST

O SQL Server faz CU+GDR também instala o CU e o GDR

  • 8

Estou tentando determinar se as atualizações CU+GDR instalam a CU além do GDR.

Acho que entendo as diferenças entre CUs e as correções de segurança do GDR. E os diferentes caminhos que você pode seguir, CU ou GDR.

No entanto, para o SQL Server 2019, este site https://learn.microsoft.com/en-us/troubleshoot/sql/releases/download-and-install-latest-updates mostra

Servidor SQL 2019

RDA (15.0.2125.1 - Outubro de 2024)

CU28 para 2019 (15.0.4385.2 - agosto de 2024)

CU28 + GDR (15.0.4395.2 - Outubro de 2024)

O KB para 15.0.4395.2 mostra KB5046060 - Descrição da atualização de segurança para SQL Server 2019 CU28: 8 de outubro de 2024 "Para aplicar esta atualização, você deve ter o SQL Server 2019 ou qualquer versão do SQL Server 2019 CU por meio deste SQL Server 2019 CU28 GDR instalado." Portanto, ele pode ser instalado sobre qualquer CU anterior.

Além disso, isso não lista as correções no CU28, apenas as correções do GDR.

Após instalar 15.0.4390.2 minha versão mostra Microsoft SQL Server 2019 (RTM-CU28-GDR) (KB5042749) - 15.0.4390.2

(diferente das atualizações 15.0.4395.2, mas esta é a atualização de setembro CU28+GDR KB5042749 - Descrição da atualização de segurança para SQL Server 2019 CU28: 10 de setembro de 2024)

Mas indica que o CU28 foi instalado.

Mas, o CU28 nunca foi instalado individualmente. CUs anteriores foram instaladas. E se eu tento instalar o CU28 depois do CU28+GDR, ele diz que nenhuma atualização é necessária.

Então minha pergunta é: 'A atualização CU28+GDR instala o CU 28 e também a atualização de segurança GDR?'

Se não, as informações da versão são muito enganosas. E eu tenho que desinstalar o CU28+GDR para instalar o CU28?

Obrigado pela ajuda.

sql-server
  • 1 respostas
  • 309 Views
Martin Hope
Di Si
Asked: 2024-10-09 02:34:40 +0800 CST

É possível adicionar um hot standby do PostgreSQL usando pg_createcluster a um primário criado com initdb?

  • 5

Olá, estamos usando o PostgreSQL 16 no Ubuntu 22 LTS e construímos um cluster usando initdb. Estou pensando se é possível reconstruir um standby usando pg_createcluster em vez de aproveitar várias ferramentas de administração e juntá-lo ao cluster para que possamos eventualmente fazer failover (usamos repmgr) e, em seguida, remover os nós antigos e reconstruí-los usando pg_createcluster também.

Pelo que entendi, o pg_createcluster é essencialmente um wrapper em torno do initdb. Infelizmente, estando em produção, simplesmente reconstruir o cluster inteiro não é possível, então nossa escolha é viver com ele tendo sido construído usando o initdb ou adicionar/remover nós até que o cluster inteiro seja reconstruído com o pg_createcluster.

postgresql
  • 1 respostas
  • 28 Views
Martin Hope
M.A. Heshmat Khah
Asked: 2024-10-09 00:55:28 +0800 CST

Pesquisa de texto completo e sem acento do PostgreSQL para árabe/persa

  • 8

Estou usando um aplicativo que usa PostgreSQL como seu banco de dados e ele usa a unaccentextensão para normalizar texto. Quero melhorar sua funcionalidade de pesquisa modificando o unaccent.rulesarquivo.

Eu edito /usr/share/postgresql/16/tsearch_data/unaccent.rulese adiciono algumas regras para o bloco unicode árabe ( U+0600paraU+06ff ):

۰   0
۱   1
۲   2
۳   3
۴   4
۵   5
۶   6
۷   7
۸   8
۹   9
َ

e está funcionando bem.

SELECT unaccent('سَلام ۱۳۲');
 unaccent
----------
 سلام 123
(1 row)

Problema 1:

O problema é com o Zero Width Non-Joiner (ZWNJ - U+200C). Ele deve ser substituído por espaço ( U+0020).

سَلام‌علیکم->سلام علیکم

O que eu tentei:

Tentei essas linhas, mas nenhuma delas funciona ou dá erro:

  • "‌" " ": invalid syntax: more than two strings in unaccent rule(aviso) + não funcionou.
  • ‌ " ": invalid syntax: more than two strings in unaccent rule(aviso) + não funcionou.
  • \u200C \u0020: Sugerido pelo ChatGPT, mas não funcionou.
  • \u200C " ": Sugerido pelo ChatGPT, mas não funcionou.

Nota.1:

Nas duas primeiras linhas acima, há um caractere ZWNJ invisível, que é mostrado como <200c> no VIM, mas não está visível nesta postagem.

vim mostrando zwnj como 200c

Nota.2:

Não adicionei todas essas linhas ao mesmo tempo, testei uma por uma.

Nota 3:

Não há nenhuma outra regra para ZWNJ nounaccent.rules

Problema 2:

Existe uma maneira de adicionar um novo arquivo de regras em vez de editar o padrão? Não consigo editar o código-fonte do aplicativo e alterar as consultas.

Adicionar algo como /usr/share/postgresql/16/tsearch_data/arabic.stopou /usr/share/postgresql/16/tsearch_data/arabic.rulese reiniciar o serviço faz com que o PostgreSQL o entenda?

É necessário executar alguma consulta para recarregar o arquivo?

É necessário alterar a maneira como a pesquisa é solicitada no aplicativo?

postgresql
  • 1 respostas
  • 241 Views
Martin Hope
jakob
Asked: 2024-10-08 20:53:13 +0800 CST

Cassandra não inicia devido à corrupção do Commit Log

  • 6

Estamos operando o Cassandra em um ambiente onde ocasionalmente a máquina host que executa o Cassandra fica sem energia sem um desligamento adequado. Não temos problemas em perder dados , mas nosso problema é que em raras situações o Cassandra não consegue iniciar após um desligamento impuro. A inicialização falha devido a uma corrupção do log de Commit:

ERROR [main] 2024-05-02 12:39:13,834 JVMStabilityInspector.java:196 - Exiting due to error while processing commit log during initialization.
org.apache.cassandra.db.commitlog.CommitLogReadHandler$CommitLogReadException: Mutation checksum failure at 2378 in Next section at 2016 in CommitLog-7-1714580480939.log
        at org.apache.cassandra.db.commitlog.CommitLogReader.readSection(CommitLogReader.java:387)
        at org.apache.cassandra.db.commitlog.CommitLogReader.readCommitLogSegment(CommitLogReader.java:244)
        at org.apache.cassandra.db.commitlog.CommitLogReader.readCommitLogSegment(CommitLogReader.java:147)
        at org.apache.cassandra.db.commitlog.CommitLogReplayer.replayFiles(CommitLogReplayer.java:191)
        at org.apache.cassandra.db.commitlog.CommitLog.recoverFiles(CommitLog.java:223)
        at org.apache.cassandra.db.commitlog.CommitLog.recoverSegmentsOnDisk(CommitLog.java:204)
        at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:353)
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:744)
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:878)

Descobrimos sobre a opção " cassandra.commitlog.ignorereplayerrors ", que parece afetar o tratamento de erros quando o log Commit é processado. Algumas perguntas sobre essa configuração:

  1. É seguro habilitar essa configuração se a perda de dados gravados no Cassandra for aceitável?
  2. Todas as corrupções de log de Commit são ignoradas ao habilitar essa configuração ou ainda pode acontecer de o Cassandra não conseguir iniciar? Observe que nosso principal requisito é que o Cassandra consiga iniciar após uma queda de energia sem intervenção manual.
  3. O "nodetool repair" deve ser executado após a ocorrência de corrupções no log de confirmação?
cassandra
  • 1 respostas
  • 18 Views
Martin Hope
Jeff
Asked: 2024-10-08 07:33:56 +0800 CST

Qual é a relação entre uma consulta SQL e max_stack_depth?

  • 6
Esta pergunta foi migrada do Stack Overflow porque pode ser respondida no Database Administrators Stack Exchange. Migrada há 19 horas .

A maioria das perguntas max_stack_depthé sobre como ignorá-lo, ou aumentá-lo, etc. Estou ciente de que o limite padrão é 2 MB e não pode ser definido como maior que ulimit -s. Gostaria de saber exatamente como o Postgres determina que uma consulta está acima do limite.

É o número de nós em um plano de explicação? Número de caracteres na consulta SQL bruta, após parâmetros, com ou sem parâmetros vinculados? etc.

Por exemplo, gostaria de fazer uma consulta como

SELECT a, b, c 
FROM table 
WHERE x IN (1, 2, 3);

e traduzir isso para um valor numérico (byte) que me diria o quão longe max_stack_depthestou.

postgresql
  • 1 respostas
  • 22 Views
Martin Hope
philomathic_life
Asked: 2024-10-08 04:37:12 +0800 CST

É possível definir um tipo composto NULLable cujos campos NÃO são NULL?

  • 6

Gostaria de definir um tipo composto cujos campos são NOT NULL; enquanto, ao mesmo tempo, permite que o valor em si esteja NULLem uma coluna da tabela. Minha primeira tentativa foi definir um DOMAINno tipo composto com uma CHECKrestrição que assegurasse que os campos são NOT NULL; infelizmente, isso impede NULLque ele seja INSERTed na tabela:

BEGIN;
    CREATE TYPE foo AS (x int, y int);
    CREATE DOMAIN non_null_foo AS foo CHECK((VALUE).x IS NOT NULL AND (VALUE).y IS NOT NULL);
    CREATE TABLE bar(y non_null_foo);
    INSERT INTO bar VALUES (NULL);
ROLLBACK;

erros: ERROR: value for domain non_null_foo violates check constraint "non_null_foo_check".

Minha segunda tentativa foi permitir NULLem VALUE, DOMAINmas isso também não funciona, pois agora permite um valor onde todos os campos são NULL:

BEGIN;
    CREATE TYPE foo AS (x int, y int);
    CREATE DOMAIN non_null_foo AS foo CHECK(VALUE IS NULL OR ((VALUE).x IS NOT NULL AND (VALUE).y IS NOT NULL));
    CREATE TABLE bar(y non_null_foo);
    INSERT INTO bar VALUES ((NULL, NULL)); --succeeds
    INSERT INTO bar VALUES ((1, NULL)); --fails
ROLLBACK;

É como se o Postgresql não conseguisse distinguir entre NULLe um valor onde todos os campos são NULL. Há algo que eu esteja esquecendo?

postgresql
  • 1 respostas
  • 15 Views
Prev
Próximo

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