SORU
30 EYLÜL 2011, Cuma


Bir ikilik(max) değişken maksimum boyutu

Herhangi bir zaman geçmiş, eğer birisi sordu bana en büyük boyutu için varchar(max), zorunda olduğumu söyledi 2 GB ya baktım bir daha tam figure (2^31-1 veya 2147483647).

Ancak, bazı yeni test, varchar(max) değişkenler görünüşe göre bu boyutu aşan keşfettim

create table T (
    Val1 varchar(max) not null
)
go
declare @KMsg varchar(max) = REPLICATE('a',1024);
declare @MMsg varchar(max) = REPLICATE(@KMsg,1024);
declare @GMsg varchar(max) = REPLICATE(@MMsg,1024);
declare @GGMMsg varchar(max) = @GMsg   @GMsg   @MMsg;
select LEN(@GGMMsg)
insert into T(Val1) select @GGMMsg
select LEN(Val1) from T

Sonuçlar:

(no column name)
2148532224
(1 row(s) affected)
Msg 7119, Level 16, State 1, Line 6
Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
The statement has been terminated.

(no column name)
(0 row(s) affected)

Yani, ben şimdi bir olduğunu göz önüne alındığındadeğişken2 GB bariyer - herkes gerçek sınır varchar(max) bir değişken için ne olduğunu biliyor mu? aşabilir


(Yukarıdaki test SQL Server 2008 (R2) üzerinde tamamladı. Diğer sürümler için geçerli olup olmadığını bilmiyorum) merak ediyorum

CEVAP
30 EYLÜL 2011, Cuma


Söyleyebileceğim kadarıyla 2008 yılında üst sınırı yoktur.

SQL Server 2005 te söz konusu kod ile @GGMMsg değişken için görev başarısız olur

Büyümeye çalışırken LOB 2,147,483,647 izin verilen en büyük boyutu bayt.

aşağıdaki kod ile başarısız olur

ÇOĞALTMAK: sonuç uzunluğu uzunluğu sınırı (2) aşıyor hedef büyük yazın.

Ancak bu sınırlamalar sessizce kaldırılmış gibi görünüyor. 2008

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

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

SELECT LEN(@y) 

Verir

8589767761

Bu dize 8 GB adreslenebilir bellek fazla yolu 32 bit masaüstü bu koştum

Çalışıyor

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

Döndü

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

bu sadece uzunluğu üzerinde hiçbir doğrulama ile tempdb 17 *sayfalarında saklanan tüm da bana öyle geliyor. Sayfa sayısı büyüme SET @y = REPLICATE(@y,92681); deyimi ile ilişkilidir. @y LEN hesaplama için ilk değişken atama bu artmadı.

Bu sayfa sayısı olduğundan söz nedeni beklediğimden çok daha fazla. 8KB bir sayfa sonra belli ki ya da daha az çift daha ne 16.36 GB şu çalıştığını varsayarak gerekli gibi görünüyor. Tahminim bu olasılığı nedeniyle verimsizlik dize birleştirme işlemi ihtiyacı kopya tüm büyük ve dize bir parça eklemek için daha ekleyebilir ucunda varolan bir dize. Ne yazık ki şu an .WRITE yöntemi 28* *varchar(max) değişkenleri için.

Ayrıca

Ayrıca nvarchar(max) nvarchar(max) nvarchar(max) varchar(max) bitiştirmek ile davranışlarını test ettim. Bunların her ikisi de 2 GB sınırını aştı için izin verir. Sonra bir tablo bu sonuçları daha sonra saklamak için çalışıyorum ancak hata mesajı ile Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes. yine başarısız. Bunun için aşağıdaki komut dosyası (çalıştırmak için uzun zaman alabilir).

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chriselle Lim

    Chriselle Li

    26 Ocak 2008
  • GirlSanctuaryBlog

    GirlSanctuar

    28 Aralık 2011
  • Tek Syndicate

    Tek Syndicat

    23 Temmuz 2008