Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

apakah ada keuntungan varchar(500) dibandingkan varchar(8000)?

Salah satu contoh di mana hal ini dapat membuat perbedaan adalah dapat mencegah pengoptimalan kinerja yang menghindari penambahan informasi versi baris ke tabel dengan pemicu setelahnya.

Ini dibahas oleh Paul White di sini

Ukuran sebenarnya dari data yang disimpan tidak penting – ukuran potensiallah yang penting.

Demikian pula jika menggunakan tabel yang dioptimalkan memori sejak 2016, dimungkinkan untuk menggunakan kolom LOB atau kombinasi lebar kolom yang berpotensi melebihi batas inrow tetapi dengan penalti.

(Maks) kolom selalu disimpan di luar baris. Untuk kolom lain, jika ukuran baris data dalam definisi tabel dapat melebihi 8.060 byte, SQL Server mendorong kolom dengan panjang variabel terbesar di luar baris. Sekali lagi, ini tidak tergantung pada jumlah data yang Anda simpan di sana.

Ini dapat memiliki efek negatif yang besar pada konsumsi dan kinerja memori

Kasus lain di mana mendeklarasikan lebar kolom secara berlebihan dapat membuat perbedaan besar adalah jika tabel akan diproses menggunakan SSIS. Memori yang dialokasikan untuk kolom dengan panjang variabel (non BLOB) ditetapkan untuk setiap baris dalam pohon eksekusi dan sesuai dengan panjang maksimum yang dinyatakan oleh kolom yang dapat menyebabkan penggunaan buffer memori yang tidak efisien (contoh). Sementara pengembang paket SSIS dapat mendeklarasikan ukuran kolom yang lebih kecil daripada sumber, analisis ini sebaiknya dilakukan di awal dan diterapkan di sana.

Kembali ke mesin SQL Server itu sendiri, kasus serupa adalah ketika menghitung hibah memori yang dialokasikan untuk SORT operasi SQL Server mengasumsikan bahwa varchar(x) kolom rata-rata akan mengkonsumsi x/2 byte.

Jika sebagian besar varchar . Anda kolom lebih penuh dari itu dapat menyebabkan sort operasi tumpah ke tempdb .

Dalam kasus Anda jika varchar . Anda kolom dideklarasikan sebagai 8000 byte tetapi sebenarnya memiliki konten yang jauh lebih sedikit daripada kueri Anda akan dialokasikan memori yang tidak diperlukan yang jelas tidak efisien dan dapat menyebabkan menunggu pemberian memori.

Ini tercakup dalam Bagian 2 dari SQL Workshops Webcast 1 yang dapat diunduh dari sini atau lihat di bawah.

use tempdb;

CREATE TABLE T(
id INT IDENTITY(1,1) PRIMARY KEY,
number int,
name8000 VARCHAR(8000),
name500 VARCHAR(500))

INSERT INTO  T 
(number,name8000,name500)
SELECT number, name, name /*<--Same contents in both cols*/
FROM master..spt_values

SELECT id,name500
FROM T
ORDER BY number

SELECT id,name8000
FROM T
ORDER BY number



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menjalankan Paket SSIS menggunakan dtexec

  2. Cara Menghapus Trailing Whitespace di SQL Server – RTRIM()

  3. Keamanan Ketat CLR di SQL Server 2017

  4. Pantau Harapan Hidup Halaman di SQL Server

  5. Gunakan COL_LENGTH() untuk Mendapatkan Panjang Kolom di SQL Server