Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

masalah kinerja:perbedaan antara pilih s.* vs pilih *

mereka adalah dua pertanyaan yang berbeda tentu saja. paket BISA berubah dengan pilihan yang berbeda. yaitu di sth.* mungkin memilih pemindaian indeks penuh/cepat penuh di tabel gabungan kiri. sedangkan pada yang pertama mungkin akan menjadi pemindaian tabel penuh.

untuk membantu Anda lebih lanjut, bisakah kami melihat rencananya? sebaiknya lakukan ini di 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;

EDIT

mengingat rencana penjelasan Anda, Anda melihat ada CARDINALITY=1 di setiap langkah? Anda telah mengumpulkan statistik saat meja kosong! lihat ini:

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

jadi lihat itu menggunakan 200314 IO dan butuh beberapa detik. Lihat juga ROWS =1 pada setiap langkah (yaitu pemindaian penuh)..mari kumpulkan statistik:

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.

dan sekarang jalankan kembali:SQL> pilih s.* dari kiri sales_unit s join sales_unit_relation r on (s.sales_unit_id =r.child_sales_unit_id) di mana r.child_sales_unit_id adalah 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>

sekarang kami hanya menggunakan 2537 gets dan rencananya menunjukkan ROWS yang tepat dan gabungan HASH (lebih baik untuk kebutuhan kami). tabel pengujian saya mungkin lebih kecil dari yang asli, itulah sebabnya waktunya lebih dekat




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tulis file ke SFTP menggunakan Oracle PL/SQL

  2. Kompatibilitas Oracle 11g Mundur dengan rilis oracle yang lebih lama

  3. Bagaimana cara mengubah Baris ke Kolom di Oracle?

  4. Kesalahan IO:Waktu baca soket habis. Apa alasannya?

  5. Kembalikan transaksi yang dilakukan