2011-02-02 3 views
5

Obecnie szukamy ustawień naszych kolumn ciągów do nvarchar(max) zamiast określania określonej długości, aby zapobiec problemom tam, gdzie może być za mało miejsca w bazie danych do przechowywania ciągu znaków. Zastanawiam się tylko, czy to jest dobre, czy może to powodować problemy, ponieważ było to w porządku, to dlaczego określić długość, jak nvarchar(10), a nie nvarchar(max). Używamy także bardzo dużo, ponieważ nie wiemy, ile danych binarnych będziemy potrzebować, więc nie jestem pewien, jak bardzo jest to efekt, ponieważ nasze wstawki nie są tak szybkie, jak myślę, że powinny być. To jest przykładowa tabela:SqlServer i nvarchar (max)

CREATE TABLE [dbo].[SAMPLETABLE] ( 
[ID] [uniqueidentifier] NOT NULL, 
[FIELD1] [int] NOT NULL, 
[FIELD2] [nvarchar] (2000) NULL, 
[FIELD3] [nvarchar] (max) NULL, 
[FIELD4] [uniqueidentifier] NULL, 
[FIELD5] [int] NULL, 
[FIELD6] [nvarchar] (2000) NULL, 
[FIELD7] [varbinary] (max) NULL, 
[FIELD8] [varbinary] (max) NULL, 
[FIELD9] [varbinary] (max) NULL, 
[FIELD10] [uniqueidentifier] NULL, 
[FIELD11] [nvarchar] (2000) NULL, 
[FIELD12] [varbinary] (max) NULL, 
[FIELD13] [varbinary] (max) NULL, 
[FIELD14] [bit] NULL, 
[FIELD15] [uniqueidentifier] NULL, 
[FIELD16] [varbinary] (max) NULL, 
[FIELD17] [bit] NULL, 
[FIELD18] [tinyint] NULL, 
[FIELD19] [datetime] NULL, 
[FIELD20] [nvarchar] (2000) NULL, 
PRIMARY KEY CLUSTERED 
( 
    [ID] ASC 
) 
) ON [PRIMARY] 

GO 

Biorąc pod uwagę, że projekt stół jak i zmieniając nvarchar(2000) do nvarchar(max) by to zrobić rzeczy gorszy (lub lepszy)? Czy sqlserver nie patrzy na takie projekty?

+0

Jakie dane przechowujesz? Jedynym * problemem * będzie indeksowanie, wyszukiwanie i wiązania. To jednak nie sprawia, że ​​zmiana jest dobrym pomysłem. – Matthew

+7

** proszę, nie rób tego! ** Gdybym został wynajęty w miejscu, które ma wszystkie takie stoły, uciekłbym, krzycząc przez drzwi! Następnie dodajesz klaster unikalnego identyfikatora PK na szczycie wszystkich nvarchar (max) kolumn, fuj. Zabijasz zdolność indeksowania danych. Niedługo wrócisz, zadając pytanie, dlaczego twoje zapytanie działa tak wolno, i nie będzie zbyt wiele, abyś mógł to przyspieszyć. W ciągu dnia wszystkie główne/popularne języki były mocno wpisane, ale nie tak bardzo teraz. Wystąpią problemy, jeśli spróbujesz użyć "tego" kuli w bazie danych. –

+0

@KM Przekazałbym twój komentarz milion razy, gdybym mógł, to jest okropny projekt bazy danych. – HLGEM

Odpowiedz

11

Jeśli jesteś zadowolony z J. Random Developer, 6 miesięcy w dół, aby wstawić dzieło Szekspira do każdej kolumny, to dobrze.

Dla mnie duża część modelowania danych poważnie myśli o tym, jakie dane chcę zezwolić w każdej kolumnie i jakie dane chcę zabronić. Następnie stosuję odpowiednie ograniczenia CHECK, aby osiągnąć te ograniczenia (jak zezwala na to najlepszy serwer SQL). Posiadanie rozsądnej kontroli długości dostępnej "za darmo" zawsze wydawało się premią.


Ty też nie robi wiele „przyszłość proofing” - zmiana długości (n) kolumny varchar do większej wartości w późniejszym terminie jest, moim zdaniem, jedynie operacja meta-danych. Powiedziałbym więc, żeby odpowiednio dopasować kolumny do danych, z którymi masz zamiar się dzisiaj zetknąć (i dobrze, przez następny rok lub mniej). Jeśli chcesz je później rozwinąć, zajmie to kilka sekund.

+0

Doskonałe poitns. Dopuszczenie dowolnej długości kolumny jest tak kiepskim pomysłem. Będziesz mieć problemy z intgrity danych dla rzeczy, które powinny być określonej długości. Więc wstawienie do kolumny numeru telefonu nie zawiedzie, jeśli dana osoba spróbuje wpisać 100 znaków, mimo że żaden numer telefonu nie jest tak długi. I tak dalej. Poza tym nvarchar (max) nie może być indeksowany, a zatem powodować problemy z wydajnością, jeśli musisz przeszukać onthem. – HLGEM

+4

@HLGEM, ale mój numer telefonu jest dłuższy niż normalnie, to jest: '1 ', użytkownicy tabel upuść, drop table orders, drop table accounts,' ' –

+0

@KM, bardzo ładnie przedstawiasz mój punkt widzenia. – HLGEM

3

Odpowiedź jest taka sama, jak odpowiedź "Dlaczego muszę podać int, gdy mogę przechowywać wszystkie liczby jako ciągi?" - ponieważ pomaga:

  • efektywność prędkości.
  • efektywność przechowywania.
  • intencja autora/architekta.
  • obniża błąd danych, ponieważ zmieści się tylko pewien rodzaj danych.

Ale to nie spowoduje żadnych oczywistych "problemów" natychmiast, ponieważ nvarchar (10) jest podzbiorem nvarchar (max).

+0

+1: To powinna być zaakceptowana odpowiedź. –

5

Miejmy nadzieję, że nie należy używać do wyszukiwania lub kolumny mają unikalne wartości ...

Indeksy nie może przekraczać 900 bajtów szeroki Więc może nigdy prawdopodobnie utworzyć indeks. Jest jeden minus: ponieważ daje

  • naprawdę złe szukają wydajność
  • żadnych ograniczeń unique

Można go obejść z kolumną komputerowej ale dlaczego nie zapisać swój potrzebę?

4

Przełączanie z typów w rzędzie na typy typu BLOB to zawsze duża decyzja.Trzeba internalizacji że typy BLOB (VARCHAR(MAX), NVARCHAR(MAX) i VARBINARY(MAX)) to zupełnie inny typ wewnętrznie z typów w wierszu:

Więc przełączania wszystkie kolumny typu BLOB może przynieść wiele efektów ubocznych nie zostały uznane: niemożność indeksu kolumny BLOB, brak operacji online, ogólne pogorszenie wydajności z powodu wolniejszego kodu BLOB itp. Najpoważniejszą przeszkodą może być fakt, że nie będzie można indeksować kolumn po ich utworzeniu BLOB. Jeśli nie jest to korek wystawowy, musisz przetestować i zmierzyć wpływ wydajności.

Obawy modelujące dane inne zostały poruszone są w ogóle ważne, ale rozumiem, że często w świecie rzeczywistym teoria działa tylko w teorii ...

+0

Dzięki za wskazówkę "ONLINE". Czasami bardzo ważne jest dodanie indeksu do opcji ONLINE. W tym momencie należy zwrócić uwagę, że to ograniczenie dotyczy tylko "bazy danych SQL przed wersją V12 i programu SQL Server sprzed programu SQL Server 2012" zgodnie z linkiem. –

0

Oto ta sama odpowiedź dałem do innego faceta, który chciał niekończące się tabele:

Database alternative to MySQL made for millions of TABLES

ten kawałek powyżej jest mniejszy niż optymalny projekt dla każdej relacyjnej przechowywania danych. Pop idzie łasicą danych: po prostu wybierz jedną z nich, aby uzyskać żądane dane.

Być może rozwiązanie sql nie działa lepiej, więc możesz mieć dynamiczne dane i nie martwić się o limity kolumn.

Myślę, że jeśli zamierzamy odpowiadać na pytania, uważam, że powinniśmy oferować najlepsze/lepsze praktyki, gdy istnieją alternatywy wobec złego projektu.

Pomyśl o facecie nadchodzących po KM jak wspomniano powyżej

0

w moim doświadczeniu nie wiele 2000 znaków długie pola skończyć indeksowane chociaż. Myślę, że znacznie lepiej jest używać nvarchar (max) niż jakiejś arbitralnej długości, która może wymagać obcięcia danych, jeśli nie jest wystarczająco długa.

Przykładem, który zobaczyłem, jest tabela dziennika błędów, w której projektanci tabel nie byli przygotowani do przechowywania stosu wywołań w polu nvarchar (maks.), Więc zapisali pierwsze n-tysięczne znaki, co spowodowało okrojone stosy połączeń z najciekawszymi sekcjami brakuje.