Apakah ukuran varchar penting dalam tabel sementara?

16

Ada perdebatan di pekerjaan istri saya tentang hanya menggunakan varchar(255)untuk semua varcharbidang dalam tabel sementara dalam prosedur tersimpan. Pada dasarnya, satu kamp ingin menggunakan 255 karena akan selalu berfungsi bahkan jika definisi berubah, dan kamp lainnya ingin tetap dengan ukuran dalam tabel sumber untuk potensi peningkatan kinerja.

Apakah kamp pertunjukannya benar? Apakah ada implikasi lain? Mereka menggunakan SQL Server.

Brian Nickel
sumber
Saya berpendapat bahwa mungkin Anda tidak perlu tabel sementara di tempat pertama. Untuk apa mereka digunakan? Jika diperlukan, untuk apa kolom khusus ini digunakan? Apakah mereka digunakan dalam gabungan atau perbandingan apa pun? Apakah ada kolom yang mendasari nvarchar dan bukan varchar?
Aaron Bertrand
@ AaronBertrand Tabel sementara ada untuk modularitas. Data ditransformasikan dan dihuni beberapa kali berdasarkan aturan bisnis yang dapat berubah. Saya pikir ada juga beberapa MAX()dalam campuran.
Brian Nickel

Jawaban:

6

Bergantung pada bagaimana Anda menggunakan tabel temp Anda, Anda bisa mengalami masalah pemotongan data.

Contoh ini sedikit dibuat-buat, tetapi menggambarkan poin saya. Contoh:

  1. Kolom tabel pengguna Anda adalah varchar (50).
  2. Kolom temp table Anda adalah varchar (255).
  3. Anda memiliki catatan dengan 45 karakter di kolom itu di tabel pengguna Anda.
  4. Dalam prosedur Anda, Anda menggabungkan '- untuk kemenangan' ke akhir kolom itu, sebelum menggabungkan tabel temp ke dalam tabel pengguna Anda.

Tabel temp akan dengan senang hati menerima nilai varchar baru dengan panjang 59. Namun, tabel pengguna Anda tidak bisa. Bergantung pada bagaimana Anda menangani ini dalam prosedur Anda, ini dapat mengakibatkan pemotongan atau kesalahan.

Kecuali jika Anda mendokumentasikan dan menjelaskan masalah ini, prosedur Anda dapat melakukan hal yang tidak terduga.

Secara pribadi, saya tidak berpikir ada jawaban untuk pertanyaan ini yang benar 100% dari waktu. Itu benar-benar tergantung pada bagaimana Anda menggunakan tabel temp tersebut.

Semoga ini membantu

Matt M
sumber
0

gunakan varchar(255)untuk semua varcharbidang dalam tabel sementara dalam prosedur tersimpan.

Saya akan condong ke arah penggunaan panjang bidang yang sebenarnya.

Saya membaca baru-baru ini bahwa MySQL (saya berasumsi SQL Server serupa) tabel temp mengalokasikan cukup memori untuk menyimpan panjang maksimum yang mungkin untuk setiap varcharkolom ... Pendekatan sistematis untuk mengalokasikan 200% -500% dari memori yang diperlukan untuk varcharbidang dalam semua prosedur tersimpan tampaknya seperti undian yang tidak perlu pada sumber daya sistem. Jika Anda pernah menggunakan sejumlah besar memori membuat tabel temp ini maka Anda bisa mengklaim memori yang tidak perlu yang digunakan untuk caching, menciptakan lebih banyak pekerjaan untuk server di beberapa titik di masa depan, bahkan setelah prosedur store selesai.

Sunting: Lihat jawaban Bill Karwin: /programming/1962310/importance-of-varchar-length-in-mysql-table

Mat
sumber
2
Mengasumsikan SQL Server serupa? Saya tidak akan ...
AK
Maaf, saya menyadari bahwa jawaban saya tidak lengkap. Yang saya maksudkan adalah bahwa saya akan melakukan kesalahan di sisi kehati-hatian (yaitu tidak membuat perubahan yang dapat berdampak negatif terhadap kinerja) kecuali asumsi itu ditetapkan salah.
Matt