sql >> Databáze >  >> RDS >> Oracle

problém s výkonem:rozdíl mezi vybranými s.* a vybranými *

jsou to samozřejmě dva různé dotazy. plán se MŮŽE změnit, když se výběry budou lišit. tj. v sth.* to může být výběr úplného/rychlého úplného prohledání indexu na levé spojené tabulce. zatímco na prvním to bude možná úplné skenování tabulky.

abychom vám mohli dále pomoci, můžeme vidět plány, prosím? nejlépe to proveďte v SQL*PLUS

set timing on
set autotrace on traceonly

select s.* from sales_unit s left join sales_unit_relation r on (s.sales_unit_id = r.sales_unit_child_id) where r.sales_unit_child_id is null;

select * from sales_unit s left join sales_unit_relation r on (s.sales_unit_id = r.sales_unit_child_id) where r.sales_unit_child_id is null;

UPRAVIT

vzhledem k vašemu plánu vysvětlení vidíte na každém kroku KARDINALITA=1? shromáždili jste statistiky, když byly stoly prázdné! viz toto:

SQL> select s.* from sales_unit s left join sales_unit_relation r on (s.sales_unit_id = r.child_sales_unit_id) where r.child_sales_unit_id is null;

no rows selected

Elapsed: 00:00:03.19

Execution Plan
----------------------------------------------------------
Plan hash value: 1064670292

------------------------------------------------------------------------------------
| Id  | Operation          | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |               |     1 |    48 |    27  (86)| 00:00:01 |
|   1 |  NESTED LOOPS ANTI |               |     1 |    48 |    27  (86)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| SALES_UNIT    |     1 |    35 |     2   (0)| 00:00:01 |
|*  3 |   INDEX RANGE SCAN | SALES_REL_IX1 |     1 |    13 |    25  (92)| 00:00:01 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("S"."SALES_UNIT_ID"="R"."CHILD_SALES_UNIT_ID")


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
     200314  consistent gets
       2220  physical reads
          0  redo size
        297  bytes sent via SQL*Net to client
        339  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

takže se podívejte, že to použilo 200314 IO a trvalo to několik sekund. Viz také ŘÁDKY =1 na každém kroku (tj. úplné skenování).. pojďme shromáždit statistiky:

SQL> begin dbms_stats.gather_table_stats(user, 'SALES_UNIT', degree=>8, cascade=>true); end;
  2  /

PL/SQL procedure successfully completed.

SQL> begin dbms_stats.gather_table_stats(user, 'SALES_UNIT_RELATION', degree=>8, cascade=>true); end;
  2  /

PL/SQL procedure successfully completed.

a nyní znovu spusťte:SQL> vyberte s.* z prodejní_jednotky zbývá připojit sales_unit_relation r on (s.sales_unit_id =r.child_sales_unit_id), kde r.child_sales_unit_id je null;

no rows selected

Elapsed: 00:00:00.84

Execution Plan
----------------------------------------------------------
Plan hash value: 2005864719

-----------------------------------------------------------------------------------------------
| Id  | Operation             | Name          | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |               |   912 | 18240 |       |  1659   (3)| 00:00:20 |
|*  1 |  HASH JOIN ANTI       |               |   912 | 18240 |  2656K|  1659   (3)| 00:00:20 |
|   2 |   TABLE ACCESS FULL   | SALES_UNIT    |   100K|  1472K|       |    88   (3)| 00:00:02 |
|   3 |   INDEX FAST FULL SCAN| SALES_REL_IX1 |   991K|  4841K|       |   618   (3)| 00:00:08 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("S"."SALES_UNIT_ID"="R"."CHILD_SALES_UNIT_ID")


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       2537  consistent gets
          0  physical reads
          0  redo size
        297  bytes sent via SQL*Net to client
        339  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

SQL>

nyní jsme použili pouze 2537 get a plán ukazuje správné řádky a spojení HASH (pro naše potřeby lepší). moje testovací tabulky jsou pravděpodobně menší než vaše skutečné, a proto jsou načasování bližší




  1. MySQL ERROR 1290 (HY000) --volba zabezpečený-soubor-priv

  2. Jak vybrat pouze první řádky pro každou jedinečnou hodnotu sloupce?

  3. Modely Django:výchozí hodnota pro sloupec

  4. C#:Ekvivalence datového typu Oracle s OracleDbType