Pavel ma rację, chciałbym tylko trochę wyjaśnić.
Zakładając, że masz na myśli wpływ na wydajność w porównaniu z liczbą zmiennoprzecinkową lub liczbą całkowitą o stałym przesunięciu punktu (tj. Przechowywanie tysięcznych centa jako liczby całkowitej):Tak, jest bardzo duży wpływ na wydajność. PostgreSQL i po odgłosach MySQL przechowuj DECIMAL
/ NUMERIC
w postaci dziesiętnej kodowanej binarnie. Ten format jest bardziej kompaktowy niż przechowywanie cyfr jako tekstu, ale nadal nie jest zbyt wydajny w pracy.
Jeśli nie wykonujesz wielu obliczeń w bazie danych, wpływ jest ograniczony do większej przestrzeni dyskowej wymaganej dla BCD w porównaniu z liczbą całkowitą lub zmiennoprzecinkową, a tym samym szerszymi wierszami i wolniejszymi skanami, większymi indeksami itp. Operacje porównawcze w b -Przeszukiwanie indeksu drzewa jest również wolniejsze, ale nie ma to większego znaczenia, chyba że z jakiegoś innego powodu jesteś już związany z procesorem.
Jeśli wykonujesz dużo obliczeń za pomocą DECIMAL
/ NUMERIC
wartości w bazie danych, wtedy wydajność może naprawdę ucierpieć. Jest to szczególnie widoczne, przynajmniej w PostgreSQL, ponieważ Pg nie może używać więcej niż jednego procesora dla danego zapytania. Jeśli wykonujesz ogromną liczbę dzieleń i mnożenia, bardziej złożonej matematyki, agregacji itp. na numerach, możesz zacząć odczuwać, że jesteś związany z procesorem w sytuacjach, w których nigdy byś nie był, używając danych typu zmiennoprzecinkowego lub całkowitoliczbowego. Jest to szczególnie widoczne w obciążeniach podobnych do OLAP (analitycznych) oraz w raportowaniu lub transformacji danych podczas ładowania lub ekstrakcji (ETL).
Pomimo faktu, że jest wpływ na wydajność (który zmienia się w zależności od obciążenia od znikomego do dość dużego) należy ogólnie używać numeric
/ decimal
kiedy jest to najbardziej odpowiedni typ dla twojego zadania - tj. kiedy muszą być przechowywane bardzo wysokie wartości zakresu i/lub błąd zaokrąglania jest niedopuszczalny.
Czasami warto zawracać sobie głowę używaniem bigint i offsetu stałego punktu, ale jest to niezdarne i nieelastyczne. Używanie zmiennoprzecinkowych zamiast tego bardzo rzadko jest właściwą odpowiedzią ze względu na wszystkie wyzwania związane z niezawodną pracą z wartościami zmiennoprzecinkowymi dla takich rzeczy jak waluta.
(Przy okazji, jestem bardzo podekscytowany, że niektóre nowe procesory Intela i gama procesorów IBM Power 7 zawierają obsługę sprzętową dla zmiennoprzecinkowych przecinków dziesiętnych IEEE 754. Jeśli to kiedykolwiek stanie się dostępne w niższych procesorach, będzie to ogromna korzyść dla baz danych .)