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 / Perguntas / 330289
Accepted
deostroll
deostroll
Asked: 2023-08-15 01:33:43 +0800 CST2023-08-15 01:33:43 +0800 CST 2023-08-15 01:33:43 +0800 CST

Obtendo informações erradas/enganosas relacionadas ao índice da tabela oracle

  • 772
  1. Criando uma tabela da seguinte forma:
CREATE TABLE "HOTEL3" 
   (    "NAMEX" VARCHAR2(4000 CHAR), 
    "CITY" VARCHAR2(4000 CHAR), 
    "PRICE" NUMBER, 
    "ID" VARCHAR2(50 BYTE) DEFAULT sys_guid()
   );
  1. Criando um índice da seguinte forma:
CREATE INDEX "IDX_HOTEL3_CITY_NAME" ON "HOTEL3" ("CITY" ASC, "NAMEX" DESC);   
  1. Consultando as informações do índice:
SELECT *
FROM   all_ind_columns ic
WHERE  ic.index_owner = 'FOO'
    AND ic.table_name = 'HOTEL3'
ORDER  BY ic.column_position;

Estou obtendo o resultado abaixo (csv)

"INDEX_OWNER","INDEX_NAME","TABLE_OWNER","TABLE_NAME","COLUMN_NAME","COLUMN_POSITION","COLUMN_LENGTH","CHAR_LENGTH","DESCEND","COLLATED_COLUMN_ID"
"FOO","IDX_HOTEL3_CITY_NAME","FOO","HOTEL3","CITY",1,4000,4000,"ASC",
"FOO","IDX_HOTEL3_CITY_NAME","FOO","HOTEL3","SYS_NC00005$",2,2000,0,"DESC",

Observe o segundo registro; COLUMN_NAMEé SYS_NC00005$em vez de NAMEX.

Aqui estão algumas notas laterais. Após a etapa 1, se você consultar, all_tab_colsobterá todas as 4 colunas. No entanto, após a etapa 2, all_tab_colsagora há uma entrada adicional - o mesmo nome mostrado acima do resultado da consulta. Isso pode ser exagerado; mas o IDcampo definido DEFAULTpode ser o motivo, após a etapa 2, all_tab_colster essa entrada estranha.

Então, qual consulta posso emitir para obter as informações de índice corretas?

PS: o servidor oracle é 19c, eu acho.

oracle
  • 2 2 respostas
  • 98 Views

2 respostas

  • Voted
  1. Balazs Papp
    2023-08-15T02:19:38+08:002023-08-15T02:19:38+08:00

    É assim que um índice em uma coluna definida com ordem decrescente é definido.

    Você pode encontrar a expressão real na COLUMN_EXPRESSIONcoluna da ALL_IND_EXPRESSIONSexibição.

    • 2
  2. Best Answer
    Paul W
    2023-08-15T02:20:22+08:002023-08-15T02:20:22+08:00

    Quando você definiu NAMEXcomo DESC, o Oracle cria um índice baseado em função usando SYS_OP_DESCENDuma RAWcoluna oculta internamente que você pode ver em all_tab_cols(não em all_tab_columns). O índice está nesta RAWcoluna que tem um nome gerado pelo sistema. all_ind_expressionsmostrará a expressão que será passada para essas funções, indicando o nome da coluna.

    Sempre que você tiver qualquer tipo de índice baseado em função, você deve ir *_ind_expressionspara obter a definição real e trocar a coluna nomeada pelo sistema por esta expressão para representar o que você espera.

    Agora, isso não pode ser feito em SQL porque isso exigiria trabalhar com LONGs, com os quais o SQL pode fazer muito pouco. Existe uma solução alternativa, porém usando PL/SQL:

    CREATE OR REPLACE TYPE all_ind_expressions_rectype IS OBJECT (
    COLUMN_EXPRESSION   VARCHAR2(4000),
    COLUMN_POSITION NUMBER
    )
    /
    CREATE OR REPLACE TYPE all_ind_expressions_tabtype IS TABLE OF all_ind_expressions_rectype
    /
    CREATE OR REPLACE FUNCTION f_all_ind_expressions_ext(in_index_owner IN varchar2, in_index_name IN varchar2)
      RETURN all_ind_expressions_tabtype PIPELINED
    AS
    BEGIN
      FOR rec_expr IN (SELECT *
                         FROM all_ind_expressions
                        WHERE index_owner = in_index_owner
                          AND index_name = in_index_name)
      LOOP
        DECLARE
          var_column_expression varchar2(4000);
        BEGIN
          var_column_expression := rec_expr.column_expression;
          PIPE ROW(all_ind_expressions_rectype(var_column_expression,rec_expr.column_position));
        END;
      END LOOP;
      
      RETURN;
    END;  
    /
    CREATE OR REPLACE VIEW all_ind_expressions_ext
    AS
    SELECT i.owner index_owner,
           i.index_name,
           i.table_owner,
           i.table_name,
           x.*
      FROM all_indexes i
           CROSS APPLY TABLE(f_all_ind_expressions_ext(i.owner,i.index_name)) x
     ORDER BY table_owner,table_name,index_owner,index_name,column_position       
    /
    

    Agora você pode usar all_ind_expressions_extem seu SQL e usar a expressão em qualquer função que desejar ( CASE, REPLACE, WHEREcláusula, LISTAGG, qualquer coisa).

    • 2

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

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