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

Ukuran maksimum variabel varchar(max)

Sejauh yang saya tahu tidak ada batas atas pada tahun 2008.

Di SQL Server 2005 kode dalam pertanyaan Anda gagal pada penugasan ke @GGMMsg variabel dengan

Mencoba menumbuhkan LOB melebihi ukuran maksimum yang diizinkan yaitu 2.147.483.647 byte.

kode di bawah ini gagal dengan

REPLICATE:Panjang hasil melebihi batas panjang (2GB) target tipe besar.

Namun tampaknya batasan ini diam-diam telah dicabut. Pada tahun 2008

DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681); 

SET @y = REPLICATE(@y,92681);

SELECT LEN(@y) 

Kembali

8589767761

Saya menjalankan ini pada mesin desktop 32 bit saya sehingga string 8GB ini jauh melebihi memori yang dapat dialamatkan

Menjalankan

select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid

Dikembalikan

internal_objects_alloc_page_co 
------------------------------ 
2144456    

jadi saya kira ini semua hanya disimpan di LOB halaman dalam tempdb tanpa validasi panjangnya. Pertumbuhan jumlah halaman semuanya terkait dengan SET @y = REPLICATE(@y,92681); penyataan. Penetapan variabel awal ke @y dan LEN perhitungan tidak meningkatkan ini.

Alasan untuk menyebutkan ini adalah karena jumlah halaman jauh lebih banyak dari yang saya harapkan. Dengan asumsi halaman 8KB maka ini berfungsi pada 16,36 GB yang jelas kurang lebih dua kali lipat dari apa yang tampaknya diperlukan. Saya berspekulasi bahwa ini mungkin karena ketidakefisienan operasi penggabungan string yang perlu menyalin seluruh string besar dan menambahkan potongan ke akhir daripada dapat menambahkan ke akhir string yang ada. Sayangnya saat ini .WRITE metode tidak didukung untuk variabel varchar(max).

Penambahan

Saya juga telah menguji perilaku dengan menggabungkan nvarchar(max) + nvarchar(max) dan nvarchar(max) + varchar(max) . Keduanya memungkinkan batas 2GB terlampaui. Mencoba untuk kemudian menyimpan hasil ini dalam sebuah tabel kemudian gagal namun dengan pesan kesalahan Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes. lagi. Script untuk itu ada di bawah (mungkin butuh waktu lama untuk dijalankan).

DECLARE @y1 VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),2147483647); 
SET @y1 = @y1 + @y1;
SELECT LEN(@y1), DATALENGTH(@y1)  /*4294967294, 4294967292*/


DECLARE @y2 NVARCHAR(MAX) = REPLICATE(CAST('X' AS NVARCHAR(MAX)),1073741823); 
SET @y2 = @y2 + @y2;
SELECT LEN(@y2), DATALENGTH(@y2)  /*2147483646, 4294967292*/


DECLARE @y3 NVARCHAR(MAX) = @y2 + @y1
SELECT LEN(@y3), DATALENGTH(@y3)   /*6442450940, 12884901880*/

/*This attempt fails*/
SELECT @y1 y1, @y2 y2, @y3 y3
INTO Test


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memperbaiki SQL Server Mendeteksi Kesalahan I/O Berbasis Konsistensi Logis

  2. Algoritma pengurutan SQL Server GUID. Mengapa?

  3. Cara Menjalankan Pemicu Hanya Saat Kolom Tertentu Diperbarui (SQL Server)

  4. Apakah ada fungsi Max di SQL Server yang mengambil dua nilai seperti Math.Max ​​di .NET?

  5. sp_add_schedule vs sp_add_jobschedule di SQL Server:Apa Bedanya?