2012-01-27 12 views
12

Powiel możliwe:
is there an advantage to varchar(500) over varchar(8000)?Różnica między varchar (5) a varchar (5000)?

W SQL Server możemy określić typ pola varchar(n):

wielkość bagażu jest rzeczywista długość w bajtach danych wprowadzonych, nie n bajtów.

Często przy planowaniu struktury bazy danych próbuję wyobrazić maksymalną możliwą długość ciągów, które mają być przechowywane w tych varchar pól, a następnie ustawić rozmiar + wyobrazić, że jakiś backup na polu varchar. Czasami może się zdarzyć, że początkowo zapewniony pokój nie wystarczy na pole, a następnie muszę zwiększyć długość.

Ale czy warto ograniczyć pole varchar do pewnej wartości, a nie tylko ustawić coś w rodzaju varchar(5000) lub nawet varchar(max), które będzie w 100% pasować do przypadku? Czy jest jakaś korzyść w organizacji strony w SQL Server lub organizacji indeksu, kiedy ograniczam tę długość o n?

Aktualizacja

Oto co mam na myśli (przewagi): https://stackoverflow.com/a/5353196/355264

Tak, optymalizator kwerendy można odgadnąć, ile wierszy zmieścić się w stronę, jeśli dużo pola varchar, które są większe niż to konieczne, SQL Serwer może wewnętrznie odgadnąć niepoprawną liczbę wierszy.

Czy powyższe jest prawdziwe? Czy są jakieś inne zalety?

+1

możliwy duplikat [jest korzyścią varchar (500) nad varchar (8000)?] (http://stackoverflow.com/questions/2009694/is-there-an-advantage-to -varchar500-over-varchar8000) lub [varchar (ma x) wszędzie?] (http://stackoverflow.com/questions/2091284/varcharmax-everywhere) lub [SQL Server VARCHAR Column Width] (http://dba.stackexchange.com/questions/11614/sql-server- varchar-column-width) –

+0

RE: Twoja edycja. Zobacz [moja odpowiedź tutaj] (http://stackoverflow.com/questions/2009694/is-there-an-advantage-to-varchar500-over-varchar8000/5654947#5654947) –

Odpowiedz

17

Po pierwsze - ty CAN NOT indeksować kolumnę, która ma ponad 900 bajtów.

Samo to (dla mnie) jest zabójcze przeciwko użyciu kryteriów varchar(5000) (lub varchar(max)) przez cały czas, nawet jeśli nie są potrzebne ....

Użyj odpowiedniej wielkości.

Ponadto: varchar dodaje co najmniej 2 bajty narzutu, więc w przypadku ciągów składających się z 10 znaków lub mniej, zawsze polecam używanie zamiast tego char(n).

char(5) użyje 5 bajtów pamięci - zawsze. varchar(5) używa od 2 do 7 bajtów pamięci.

+2

Tak więc faktycznie 'varchar (15)' będzie to samo, co 'varchar (500)' pod względem wydajności i szybkości, prawda? To znaczy. jeśli myślę, że dane będą miały około 15-20 bajtów (może mniej lub więcej), mogę po prostu podać 'varchar (150)'? To jest właściwie moje główne pytanie. –

+0

Nie rozumiem tego "zawsze" ... pytanie między używaniem varchar (500) lub varchar (max) wyklucza jakąkolwiek sugestię, że łańcuchy mają zwykle 10 lub mniej znaków. –

+1

Kolumna typu 'char (100)' będzie ** zawsze ** mieć dokładnie 100 znaków długości - nawet jeśli w niej będzie przechowywany tylko "Isaac", zostanie dopełniony do określonej długości (100 znaków) ze spacjami - więc naprawdę przechowujesz "Izaaka ...................." - co jest wysoce nieefektywne. –

12

Serwer MS SQL przechowuje varchar (8000) i krótszy inaczej niż varchar (MAX).

rozmiarze, w których rodzaje MAX są przenoszone z stron danych tabel i do swoich stron danych jest już ustalona na 8000 bajtów, gdy [duża wartość typy od rzędu] jest ustawione w pozycji OFF.

Istnieje kilka powodów, dla których należałoby użyć use varchar (n) zamiast varchar (MAX)

Wydajność

varchar (n) szybciej http://rusanu.com/2010/03/22/performance-comparison-of-varcharmax-vs-varcharn/

indeksowania

varchar (900) i mniejsze mogą być indeksowane, ale nie varchar (MAX) lub varchar (901) lub większy

Zgodność

MS SQL Server Compact Edition nie support varchar (MAX)