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

sql statis vs dinamis

Kode contoh Anda sangat sederhana sehingga akan ada sedikit perbedaan, tetapi dalam hal ini versi statis kemungkinan besar akan berjalan lebih baik.

Alasan utama menggunakan SQL dinamis untuk kinerja adalah ketika pernyataan SQL dapat bervariasi secara signifikan - yaitu Anda mungkin dapat menambahkan kode tambahan ke klausa WHERE saat runtime berdasarkan status sistem (dibatasi oleh sub-kueri pada Alamat, jika Alamat dimasukkan, dll).

Alasan lain adalah terkadang menggunakan variabel Bind sebagai parameter bisa menjadi kontra-produktif.

Contohnya adalah jika Anda memiliki sesuatu seperti bidang status, di mana data tidak didistribusikan secara merata (tetapi diindeks).

Perhatikan 3 pernyataan berikut, ketika 95% data 'Diproses

   SELECT col FROM table 
   WHERE status = 'U'-- unprocessed
   AND company = :company

   SELECT col FROM table 
   WHERE status = 'P' -- processed
   AND company = :company

   SELECT col FROM table
   WHERE status = :status
   AND company = :company

Dalam versi final, Oracle akan memilih rencana penjelasan umum. Pada versi pertama, mungkin memutuskan rencana terbaik adalah memulai dengan indeks status (mengetahui bahwa 'entri yang tidak diproses adalah bagian yang sangat kecil dari total).

Anda dapat menerapkannya melalui pernyataan statis yang berbeda, tetapi jika Anda memiliki pernyataan yang lebih kompleks yang hanya berubah beberapa karakter, SQL dinamis mungkin merupakan pilihan yang lebih baik.

Kelemahan

Setiap pengulangan pernyataan SQL dinamis yang sama menimbulkan penguraian lunak, yang merupakan overhead kecil dibandingkan dengan pernyataan statis, tetapi masih merupakan overhead.

Setiap pernyataan sql BARU (dinamis atau statis) juga menimbulkan kunci pada SGA (memori bersama), dan dapat mengakibatkan dikeluarkannya pernyataan 'lama'.

Desain sistem yang buruk, tetapi umum, adalah seseorang menggunakan SQL dinamis untuk menghasilkan pilihan sederhana yang hanya bervariasi menurut kunci - yaitu

SELECT col FROM table WHERE id = 5
SELECT col FROM table WHERE id = 20
SELECT col FROM table WHERE id = 7

Pernyataan individu akan cepat, tetapi kinerja sistem secara keseluruhan akan memburuk, karena membunuh sumber daya bersama.

Juga - jauh lebih sulit untuk menjebak kesalahan pada waktu kompilasi dengan SQL dinamis. Jika menggunakan PL/SQL, ini membuang pemeriksaan waktu kompilasi yang baik. Bahkan ketika menggunakan sesuatu seperti JDBC (di mana Anda memindahkan semua kode database Anda ke dalam string - ide bagus!), Anda bisa mendapatkan pra-parser untuk memvalidasi konten JDBC. SQL Dinamis =hanya pengujian waktu proses.

Overhead

Overhead eksekusi langsung kecil - itu dalam seperseribu detik - namun, itu dapat bertambah jika ini ada di dalam loop / pada metode yang disebut sekali per objek / dll. Saya pernah mendapat peningkatan kecepatan 10x dengan mengganti dinamis SQL dengan SQL statis yang dihasilkan. Namun, ini memperumit kode, dan hanya dilakukan karena kami membutuhkan kecepatan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC ResultSet dapatkan kolom dengan alias tabel

  2. kursor:pin S tunggu di X

  3. Contoh untuk Mendemonstrasikan Kerentanan SQL Injection dan Pencegahannya di Oracle

  4. Bagaimana cara mengkonfigurasi set karakter UTF8 di Oracle?

  5. Proses Latar Belakang