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

Cara mengoptimalkan pembaruan SQL yang berjalan pada tabel Oracle dengan 700 juta baris

Pertama-tama apakah ini permintaan satu kali atau permintaan berulang? Jika Anda hanya perlu melakukannya sekali, Anda mungkin ingin menjalankan kueri dalam mode paralel. Anda tetap harus memindai semua baris, Anda dapat membagi beban kerja sendiri dengan rentang ROWID (paralelisme do-it-yourself) atau menggunakan fitur bawaan Oracle.

Dengan asumsi Anda ingin sering menjalankannya dan ingin mengoptimalkan kueri ini, jumlah baris dengan field kolom sebagai NULL pada akhirnya akan menjadi kecil dibandingkan dengan jumlah total baris. Dalam hal ini indeks dapat mempercepat. Oracle tidak mengindeks baris yang memiliki semua kolom yang diindeks sebagai NULL sehingga indeks pada field tidak akan digunakan oleh kueri Anda (karena Anda ingin menemukan semua baris di mana field adalah NULL).

Atau:

  • buat indeks pada (FIELD, 0) , 0 akan bertindak sebagai pseudocolumn non-NULL dan semua baris akan diindeks pada tabel.
  • buat indeks berbasis fungsi pada (CASE WHEN field IS NULL THEN 1 END) , ini hanya akan mengindeks baris yang NULL (karena itu indeks akan sangat kompak). Dalam hal ini Anda harus menulis ulang kueri Anda:

    UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1

Sunting:

Karena ini adalah skenario satu kali, Anda mungkin ingin menggunakan PARALLEL petunjuk:

SQL> EXPLAIN PLAN FOR
  2  UPDATE /*+ PARALLEL(test_table 4)*/ test_table
  3     SET field=0
  4   WHERE field IS NULL;

Explained

SQL> select * from table( dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4026746538
--------------------------------------------------------------------------------
| Id  | Operation             | Name       | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT      |            | 22793 |   289K|    12   (9)| 00:00:
|   1 |  UPDATE               | TEST_TABLE |       |       |            |
|   2 |   PX COORDINATOR      |            |       |       |            |
|   3 |    PX SEND QC (RANDOM)| :TQ10000   | 22793 |   289K|    12   (9)| 00:00:
|   4 |     PX BLOCK ITERATOR |            | 22793 |   289K|    12   (9)| 00:00:
|*  5 |      TABLE ACCESS FULL| TEST_TABLE | 22793 |   289K|    12   (9)| 00:00:
--------------------------------------------------------------------------------


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ganti nama Tabel atau Tampilan Oracle

  2. Keluarkan String ke int dan gunakan di klausa Where

  3. Periksa tabel ada atau tidak sebelum membuatnya di Oracle

  4. N+1 Redundansi dan Konsolidasi Server

  5. Abaikan parameter rentang tanggal di klausa where saat parameter tidak dimasukkan