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

Pantea's questions

Martin Hope
Pantea
Asked: 2024-12-29 17:23:23 +0800 CST

Como recuperar apenas os elementos do array que satisfazem as condições da consulta no MongoDB

  • 5

Sou muito novo no MongoDB e comecei a aprender e trabalhar com ele agora. Tenho uma pergunta sobre uma consulta. Esta é a consulta:

db.getCollection("user_plates").count(
    {
        "plates": {
            $elemMatch: {
                registerDate: {
                    $gt: new Date("2024-03-20T00:00:00.000Z"),
                    $lt: new Date("2024-03-21T00:00:00.000Z")
                }
            }
        }
    }
);

Como você sabe, se a consulta encontrar pelo menos um elemento no array que satisfaça ambas as condições, ela retornará todos os elementos daquele documento. Agora, preciso ter apenas os elementos do array daquele documento, que o campo "registerDate"satisfaça ambas as condições. Não quero ver outros elementos do array daquele documento. Como devo modificar a consulta acima para conseguir isso?

desde já, obrigado

mongodb
  • 1 respostas
  • 41 Views
Martin Hope
Pantea
Asked: 2024-12-13 16:45:27 +0800 CST

Melhor abordagem para 'pivotar' os dados de uma tabela

  • 5

Tenho uma tabela com a seguinte estrutura:

create table test_table
(queuename    number,
 duration_sum number,
 rating_sum   number,
 rating_avg   number,
 rating_cnt   number
 )

Aqui estão os dados de exemplo:

insert into test_table (queuename, duration_sum, rating_sum, rating_avg,rating_cnt)
values (1000,50,40,60,70);
insert into test_table (queuename, duration_sum, rating_sum, rating_avg,rating_cnt)
values (1010,12,40,25,34);
insert into test_table (queuename, duration_sum, rating_sum, rating_avg,rating_cnt)
values (2000,50,34,60,23);
insert into test_table (queuename, duration_sum, rating_sum, rating_avg,rating_cnt)
values (3000,90,40,60,67);
commit;

O que preciso é o resultado abaixo:

 queuename         1000     1010     2000     3000     
 duration_sum       50       12       50       90 
 rating_sum         40       40       34       40 
 rating_avg         60       25       60       60  
 rating_cnt         70       34       23       67 

Estou tentando usar pivotisso e isso é o que escrevi até agora:

select *
from (
    select 
        queuename,
        'duration_sum' as measure, duration_sum as value from test_table
    union all
    select 
        queuename,
        'rating_sum' as measure, rating_sum as value from test_table
    union all
    select 
        queuename,
        'rating_avg' as measure, rating_avg as value from test_table
    union all
    select 
        queuename,
        'rating_cnt' as measure, rating_cnt as value from test_table
         )
pivot (
    max(value)
    for queuename in (1000 as "1000", 1010 as "1010", 2000 as "2000", 3000 as "3000")
       )
order by measure;

Essa é uma abordagem melhor para pivotingo resultado? Acho que pode haver uma abordagem melhor para usar pivota instrução em vez de usar union. Eu deveria dizer que 'queuename' é único.

Desde já, obrigado.

query
  • 1 respostas
  • 29 Views
Martin Hope
Pantea
Asked: 2024-11-11 21:10:37 +0800 CST

Consulta para excluir registros com eff_date menor em uma tabela grande com 400 milhões de registros

  • 9

Tenho uma tabela com a seguinte estrutura:

create table TEST_TAB
(
  activity_type CHAR(1),
  tracking_code NUMBER,
  eff_date      DATE
)

Dados de amostra para esta tabela:

insert into TEST_TAB (activity_type, tracking_code, eff_date)
values ('A', 1, to_date('01-11-2020', 'dd-mm-yyyy'));
insert into TEST_TAB (activity_type, tracking_code, eff_date)
values ('A', 1, to_date('02-01-2024', 'dd-mm-yyyy'));
insert into TEST_TAB (activity_type, tracking_code, eff_date)
values ('B', 2, to_date('01-08-2023', 'dd-mm-yyyy'));
insert into TEST_TAB (activity_type, tracking_code, eff_date)
values ('B', 2, to_date('02-08-2023', 'dd-mm-yyyy'));
insert into TEST_TAB (activity_type, tracking_code, eff_date)
values ('B', 2, to_date('03-08-2023', 'dd-mm-yyyy'));

Este é apenas um dado de amostra e a quantidade de dados reais na tabela original é de quase 400 milhões de registros. O que preciso fazer é que, para cada grupo de activity_type, tracking_code, preciso manter o registro que tem o maior "eff_date" e excluir o restante. Então, para o , activity_type=A and tracking_code = 1preciso manter um com eff_date = 1/2/2024e excluir o outro. O que tenho por enquanto é a consulta abaixo:

delete from test_tab
 where rowid in (select rid
                   from (select rowid as rid,
                                row_number() over(partition by activity_type, tracking_code order by eff_date desc) as row_num
                           from test_tab
                           )
                  where row_num > 1
                  )

No entanto, isso parece muito lento. Você poderia sugerir alguma solução melhor? A tabela original é particionada em eff_date e tem índice nas duas colunas restantes. Outro ponto é que pode haver mais de um intervalo de um ano entre eff_dates de cada registro em um único grupo.

desde já, obrigado

query-performance
  • 1 respostas
  • 193 Views
Martin Hope
Pantea
Asked: 2023-03-01 21:02:55 +0800 CST

Como transformar uma string com valores "separados por pipe" em linhas individuais no Oracle PL/SQL

  • 5

Tenho uma tabela com a estrutura abaixo:

create table student_info
(
  item_number    number,
  st_firstname   varchar2(50),
  st_lastname    varchar2(50),
  st_score       varchar2(50)
)

Aqui está um exemplo de dados da tabela:

item_number  |  st_firstname   |         st_lastname      |  st_score
----------------------------------------------------------------------------
     1         Ali|Reza|Pantea    Hashemi|Nosrati|Yaghobi    10|20|20
     
     2          Maryam|Ahmad         Moghise|Majlesi          20|20    

Eu preciso ter a saída abaixo:

item_number  |  st_firstname   |         st_lastname      |  st_score
----------------------------------------------------------------------------
     1             Ali                    Hashemi               10
     1             Reza                   Nosrati               20
     1             Pantea                 Yaghobi               20
     
     2             Maryam                 Moghise               20
     2             Ahmad                  Majlesi               20

Descobri que, com a consulta abaixo, posso fazer o que quiser com uma das colunas (que é st_firstname):

select distinct t.item_number,
                trim(regexp_substr(t.st_firstname, '[^|]+', 1, level)) str
  from student_info t
connect by instr(st_firstname, '|', 1, level - 1) > 0
 order by t.item_number

O problema é que não sei como adicionar outras colunas (st_lastname , st_lastname) à consulta acima. Eu queria saber se você poderia me ajudar aqui.

desde já, obrigado

oracle
  • 1 respostas
  • 24 Views
Martin Hope
Pantea
Asked: 2023-01-11 04:00:52 +0800 CST

Recebendo o erro "não é possível acessar linhas de um item de tabela não aninhado" ao trabalhar com matrizes associativas

  • 5

Abaixo, estou tentando usar os dados do que arraydeclarei, no where clauseda query mas recebo o seguinte erro:

declare

  v_input varchar2(400) := '0,1,2,3,4';

  type t_dep2custrel_type is table of number;
  t_dep2cust_rel t_dep2custrel_type;

begin


  select regexp_substr(v_input, '[^,]+', 1, level) zz
    bulk collect
    into t_dep2cust_rel
    from dual
  connect by regexp_substr(v_input, '[^,]+', 1, level) is not null;


  insert into bb_tmp_natonalcode_accnumber
    (identificationnumber)
    select b.customer_num
      from [sample_table] b
     where b.dpst2cust_rel_cod in (select * from table(t_dep2cust_rel)); /* here I'm trying to use the array*/

  commit;

end;
  1. "Tipos de coleta local não permitidos na instrução sql"
  2. "não é possível acessar linhas de um item de tabela não aninhado" (ORA-22905)

Eu queria saber se você poderia me ajudar com isso.

desde já, obrigado

oracle
  • 1 respostas
  • 25 Views
Martin Hope
Pantea
Asked: 2023-01-11 03:27:37 +0800 CST

Recebendo o erro "Tipos de coleta local não permitidos" ao trabalhar com matrizes associativas

  • 5

Eu tenho um parâmetro de entrada com este formato '0,1,2,3,4', o que eu quero fazer é declarar um arraycom tamanho variável (com isso quero dizer que o parâmetro de entrada pode ser como '0,1', então o tamanho não é fixo), separar os itens (0,1, 2,3,4) e armazená-los em uma matriz de números. Abaixo você pode ver o que eu fiz até agora:

declare

  v_input varchar2(400) := '0,1,2,3,4';

  type t_dep2custrel_type is table of number;
  t_dep2cust_rel t_dep2custrel_type;

begin

  select REGEXP_SUBSTR(v_input, '[^,]+', 1, LEVEL)
    into t_dep2cust_rel
    from dual
  CONNECT BY REGEXP_SUBSTR(v_input, '[^,]+', 1, LEVEL) IS NOT NULL;

end;

e estou recebendo esta mensagem de erro:

"Local collection types not allowed in SQL statements"

Eu queria saber se você poderia me ajudar a encontrar o problema e me dizer se existe uma maneira melhor de fazer isso.

desde já, obrigado

oracle
  • 1 respostas
  • 18 Views
Martin Hope
Pantea
Asked: 2022-09-04 21:36:17 +0800 CST

Como criar intervalos de 100 com base em uma coluna em uma consulta?

  • 5

Tenho uma tabela com a estrutura abaixo:

create table item_test
(item_id       varchar2(10),
 item_row      number)

Os dados de exemplo são como abaixo , observe que os números na Item_Rowcoluna começam em 1 e aumentam em 1 para um número sem lacunas. O que eu preciso fazer é criar intervalos de 100 ([1-100] , [101-200] , [201-300] ,......)para cada arquivo Item_Id.

   Item_Id       Item_Row    
 ------------   ----------- 
    A               1           
    A               2            
    A              ...
    A              ...
    A              236  /* Item_Row starts from 1 and continues to 236 */

    B               1
    B              ...
    B              ...
    B              173  /* Item_Row starts from 1 and continues to 173 */
    
    C               1
    C               2
    C              ...
    C              ...
    C              300  /* Item_Row starts from 1 and continues to 300 */ 

O resultado será como abaixo:

  Item_Id       RowNum_From     RowNum_From
 ------------   -----------     ----------- 
     A              1               100
     A             101              200
     A             201              236

     B              1               100
     B             101              173
     
     C              1               100 
     C             101              200
     C             201              300 

Existe alguma função específica para isso?

oracle oracle-11g-r2
  • 2 respostas
  • 460 Views
Martin Hope
Pantea
Asked: 2022-07-11 22:35:54 +0800 CST

Melhores maneiras de concatenar o valor das colunas

  • 0

Eu tenho uma tabela com a estrutura abaixo e dados de exemplo:

create table CUSTOMER_TEST
(
  customer_num Number,
  rel_one      Number,
  rel_two      Number,
  rel_three    Number,
  rel_four     Number
)

   Customer_num    Rel_one     Rel_two        Rel_three        Rel_four 
 --------------- ----------- -------------  --------------  --------------
    1               7           12             1000               5
    2               2            1               0                12
    3              12           99              13                0

O resultado desejado é este:

   Customer_num    Rel_one     Rel_two        Rel_three        Rel_four      Relation_Code
 --------------- ----------- -------------  --------------  --------------  ***************
    1               7           12             1000               5           L07R12C99S05
    2               2            1               0                12          L02R01C00S12
    3              12           99              13                0           L12R99C13S00

O que escrevi é isso:

select   customer_num,
         rel_one , 
         rel_two,
         rel_three,
         rel_four,
       'L' ||
       case 
         when   rel_one > 99 then '99'
           else lpad(  rel_one,2,0) end ||
       'R' ||
       case
         when   rel_two > 99 then '99'
           else lpad(  rel_two,2,0) end ||
       'C' ||
        case
         when   rel_three > 99 then '99'
           else lpad(  rel_three,2,0) end  || 
        'S' ||
                case
                 when   rel_four > 99 then '99'
                   else lpad(  rel_four,2,0) end as relation_code            
                  
from customer_test ;

Alguém tem uma ideia melhor? em vez de usar essa instrução muito case ..

desde já, obrigado

oracle-11g-r2 query-performance
  • 1 respostas
  • 21 Views
Martin Hope
Pantea
Asked: 2022-06-26 03:05:24 +0800 CST

Consulta para encontrar a contagem de dias ativos (dias com status = ON) entre datas especificadas

  • 0

Eu tenho uma tabela como você pode ver abaixo:

create table z_test_duration
( Days     date,
  Status   char(8)
);

Os dados da amostra são como abaixo:

Dias Status
01/01/2022 sobre
02/01/2022 sobre
03/01/2022 sobre
04/01/2022 desligado
05/01/2022 sobre
06/01/2022 desligado
07/01/2022 sobre
08/01/2022 sobre
09/01/2022 desligado

O resultado desejado é este

NA DATA OFF_DATE COUNT_OF_ACTIVE_DAYS
01/01/2022 04/01/2022 3
05/01/2022 06/01/2022 1
07/01/2022 09/01/2022 2

Minha solução até agora é esta:

select min(days) on_date, 
       off_day off_date, 
       off_day - min(days) cnt
       
  from (select t1.off_day, 
               t1.prev_offday, 
               t2.days            
          from (                
                select t.days off_day,
                        nvl(lag(t.days, 1) over(order by t.days),convert(datetime, '1/1/2022') - 100) prev_offday
                  from z_test_duration t
                 where t.status = 'off'
                                 
                ) t1
         inner join z_test_duration t2
            on t2.days > t1.prev_offday
           and t2.days < t1.off_day)
 group by off_day;

Estou pensando se existem maneiras melhores de resolver isso, seria apreciado se você compartilhasse sua maneira de resolver isso.

Desde já, obrigado.

sql-server sql-server-2016
  • 1 respostas
  • 362 Views
Martin Hope
Pantea
Asked: 2022-04-06 05:07:30 +0800 CST

Consulta para atualizar uma coluna com base na quantidade de outra coluna

  • 0

Eu tenho uma tabela com a estrutura abaixo:

create table Z_TEST_ONE
(
  col_id   NUMBER,
  bed_amnt NUMBER,
  bes_amnt NUMBER,
  bop      NUMBER
)

Os dados de exemplo são assim:

     col_id    bed_amnt    bes_amnt    bop
   ---------- ----------- ---------- -------
       1        1000         0         20
       1        5000         0         7
       1          0         3000       10
       1          0          6         14
       2        1000         0         1
       2        2000         0         2
       2          0         1000       3
       2          0         2000       4

Agora o que eu preciso é o seguinte: Para cada col_id, a coluna bop para maior bes_amntdeve ser igual ao bop para maior bed_amnt. Então, depois de executar a consulta, o resultado deve ficar assim:

     col_id    bed_amnt    bes_amnt    bop
   ---------- ----------- ---------- -------
       1        1000         0         20
       1        5000         0         7
       1          0         3000       7 ---> changed from 10 to 7
       1          0          6         14
       2        1000         0         1
       2        2000         0         2
       2          0         1000       3
       2          0         2000       2 ---> changed from 4 to 2

Eu escrevi uma consulta para isso, como você pode ver abaixo:

update z_test_one a
   set a.bop =
       (select t.bop /* bop for highest bed_amnt */
          from z_test_one t
         where t.bed_amnt = (select max(bed_amnt)
                               from z_test_one
                              where col_id = a.col_id
                              group by col_id))     
 where a.bes_amnt = (select max(bes_amnt)
                       from z_test_one
                      where col_id = a.col_id
                      group by col_id)

esta consulta funciona bem e me dá o resultado correto, eu queria saber se existem maneiras melhores de escrever a consulta desejada.

desde já, obrigado

oracle query-performance
  • 1 respostas
  • 36 Views
Martin Hope
Pantea
Asked: 2022-01-24 04:01:17 +0800 CST

o que mostra o número na coluna "A_ROWS" do plano de execução para a operação "Index scan"?

  • 0

Tenho uma dúvida como você pode ver abaixo:

select /*+gather_plan_statistics*/
 *
  from mi_dimcustomer t
 where t.CUSTOMER_NUM = 321937

Há uma coluna Unique Index (IDX1_DIMCUSTOMER)na Customer_Numtabela. Eu usei /*+gather_plan_statistics*/hint e Dbms_xplan.display_cursorpara obter o plano de execução real e é isso que eu tenho:

SQL_ID  adj0b6drg6bjd, child number 0
-------------------------------------
select /*+gather_plan_statistics*/* from vmi_dimcustomer t where 
t.CUSTOMER_NUM = 321937
 
Plan hash value: 3784660444
 
-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name             | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |      1 |        |     2 (100)|      1 |00:00:00.01 |       3 |
|   1 |  TABLE ACCESS BY INDEX ROWID| MI_DIMCUSTOMER   |      1 |      1 |     2   (0)|      1 |00:00:00.01 |       3 |
|*  2 |   INDEX UNIQUE SCAN         | IDX1_DIMCUSTOMER |      1 |      1 |     1   (0)|      1 |00:00:00.01 |       2 |
-----------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("CUSTOMER_NUM"=321937)

Minha pergunta é sobre Operation-2 , Index unique scan.Até onde eu sei o que acontece Index scané apenas escanear/pesquisar o Index Page, recuperar os Rowids desejados e depois usar esses Rowids para acessar o local correto na tabela (que é op-1). -2 (que é apenas varrer a página de índice) para gerar quaisquer linhas! Então, por que vemos [A-rows]=1 no plano de execução para op-2? o que esse número representa?

Meu palpite é que seria igual ao número de ROWIDs retornando da página de índice.

desde já, obrigado

oracle performance
  • 1 respostas
  • 28 Views
Martin Hope
Pantea
Asked: 2022-01-10 11:05:33 +0800 CST

Três "junção de loop aninhado" no plano de execução, apesar de usar duas junções internas na consulta principal

  • 1

Tenho uma dúvida como você pode ver abaixo:

with cte as
 (select customer_num
    from vmi_segment_customer_relation
   where effective_date = to_date('12/30/2021', 'mm/dd/yyyy')
     and segment_id = 10000000592
     )
select 
 t.customer_num, 
 cust_first_name, 
 cust_last_name, 
 cust_type_desc
  from vmi_factcustomer t
  join cte f
    on t.customer_num = f.customer_num
   and t.effective_date = to_date('12/30/2021', 'mm/dd/yyyy')

  join vmi_dimcustomer d
    on t.customer_num = d.customer_num;

Como você pode ver, existem três tabelas nesta consulta

1) vmi_segment_customer_relation, Índice: "IDX1_SEGMENT"na "segment_id" coluna.

2) vmi_factcustomer, Índice: "IDX1_F"na "customer_num" coluna.

3) vmi_dimcustomer, Índice: "IDX_CUSTNUM"na "customer_num"coluna.

Todas as tabelas statisticsestão atualizadas e não há estatísticas desatualizadas. Eu peguei o real execution planpara esta consulta usando esta dica /*+gather_plan_statistics*/, como você pode ver, aqui está o plano:

insira a descrição da imagem aqui

Tenho algumas dúvidas sobre o plano:

  1. Eu esperava que o operation-10estivesse sob o operation-11(op-10 ser o filho de op-11) porque o 'IDX_CUSTNUM'índice é para 'MI_DIMCUSTOMER'tabela! Dê uma olhada op-5 and op-6por exemplo. Ou op-8 and op-9, eu esperava fazer op-10 e op-11 exatamente como os dois e não tenho ideia de por que não é!

  2. Outra questão é que, existem duas junções na consulta, então por que vemos três Nested loop joinsno plano? Qual é a função de cada loop aninhado?

desde já, obrigado

oracle query-performance
  • 1 respostas
  • 174 Views
Martin Hope
Pantea
Asked: 2021-11-13 01:45:42 +0800 CST

O uso da dica "qb_name()" (nome do bloco de consulta) em uma consulta tem um efeito significativo no desempenho?

  • 0

Acabei de me familiarizar com a dica "qb_name" (query block name)no Oracle e abaixo você pode ver um exemplo de uso dessa dica em uma consulta:

select
        /*+
                qb_name(main)
        */
        ord.id,
        ord.valuation,
        ord.status,
        (select /*+ qb_name(company) */ max(com.name)  from companies  com  where com.id  = ord.id_company) company,
        (select /*+ qb_name(product) */ max(prd1.name) from products   prd1 where prd1.id = orl.id_product) product,
        orl.quantity
from
        orders          ord,
        order_lines     orl
where
        ord.date_placed > trunc(sysdate) - 7
and     orl.id_ord = ord.id
and     orl.id_product in (
                select  /*+ qb_name(class) */
                        prd2.id
                from    products prd2
                where   prd2.class = 'Group25'
        )

Já pesquisei sobre isso mas os artigos não eram tão práticos então resolvi perguntar sobre essa dica aqui. Minhas perguntas são:

  1. Tem algum efeito significativo sobre performance?
  2. Alguém aqui usou essa dica em sua consulta? porque ?
  3. Em que circunstâncias devemos usar esta dica?

desde já, obrigado

oracle performance
  • 3 respostas
  • 165 Views
Martin Hope
Pantea
Asked: 2021-10-24 05:48:11 +0800 CST

O uso inadequado de operadores lógicos levou a um desempenho de consulta ruim

  • 8

Tenho uma tabela com grande quantidade de dados (quase 15 milhões) e estrutura abaixo.

create table test
(a int,--> /* There is a normal index on this column */
 b int,
<other columns>)

Há uma consulta selecionando desta tabela e uma das condições na cláusula where é esta:

where a!=1 or (a=1 and b!=0) /* The original condition */

A consulta estava muito lenta e achei que a maior parte desse desempenho ruim poderia ser por causa do uso indevido de operadores lógicos. Eu mudei a condição como você vê abaixo:

where not (a=1 and b=0) /* The edited version*/

e o desempenho mudou drasticamente! O que eu preciso ter certeza é que as duas condições são exatamente as mesmas para que eu não perca nenhum dado. Eu queria saber se você poderia me ajudar com isso e me dizer se você tem alternativas melhores para a condição.

Se você conhece algum artigo sobre o uso correto de operações lógicas e a forma como/otimizador de ordens as tratam, por favor, compartilhe o link.

desde já, obrigado

sql-server query-performance
  • 3 respostas
  • 1758 Views
Martin Hope
Pantea
Asked: 2021-08-17 05:18:20 +0800 CST

Consulta para dividir cada valor de coluna em duas categorias: [Common , Not_Common]

  • 1

Eu tenho uma tabela com estrutura e dados abaixo:

create table PTEST
(
  col_name  VARCHAR(50),
  col_value VARCHAR(50)
)

    COL_NAME    COL_VALUE
   -----------------------
     first       apple
     first       banana
     second      apple
     second      banana
     second      orange
     third       apple
     third       banana

**) o que eu quero fazer é dividir cada valor na col_valuecoluna em duas categorias: [Comum,Not common]

**) Um valor é considerado 'Common'se for exibido para cada col_name, Então appleé comum, pois é exibido para col_name = first and col_name = second and col_name = third. O mesmo vale para banana. Orangenão é comum, pois é apenas apareceu para col_name = second.

A saída desejada seria assim:

    COL_NAME   COL_VALUE   STATUS
   ---------------------------------
    first       apple       Common
    first       banana      Common
    second      banana      Common
    second      apple       Common
    second      orange      Not common
    third       apple       Common
    third       banana      Common

A consulta que escrevi para isso é:

select col_name,
       col_value,
       case
         when count_col = count_val then
          'Common'
         else
          'Not common'
       end STATUS
  from (select t.col_name,
               count(distinct t.col_name) over() count_col,
               t.col_value,
               count(t.col_value) over(partition by t.col_value) count_val
          from PTEST t)

Eu queria saber se existem maneiras melhores de fazer isso.

desde já, obrigado

sql-server query-performance
  • 1 respostas
  • 1223 Views
Martin Hope
Pantea
Asked: 2021-07-26 02:15:27 +0800 CST

Por que /*+ NO_INDEX*/ dica não afeta o "plano de execução"?

  • 0

Eu tenho uma tabela de exemplo com a estrutura abaixo:

create table mi_dimcustomer
(customer_num    number(10),
 <other columns> <data types>)

E há uma unique indexcoluna customer_num. Estou tentando hint the optimizernão usar este índice (apenas por uma questão de prática) assim:

select /*+gather_plan_statistics*/ /*+ no_index(t idx1_dimcustomer) */
 *
  from mi_dimcustomer t
 where t.customer_num = 12;

Mas no plano de execução, posso ver que o otimizador ainda está usando o índice! Esta é a maneira que estou capturando o plano de execução:

Step-1)

    select sql_id, child_number, sql_text
      from v$sql
     where sql_text like '%where t.CUSTOMER_NUM = 12%';

Step-2)    

select *
  from table(dbms_xplan.display_cursor('2qataxp9mahpj',
                                       '0',
                                       'ALLSTATS LAST +COST +OUTLINE'))

E você pode ver o plano de execução abaixo:

SQL_ID  2qataxp9mahpj, child number 0
-------------------------------------
select /*+gather_plan_statistics*//*+ NO_INDEX(t idx1_dimcustomer) */ * 
from mi_dimcustomer t where t.CUSTOMER_NUM = 12
 
Plan hash value: 3784660444
 
-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name             | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |      1 |        |     2 (100)|      1 |00:00:00.01 |       3 |
|   1 |  TABLE ACCESS BY INDEX ROWID| MI_DIMCUSTOMER   |      1 |      1 |     2   (0)|      1 |00:00:00.01 |       3 |
|*  2 |   INDEX UNIQUE SCAN         | IDX1_DIMCUSTOMER |      1 |      1 |     1   (0)|      1 |00:00:00.01 |       2 |
-----------------------------------------------------------------------------------------------------------------------

Por que isso está acontecendo?

desde já, obrigado

oracle performance
  • 1 respostas
  • 339 Views
Martin Hope
Pantea
Asked: 2021-07-15 02:49:46 +0800 CST

Enfrentando o erro "não é possível buscar o plano para SQL_ID" ao tentar capturar o plano de execução

  • 0

Estou tentando capturar o execution planda minha consulta PL/SQL developercomo você pode ver abaixo:

select  *
  from vmi_dimcustomer t1
 inner join vmi_factcustomer t2
    on t1.customer_num = t2.customer_num  ;
    
Select plan_table_output from table(dbms_xplan.display_cursor(null,null,'basic'));

mas recebo esta nota:

  SQL_ID  9m7787camwh4m, child number 0
  begin :id := sys.dbms_transaction.local_transaction_id; end;
  NOTE: cannot fetch plan for SQL_ID: 9m7787camwh4m, CHILD_NUMBER: 0
    Please verify value of SQL_ID and CHILD_NUMBER; 
    It could also be that the plan is no longer in cursor cache (check v$sql_plan)

O que eu estou fazendo errado aqui? Pesquisei aqui e a resposta que obtive foi "set serveroutput off". Coloque não consigo fazer isso no desenvolvedor PL/SQL.

Desde já, obrigado.

oracle oracle-11g-r2
  • 1 respostas
  • 737 Views
Martin Hope
Pantea
Asked: 2021-07-07 06:37:20 +0800 CST

A maneira correta de gerar "Plano de execução" para uma instrução PL-SQL no Oracle

  • 0

Estou estudando Explain plan and Execution planno Oracle e de acordo com o que li até agora, o plano explicado pode diferir do plano real usado durante a execução da instrução. Então eu acho que os planos de execução são mais úteis optimization purposesem comparação com os planos de explicação.

Minha pergunta :

Como você costuma gerar um plano de execução para uma instrução Sql? Depois de ler artigos diferentes, estou um pouco confuso agora porque em cada um deles é apresentada uma abordagem diferente! Por exemplo, me deparei com este:

explain plan 
 set statement_id = 'ex_plan1' for

select phone_number
from employee
where phone_number like '650%';

select PLAN_TABLE_OUTPUT
 from table (DBMS_XPLAN.DISPLAY(STATEMENT_ID=>'ex_plan1'));
  1. Isso é correct waypara ter o plano de execução (não o plano de explicação)?

  2. Quais são as outras maneiras de ter o plano de execução correto? (Aquele that optimizerque escolheu executar a instrução).

desde já, obrigado

oracle oracle-11g-r2
  • 1 respostas
  • 381 Views
Martin Hope
Pantea
Asked: 2021-06-30 00:54:47 +0800 CST

comportamento estranho de NVL(<Column_name>,Sequence.nextval) quando a coluna tem dados?

  • 2

Eu criei uma sequência assim:

CREATE SEQUENCE seq_test2
  MINVALUE 0
  MAXVALUE 999999999999999999999999999
  START WITH 0
  INCREMENT BY 1;

Ambas as duas consultas me mostram o número 0:

 select SEQ_TEST2.nextval from DUAL;   
 select SEQ_TEST2.currval from DUAL;

E eu tenho uma tabela como você pode ver aqui:

create table STUDENT
(
  st_id      NUMBER,
  first_name VARCHAR2(150),
  last_name  VARCHAR2(150)
)

Após executar a consulta abaixo,

select t.st_id , nvl(t.st_id , seq_test2.nextval) as seq
from STUDENT t

Quando não há null na st_idcoluna, o resultado que recebo é este:

    st_id    seq
   ---------------
      1       1
      2       2
      3       3
      4       4
      5       5

quando insiro uma linha para a qual a coluna st_idé null , após executar a consulta acima o resultado é como abaixo:

      st_id    seq
   ---------------
       1       1
       2       2
       3       3
       4       4
       5       5
       null    10

E se eu executá-lo novamente, vejo:

      st_id    seq
   ---------------
       1       1
       2       2
       3       3
       4       4
       5       5
       null    16

Parece que mesmo que a coluna st_idtenha data , esta parte do NVL function(seq_test2.nextval) é executada !!!! Por que isso está acontecendo?

desde já, obrigado

oracle oracle-11g-r2
  • 2 respostas
  • 197 Views
Martin Hope
Pantea
Asked: 2021-06-29 02:04:47 +0800 CST

Como lidar com datas NULL em uma "tabela de fatos acumulados"

  • 1

Um tipo de tabela de fatos na modelagem dimensional é Accumulating Snapshot fact Table. se você acha que precisa rever o significado e a definição deste tipo, você pode dar uma olhada neste artigo: https://www.holistics.io/blog/the-three-types-of-fact-tables/ .

Imagine que temos uma tabela de fatos acumulados que possui três colunas de data importantes

'Order_Datekey , Manufacturing_Datekey , Ship_Datekey'

Quando a tabela está sendo inserida pela primeira vez, não há dados para colunas Manufacturing_Datekey and Ship_Datekey'. Só sabemos a data em que o produto foi encomendado (Order_date). O que eu preciso saber é como podemos lidar com valores nulos para colunas de data? O ponto importante que li no livro Kimbal é que null deve ser evitado em uma coluna de chave estrangeira.

'Referential
integrity is violated if you put a null in a fact table column declared as a foreign key
to a dimension table'

Por outro lado, não temos nenhum valor para essas duas colunas de data no início. O que você sugere?

desde já, obrigado

data-warehouse business-intelligence
  • 1 respostas
  • 189 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