Access
 sql >> Teknologi Basis Data >  >> RDS >> Access

Mengevaluasi saat ekspresi dalam kueri dievaluasi

Saya selalu menemukan bagan Itzik Ben-Gan yang sangat baik tentang pemrosesan SQL logis sangat membantu dalam menalar tentang kinerja kueri. Meskipun bagan dibuat untuk SQL Server, bagan itu masih berlaku untuk mesin database apa pun yang mengikuti SQL Standard, yang juga menyertakan mesin database Access. Meskipun kami senang menggunakan database SQL Server, terkadang kami memiliki database Access atau aplikasi Access yang memerlukan penggunaan kueri Access (mis. tabel sementara untuk pelaporan). Access tidak dilengkapi dengan alat pembuatan profil yang mewah, jadi apa yang harus kita lakukan?

Jerry-rigging utilitas pelacakan kami sendiri

Itu membuat saya bertanya-tanya - dapatkah seseorang menentukan kapan klausa kueri SQL dieksekusi dan seberapa sering? Access memang memiliki sarana untuk menunjukkan rencana eksekusi tetapi tidak masuk ke detail tentang bagaimana dan kapan detail tersebut diproses. Ada cara memutar untuk menyimpulkan fisik urutan pemrosesan yang digunakan oleh mesin database Access:fungsi VBA khusus!

Public Function Trace(EventName As String, Optional Value As Variant) As Boolean If IsMissing(Value) Kemudian Debug.Print EventName, "#No Value#" Else Debug.Print EventName, Value End If Trace =TrueEnd Function 

Ini dapat disimpan dalam modul standar. Kami kemudian dapat menyiapkan tabel sederhana:

Menelusuri klausa kueri Access

Dengan pengaturan itu, kita dapat membuat kueri Access dan memercikkan Trace di berbagai bagian kueri Access. Ini salah satu contohnya:

SELECT c1.ColorID, Trace("SELECT") AS Ignored1, Trace("SELECT",c1.Color) AS Ignored2FROM tblColor AS c1 WHERE Trace("WHERE") <> 0 AND Trace("WHERE", c1 .Warna) <> 0ORDER BY Trace("ORDER BY"), Trace("ORDER BY", c1.Color);

Jika Anda kemudian membuka kueri dalam tampilan lembar data, lalu pergi ke jendela langsung VBIDE, Anda akan melihat output seperti ini:

WHERE #No Value#ORDER BY #No Value#SELECT #No Value#WHERE RedORDER BY RedWHERE GreenORDER BY GreenWHERE BlueORDER BY BlueSELECT BlueSELECT GreenSELECT Red

Ini memberi kami beberapa wawasan tentang bagaimana Access menyelesaikan kueri yang dapat membantu saat Anda perlu mengoptimalkan kueri yang berkinerja buruk. Mari kita lihat apa yang bisa kita pelajari:

  • Kita dapat melihat bahwa jika tidak ada referensi kolom, fungsi VBA dipanggil sedini mungkin karena Access mengenali bahwa mereka hanya dapat memiliki satu nilai untuk seluruh kumpulan hasil, jadi tidak ada gunanya memanggil fungsi tersebut berulang kali saja untuk mendapatkan jawaban yang sama. Anda dapat melihat bahwa Trace pemanggilan tanpa argumen opsional ke-2 dievaluasi terlebih dahulu sebelum semua pemanggilan lain yang berisi referensi kolom dalam argumen opsional ke-2.
  • Sebagai akibat wajar dari poin sebelumnya, jika pemanggilan berisi referensi kolom, maka harus dievaluasi setidaknya sekali untuk setiap baris. Anda dapat melihat bahwa kami memeriksa setiap nilai warna saat mengevaluasi klausa.
  • Kami melihat bahwa urutannya secara umum mirip dengan apa yang kami lihat di grafik Itzik Ben-Gan; WHERE dievaluasi sedini mungkin, ORDER BY dievaluasi setelah kami menghilangkan semua baris yang tidak memenuhi syarat, lalu apa pun yang tersisa, SELECT kemudian dievaluasi.
  • Meskipun kami mengharapkan pengurutan diterapkan setelah kami memfilter baris yang tidak memenuhi syarat, tampaknya Access lebih memilih untuk mencoba dan mengurutkan output sesegera mungkin, mungkin karena lebih murah untuk menyisipkan baris baru di baris yang diurutkan daftar daripada menyortir seluruh rangkaian.

Eksperimen &kesimpulan tambahan

Anda dapat bereksperimen sedikit dengan kueri yang berbeda. Misalnya, Anda bisa mendapatkan wawasan tentang kapan/sering Access memproses GROUP BY , dengan menggunakan kueri yang mirip dengan ini:

SELECT c1.ColorID, Trace("SELECT") AS Ignored1FROM tblColor AS c1 INNER JOIN tblColor AS c2 PADA c1.ColorID =c2.ColorIDWHERE Trace("WHERE") <> 0 AND Trace("WHERE", [c1 ].[Color]) <> 0GROUP BY c1.ColorID, Trace("GROUP BY", c1.Color)ORDER BY c1.ColorID;

Anda kemudian dapat menggunakan ini bersama dengan JetShowPlan untuk mempelajari lebih lanjut tentang apa yang sebenarnya dilakukan mesin database. Mudah-mudahan, Anda mungkin merasa terbantu dalam mendapatkan wawasan tentang bagaimana Anda bisa meningkatkan kinerja kueri Access Anda. Sebagai tantangan, Anda dapat menjelaskan mengapa Access mengeksekusi GROUP BY cara itu. Saya juga mendorong Anda untuk bereksperimen membuka lembar data dan menggulir. Anda kemudian akan menemukan bahwa SELECT akan dievaluasi ulang sebagai hasil dari navigasi di sekitar.

Saya harus menunjukkan bahwa teknik di atas memberi kita wawasan tentang fisik rencana pemrosesan, daripada urutan pemrosesan logis seperti yang dijelaskan dalam bagan. Oleh karena itu, kita harus mengharapkan rencana berbeda untuk volume data yang berbeda atau untuk kueri yang berbeda. Kita juga harus mempertimbangkan bahwa menambahkan Trace fungsi dapat mempengaruhi rencana. Namun, saya berpendapat bahwa jika Anda sangat memperhatikan pertimbangan tersebut, mungkin lebih baik untuk memindahkan kueri tersebut dan data dasarnya ke database SQL Server tempat Anda memiliki lebih banyak opsi untuk mengoptimalkan kinerja kueri.

Selamat bersenang-senang!

Butuh bantuan dengan kueri Microsoft Access? Hubungi Access Experts di (773) 809 5456 atau kirim email ke tim hari ini.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Access berbicara dengan sumber data ODBC? Bagian 1

  2. 4 Cara Database Inventaris Menguntungkan Ritel

  3. Cara Menghentikan atau Mengontrol Penanda Pemeriksaan Kesalahan Microsoft Access

  4. Manfaat Menggunakan Template Microsoft Access

  5. String Koneksi Ad-hoc dan Kueri Heterogen untuk MS Access