Numeryczna vs liczba całkowita dla wielkości kolumny i wydajności

11

Mam aplikację, która korzysta z tabeli PostgreSQL. Tabela jest bardzo duża (miliardy wierszy) i ma kolumnę, która jest liczbą całkowitą.

integerMoże wynosić do 6 cyfr, tj 0-999,999, bez negatywów.

Myślałem o tym, żeby to zmienić numeric(6,0).

Czy to byłby dobry pomysł? Zajmie numeric(6,0)mniej bajtów? A co z wydajnością (ta tabela jest często pytana)?

Ofiris
źródło

Odpowiedzi:

11

Czy to byłby dobry pomysł?

Nie.

by numeric(6,0)wziąć mniej bajtów?

Nie.

test=> SELECT pg_column_size(INT4 '999999'), pg_column_size(NUMERIC(6,0) '999999');
 pg_column_size | pg_column_size 
----------------+----------------
              4 |             10
(1 row)

co z wydajnością (ta tabela jest często pytana)?

Wolniej Jest przechowywany w postaci dziesiętnej z kodem binarnym, ponieważ jest to dowolna wartość precyzji.

Craig Ringer
źródło
Wszystko uzgodnione, ponieważ numeryczna notatka dodatkowa ma jedną zaletę, ponieważ automatycznie wymusza domenę 0-999999. Można to jednak rozwiązać za pomocą osobnego ograniczenia w przypadku int
Lennart
1
Czy występuje problem ze zmianą numerickolumny na int?
Racer SQL,
@RacerSQL Tak, jeśli masz wartości, które przekroczą rozmiar int.
DylanYoung
5

Ostateczna odpowiedź brzmi „nie” na wszystkie twoje pytania. Liczba całkowita jest zawsze sposobem na wszystko, do czego możesz jej użyć. (Na przykład pieniądze)

Pomyśl o tym przez chwilę. Gdy aparat bazy danych napotyka liczbę całkowitą, obsługuje go bardzo skutecznie, ponieważ nie ma w nim wiele interpretacji. To jest liczba całkowita. Typ numeryczny zachowuje się bardziej jak ciąg znaków. Silnik musi najpierw ustalić, które części znajdują się przed i za kropką dziesiętną, i odpowiednio masować je, aby wykonać operacje numeryczne.

Używanie liczb całkowitych zawsze będzie bardziej wydajne niż liczbowe, chociaż typy liczbowe są często wygodniejsze dla ludzi.

stubsthewizard
źródło
Nie zgadzam się, jeśli chodzi o pieniądze. Używanie skalowanej liczby całkowitej, np. Przechowywanie decyklatów (1000 za dolara) jest w porządku, ale niewygodne. Szybko staje się bardziej praktyczny w użyciu NUMERIC. Skalowana liczba całkowita jest jednak znacznie lepsza niż stosowanie wartości zmiennoprzecinkowej w stosunku do ceny.
Craig Ringer
2
@CraigRinger Nie sądzę, żebyś faktycznie się ze mną nie zgadzał! Zgadzam się, że używanie miejsca po przecinku dla pieniędzy jest zawsze mniej niewygodne dla programisty, ale pytanie dotyczy wydajności zapytań, prawda? Obsługa liczb całkowitych jest zawsze szybsza. Pisząc aplikacje bankowe, możesz również natknąć się na dziwne zaokrąglenia, o które większość ludzi by się nie przejmowała, ale są bardzo ważne dla banków. Zgadzam się również z tobą, że nie używasz zmiennoprzecinkowego pieniądza!
stubsthewizard
1
Dobry punkt zaokrąglania. Chciałbym, aby PostgreSQL obsługiwał zasady zaokrąglania. Nie życzę sobie jednak wystarczająco, żeby go wdrożyć;)
Craig Ringer