PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy istnieje spadek wydajności przy użyciu dziesiętnych typów danych (MySQL / Postgres)

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 .)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja SQL jest bardzo powolna w porównaniu z zapytaniem bez opakowania funkcji

  2. Rozpakuj wiele tablic równolegle

  3. INSERT z dynamiczną nazwą tabeli w funkcji wyzwalacza

  4. Kilka obszarów ulepszeń w PostgreSQL 9.4

  5. Ulepszenia partycjonowania w PostgreSQL 11