Wady stosowania smallint w sql server

0

Witam,
Zrobiłem tablice w sqlserver, ale chcąc zaoszczędzić miejsca zastąpiłem w kilku tablicach wybrane pola typu int typem smallint .
W głównej tablicy id jest int i są trzy kolumny smallint, a indeksy powinny być int oraz int+smallint.
Główna tablica rocznie będzie miała 30000 nowych rekordów.
Baza jest darmowa (express) czyli do 10GB więc raczej należy oszczędzać miejsca.

Podczas testowania programu w c# okazało się, że rzutowanie odczytu z bazy pola smallint robi się wykorzystując (short), a nie (int) jak jest dla kolumn int.
I jakieś inne durne błędy związane chyba z DataSource...

Teraz zastanawiam się czy warto było zmieniać pola na smallint skoro będę musiał pamiętać, pisząc aplikację które pola są "small" a które "int".

Gdzieś również pisało, że indeksy złożone nie lubią int+smallint?

Baza jest darmowa (express) czyli do 10G.

Co radzicie?

P.S.
Temat przeniosłem z Nowbie, bo tam zero odzewu
:-(

0

tracisz zakres danych z 32 tys. do 256

0

Zakres danych ww 3 kolumn nigdy nie przekroczy 32767 natomiast zmiana 3 kolumn z int na small daje korzyść 34B-32B=6B w jednym rekordzie
czyli 30000rek*6B=180000B około 180kB rocznie

czyli sporo skoro baza ograniczona jest do 10G. Czy to ograniczenie sqlserwera2012 dotyczy tylko pliku mdf ????

A teraz pytanie: które wydajniejsze indeksy złożone int+int czy int+smallint ?

0

180kB rocznie przy 10GB bazy to jest sporo? Wydawałoby mi się, że nie.

Ograniczenie masz na rozmiar pliku bazy, nie logu.

0

Cześć,
Im mniejszy typ danych tym szybsze odczyty, jednak przy Twojej ilości danych to będzie niezauważalne według mnie.A tak jak napisał @somekind oszczędność miejsca, hmmm nieznaczna to put it gently ;-)

Pozdrawiam

0
Mikajlo8 napisał(a):

Cześć,
Im mniejszy typ danych tym szybsze odczyty, jednak przy Twojej ilości danych to będzie niezauważalne według mnie.

Przy architekturze 32/64 bity stosowanie 8-bitowców ma coś przyspieszyć? Wątpię. I tak adresowanie jest 4-bajtowe, więc przy jednym 3 pójdą "puste"...

1

Odnośnie czego to napisałeś i jak to się ma do tego co ja napisałem?

Nie będę kopiował tego co piszę ktoś inny ale radze zerknąć tutaj:

https://social.msdn.microsoft.com/Forums/en-US/c30a4838-fd00-4b17-9b42-3f6464284b46/tinyint-smallint-and-int-question?forum=transactsql

A tak od siebie:
1 Strona na której SQL SERVER przechowuje dane to 8kb=8192 bajtów.
smallint=2bajty
int=4bajty

Zakładając, że mamy tabelę która ma tylko jedną kolumnę(U kolegi który zadał to pytanie są 3 kolumny gdzie zmienił typ na smallint) SQL SERVER będzie w stanie na jednej stronie przechować 4096 wierszy jeżeli typ danych będzie smallint, a jeżeli typ danych będzie int- 2048 .

Pierwszą rzeczą którą rozważasz żeby poprawić wydajność zapytania to zmniejszenie ilości "stron" do odczytania z dysku.Jakby nie patrzeć, używając smallint przechowujesz 2 razy więcej na jednej stronie i tę wydajność poprawiasz.Dane "cachowane" też są przechowywane na "stronach" także, znowu przechowasz więcej danych na jednej stronie.

Tak jak napisałem wcześniej, przy tej ilości danych różnice będą niezauważalne, ale będą istniały.SQL SERVER większość wrzuci do cache i stamtąd będzie czytał.

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1