Berapa banyak parameter prosedur tersimpan yang terlalu banyak?

12

Saya baru saja mulai menulis prosedur tersimpan dalam SQL Server 2008 dan memiliki 30+ parameter. Saya tidak pernah menulis satu dengan lebih dari ~ 10 parameter, dan itu membuat saya berpikir ... Pada titik apakah ada terlalu banyak parameter?

Untuk konteks ... prosedur ini pada dasarnya akan menyisipkan satu baris ke dalam satu tabel. Juga akan ada yang sangat mirip; meskipun agak lebih kecil; versi yang melakukan PEMBARUAN pada tabel yang sama. Sebagian besar kolom relatif kecil dengan campuran int dan string ( varchar(200)).

Apa masalahnya? baik atau buruk; untuk memiliki prosedur dengan sejumlah besar parameter dan berapa ambang batas di mana saya harus mulai mempertimbangkan pola lain?

JoeGeeky
sumber
1
Persis seperti 'jika Anda harus meminta harga, Anda tidak mampu membelinya'. Jika Anda mulai bertanya-tanya berapa banyak parameter yang terlalu banyak, Anda memiliki terlalu banyak. Masalah utama bukanlah mesin, tetapi Anda, pembaca manusia / pemelihara kode. Jadi saya katakan OK untuk memiliki sebanyak mungkin dalam kode yang dihasilkan secara otomatis , tetapi tetap masuk akal dalam tulisan tangan / dipelihara kode.
Remus Rusanu

Jawaban:

12

Masalah? Saya tidak akan berdebat.

  • Batasnya adalah 2.100 parameter . IIRC sudah 2100 sejak SQL2000 tetapi kesalahan dokumentasi menunjukkan itu 1024.
  • Jika sebuah tabel memiliki 1000 kolom (karena pengaturan kolom Sharepoint-esque sparse misalnya) dan Anda menegakkan akses melalui prosedur tersimpan, proc insert Anda mungkin memiliki 1000 parameter. Tidak ada yang salah dengan itu.
  • Lakukan jeda untuk meninjau skema ketika Anda menemukan tabel lebar (bukan 30 yang sangat lebar). Bukan hal yang aneh menemukan meja-meja yang memulai kehidupan dinormalisasi tetapi melalui kemalasan dan / atau ketidakberdayaan telah meluas tanpa bisa dikenali.
  • Bahkan tidak secara singkat mempertimbangkan untuk melewatkan serangkaian parameter sebagai daftar CSV atau XML. Blind optimizer permintaan dan menghemat sedikit waktu atau usaha.
  • Jangan engkol tangan kode klien untuk memanggil prosedur dengan sejumlah besar parameter. Alat pembuat kode seperti templat T4 atau CodeSmith untuk menyelamatkan.
Mark Storey-Smith
sumber
1
Terima kasih atas jawaban ini, itu dinyatakan dengan sangat baik. Ini menjawab pertanyaan saya dengan sempurna. Sayang sekali mereka tidak memiliki lencana untuk penggunaan kata-kata Scrabble yang hebat seperti " fecklessness "
JoeGeeky
2

Joe Celko adalah seorang penganjur daftar parameter panjang, yang ia menulis tentang secara rinci dalam ini dua bagian artikel:

Jawaban paling sederhana adalah dengan menggunakan daftar parameter panjang untuk membuat daftar dan tabel turunan di dalam tubuh prosedur. SQL server dapat menangani hingga 2100 parameter, yang seharusnya lebih dari cukup untuk tujuan praktis. SQL Server sebenarnya adalah pengecut dalam hal ini; DB2; dapat melewati parameter 32K. dan Oracle dapat memiliki parameter 64K.

... daftar parameter panjang terdiri dari parameter lama, yang berarti bahwa mereka dapat digunakan untuk output dan juga input. Itu juga terkandung dalam satu pernyataan untuk optimizer untuk digunakan.

Apakah saya pikir teknik ini akan selalu menjadi solusi terbaik? Tentu saja tidak. Tidak ada hal seperti itu di SQL. Namun perlu diperhatikan saat Anda mendapatkan masalah yang sesuai.

suatu hari nanti
sumber