Bagaimana cara menggunakan skema terpisah mempengaruhi kinerja SQL Server 2008?

11

Saya ingin menggunakan skema terpisah untuk objek dengan tujuan berbeda di database SQL Server 2008 kami. Saat ini kami menggunakan konvensi penamaan yang cukup mematikan untuk menunjukkan tujuan dari tabel atau prosedur tersimpan, dan awalan berarti kita harus memindai lima atau enam karakter x sebelum kita bahkan melihat awal dari nama yang unik. Saya ingin menggunakan skema terpisah untuk tabel yang hanya digunakan untuk mengarahkan UI (menu, peran per orang, dll.) Dan bagi mereka yang tabel dimensi vs tabel fakta, dll.

Pertanyaan saya adalah, apakah akan ada dampak kinerja dari menggunakan beberapa skema (skema?) Bertentangan dengan dbo lama yang baik untuk semuanya?


sumber

Jawaban:

4

Mungkin ada dampak pada kinerja pengoptimal kueri, meskipun kecil, tergantung pada gaya pengkodean Anda. Jika Anda mereferensikan tabel tanpa skema, pengoptimal harus mencoba mengidentifikasi tabel terlebih dahulu dengan memeriksa tabel dalam skema default pengguna (jika ada), kemudian menggunakan dbo., Dan kemudian yang lainnya. Jika Anda secara eksplisit merujuk tabel sebagai schema.table, yang mungkin merupakan praktik yang baik, maka bahkan overhead kecil ini akan dihindari.


sumber
1

Tidak ada perbedaan dalam kinerja. Namun, Anda menggunakan skema sekarang (bahkan jika Anda tidak mengetahuinya).

Penggunaan referensi ke objek skema seperti tabel, prosedur tersimpan, UDF, dll. Yang tidak memenuhi syarat skema memang memiliki dampak kinerja. Referensi harus selalu dikualifikasikan berdasarkan skema. Referensi yang tidak memenuhi syarat harus diselesaikan, dan itu terjadi seperti ini:

  • Pertama, cari objek dengan nama dan jenis yang sama di bawah skema default pengguna di bawah kredensial sesi yang ditetapkan (misalnya jsmith). Jika ditemukan, instance itu digunakan.
  • Jika tidak, cari objek dengan nama dan jenis yang sama di bawah skema dbo.

Ini memiliki beberapa efek:

  • Sebagian besar waktu, dua pencarian diperlukan untuk menyelesaikan referensi daripada pencarian tunggal yang diperlukan jika referensi tersebut memenuhi syarat skema.
  • Paket eksekusi diperoleh saat kueri / prosedur tersimpan / fungsi yang ditentukan pengguna terikat tidak bisa di-cache dan digunakan kembali.

Efek terakhir yang hanya akan Anda temukan — menyakitkan — ketika sesuatu rusak adalah bahwa pengguna yang berbeda mungkin mendapatkan hasil yang berbeda dari kueri atau prosedur tersimpan yang diberikan. Sesuatu seperti select * from foo join bardapat bekerja dengan baik untuk saya sebagai pemilik db; mungkin rusak untuk pengguna jsmithyang, secara tidak sengaja atau tidak, membuat tabel bernama di foobawah skema sendiri ( jsmith.foo) di database yang sama.

Untuk alasan ini juga, createdan droppernyataan harus memenuhi syarat skema nama objek yang dibuat atau dijatuhkan.


sumber