2010-06-29 12 views
10

Mam dużo (ponad tysiąc miejsc) starego kodu T-SQL, który powoduje, że s jest w kolumnie varchar(8000) w tabeli narzędzi. Nasze potrzeby uległy zmianie i teraz kolumna musi być w stanie obsłużyć większe wartości. W rezultacie muszę utworzyć tę kolumnę varchar(max). Jest to zwykła kolumna danych, w której nie ma wstępnych wyszukiwań, żadnego indeksu, tylko jedna procedura odczytuje ją, jest INSERT i zapomina o aplikacji (prawie jak wpis w dzienniku).Jakieś ukryte pułapki zmieniające kolumnę z varchar (8000) na varchar (max)?

Mam zamiar wprowadzić zmiany tylko w kilku miejscach, które faktycznie będą generować większe dane, oraz w pojedynczej procedurze przechowywanej, która przetwarza tę kolumnę.

  • Czy są jakieś ukryte pułapki zmieniające kolumnę z varchar(8000) na varchar(max)?
  • Czy wszystkie T-SQL funkcje ciąg działają tak samo, LEN(), RTRIM(), SUBSTRING() itp
  • Czy ktoś może sobie wyobrazić żadnego powodu, bym trzeba wprowadzać żadnych zmian w kodzie, który uważa, że ​​kolumna jest nadal varchar(8000)?
+0

Dlaczego nie można przełączyć się na kolumnie tekstowej? – Maz

+2

@Max Są rzeczy, których nie można wykonać na kolumnie TEXT, że Twoja puszka na VARCHAR (MAX) (takie jak zapytania DISTINCT) –

+0

funkcje agregacji i kolumny tekstowe nie idą zbyt dobrze, chociaż ... – riffnl

Odpowiedz

6
  • Wszystkie typy MAX mają małą karę wykonania, patrz Performance comparison of varchar(max) vs. varchar(N).
  • Jeśli konserwacja obejmuje operacje online (przebudowanie indeksu online), utracisz możliwość ich wykonania. Online operations are not supported for tables with BLOB columns:
    • indeksów klastrowanych musi być utworzony, przebudowany lub spadła trybie offline gdy podstawowa tabela zawiera duży obiekt (LOB) typy danych: image, ntext, tekst, varchar (max), nvarchar (max) , varbinary (max) i xml.
    • Indeksy nieklastrowane Nonunique można tworzyć online, gdy tabela zawiera typy danych LOB, ale żadna z tych kolumn nie jest używana w definicji indeksu jako kolumna kluczowa lub kolumny nie (włączone). Nieklastrowane indeksy zdefiniowane za pomocą kolumn typu danych LOB muszą zostać utworzone lub przebudowane w trybie offline.

Kara wydajność jest naprawdę małe, więc nie martw się o to. Utrata umiejętności przeprowadzania przebudowy online może być problematyczna w przypadku naprawdę gorących tabel operacji, które trzeba wykonać online. O ile nie są to operacje online, głosowałbym, aby przejść do niego i zmienić go na MAX.

2

Jeśli naprawdę nie potrzebujesz indeksów i jest to duża kolumna, powinieneś być w porządku. Varchar (max) wydaje się być dokładnie tym, czego potrzebujesz, a będziesz miał mniej problemów z istniejącym kodem niż gdybyś użył tekstu.

Należy przetestować wszelkie aktualizacje, w których tekst został dodany do istniejącego tekstu. Powinien działać przy regularnym łączeniu, ale chciałbym to udowodnić.

3

Crystal Reports 12 (i inne wersje, o ile mi wiadomo) nie obsługuje poprawnie varchar (max) i interpretuje je jako varchar (255), co prowadzi do obcięcia danych w raportach.

Więc jeśli używasz Crystal Reports, jest to wada dla varchar (max). Lub wadą korzystania z Crystal, aby być precyzyjnym.

Patrz:
http://www.crystalreportsbook.com/Forum/forum_posts.asp?TID=5843&PID=17503
http://michaeltbeeitprof.blogspot.com/2010/05/crystal-xi-and-varcharmax-aka-memo.html

Powiązane problemy