Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

vấn đề về hiệu suất:sự khác biệt giữa các lựa chọn. * so với chọn *

tất nhiên chúng là hai truy vấn khác nhau. kế hoạch CÓ THỂ thay đổi với các lựa chọn khác nhau. tức là trong lần thứ. * nó có thể đang chọn quét chỉ mục đầy đủ / nhanh đầy đủ trên bảng được nối bên trái. trong khi ở lần đầu tiên, nó có thể là một bảng quét toàn bộ.

để giúp bạn thêm, chúng tôi có thể xem các kế hoạch được không? tốt hơn là làm điều này trong 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;

CHỈNH SỬA

đưa ra kế hoạch giải thích của bạn, bạn thấy có CARDINALITY =1 trên mỗi bước? bạn đã thu thập số liệu thống kê khi các bảng trống! xem cái này:

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

vì vậy hãy xem nó được sử dụng 200314 IO và mất vài giây. Ngoài ra, hãy xem ROWS =1 ở mỗi bước (tức là quét toàn bộ) .. hãy thu thập số liệu thống kê:

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.

và bây giờ chạy lại:SQL> select s. * từ sales_unit s còn lại tham gia sales_unit_relation r trên (s.sales_unit_id =r.child_sales_unit_id) trong đó r.child_sales_unit_id là 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>

bây giờ chúng tôi đã sử dụng 2537 chỉ nhận được và kế hoạch hiển thị ROWS phù hợp và một tham gia HASH (tốt hơn cho nhu cầu của chúng tôi). bảng kiểm tra của tôi có thể nhỏ hơn bảng thực của bạn, đó là lý do tại sao thời gian gần hơn




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các trình tự thoát có được giữ nguyên trong CLOB không?

  2. Oracle RAC VIP và ARP Primer

  3. Bảng phân vùng Oracle

  4. Các câu lệnh DDL kiểm tra đơn vị cần có trong một giao dịch

  5. Sử dụng bí danh bảng trong một truy vấn khác để duyệt qua một cây