IDENTITY oszlop adattípus kiválasztása

Ma egy igazán érdekes problémába botlottam. Fejlesztőkkel beszélgettünk, hogy az IDENTITY oszlop esetén milyen adattípus legyen. Egyikük problémája az volt, hogy hamar kifutunk az int típusból, bár ezt én (sem) nem tartottam valószínűnek, ismervén az adatmennyiséget, évekig nem lenne ez gond. Éppen azért, hogy megkönnyítsem mások dolgát is, lássuk, hogy a különböző adattípusok esetén mennyi sort és mennyi helyet foglalhatunk el.

int

Az int típus -2^31 (-2147483648) és 2^31-1 (2147483647) vehet fel értékeket. Ez 4294967296 (4,29 milliárd!!!) lehetséges értéket jelent. Heylfoglalást tekintve, 4 byte egy elem, azaz minden lehetséges érték esetén ez 17179869184 byte --> 16GB helyet foglal el. Ehhez is már kell egy komoly teljesítmény :)

tinyint

Ez a típus 0 és 255 között vehet fel értékeket és 1 byte helyet foglal egy elem. Könnyen kiszámolható, hogy itt 256 byte a maximális helyfoglalás, ha minden lehetséges értéket le akarok tárolni.

smallint

Ez a típus is kevesebb helyet foglal és kevesebb értéket vehet fel, mint az int: -2^15 (-32768) és 2^15-1 (32767) értékeket veheti fel, ez összesen 65536 darabot jelent. Ennek a helyfoglalása 2 byte elemenként, azaz az összes felvehető értékre nézve 131072 byte --> 128KB

bigint

Ez az adattípus szerintem a tudomány jelenlegi állása szerint mindenkinek elég kellene, hogy legyen :). Elemenként 8 byte helyet foglal, -2^63 (-9223372036854775808) és 2^63-1 (9223372036854775807) között vehet fel értékeket. Az összes lehetséges érték 18446744073709551616 azaz 18,4 trillió lehetséges értéke lehet!!! Ez a milliárd (ezer millió)  milliárdszorosa :) Szóval nagyon sok :)))
Mennyi helyet foglal vajon 18,4 trillió bigint érték? 147573952589676412928 byte, azaz 134217728 terrabyte --> 131072 petabyte --> 128 exabyte. Az SQL Server jelenlegi legutolsó verziója (SQL 2014) maximum 524272 terabyte méretű adatbázist képes kiszolgálni a http://msdn.microsoft.com/en-us/library/ms143432.aspx#Engine oldalon található leírás alapján. Ez azt jelenti, hogy ez a bigint összes értéke 256 maximális méretű adatbázisban férne csak el! 

Alapvetően, amikor adattípust választok, akkor a legkisebbet választom, ami teljesíti a követelményeimet. Azt hiszem egy darabig az int típus is elég lesz, de legalábbis 4 milliárd sorig biztosan :)

Comments (8) -

  • SZL

    8/6/2014 6:21:17 AM | Reply

    Na ez gyors volt. Laughing

  • Márk

    8/6/2014 12:52:48 PM | Reply

    A varázsige a SEQUENCE Smile És akkor később kedvedre változtathatod az oszlop adattípusát egyre nagyobbra, ha szükséges.

    • János Berke

      8/6/2014 12:55:08 PM | Reply

      Valóban Márk, de az csak SQL 2012-től elérhető ;)

      • Márk

        8/6/2014 1:02:19 PM | Reply

        Ez így van. Akkor a varázsige az upgrade ;) Hisz már a 2014-nél tartunk Smile

        • János Berke

          8/6/2014 1:05:50 PM | Reply

          oké, de mi van akkor, ha nem akarnak frissíteni? A frissítéssel még nem oldódik meg az sem, hogy 256-szor nagyobb adatmennyiséget foglal le a bigint összes eleme, mint a lehetséges max. adatbázis méret Smile
          Itt igazság szerint arra akartam felhívni a figyelmet, hogy gondoljuk át az adattípusainkat, ne akarjunk mindenáron mindenből a legnagyobbat Wink

          • Márk

            8/6/2014 1:24:20 PM | Reply

            Értem én, csak kibújt belőlem a kisördög Smile Mondjuk az a 128 exabyte, az tényleg gyönyörű Laughing

    • Zsolt

      8/7/2014 8:11:39 AM | Reply

      Ezt fejtsd ki pls, nem jövök rá mi a trükk Smile

  • S.E.

    8/7/2014 4:22:01 AM | Reply

    Az IDENTITY és a SEQUENCE másra való és teljesen más módon is kell/lehet használni,  szóval én nem mosnám össze.

Add comment