Số so với số nguyên cho một cột - kích thước và hiệu suất


10

Tôi có một ứng dụng sử dụng bảng PostgreSQL. Bảng rất lớn (hàng tỷ hàng) và có một cột là một số nguyên.

integerthể có tối đa 6 chữ số, tức là 0-999.999, không có âm.

Tôi nghĩ về việc thay đổi nó để được numeric(6,0).

Liệu cái này có phải một ý tưởng hay? Sẽ numeric(6,0)mất ít byte hơn? Làm thế nào về hiệu suất (bảng này đang được truy vấn rất nhiều)?

Câu trả lời:


11

Liệu cái này có phải một ý tưởng hay?

Không.

sẽ numeric(6,0)mất ít byte hơn?

Không.

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

Làm thế nào về hiệu suất (bảng này đang được truy vấn rất nhiều)?

Chậm hơn. Nó được lưu trữ dưới dạng thập phân được mã hóa nhị phân vì đó là một giá trị chính xác tùy ý.


Tất cả đều đồng ý, vì một số ghi chú bên có một lợi thế vì nó tự động thực thi tên miền 0-999999. Tuy nhiên, điều đó có thể được giải quyết bằng một ràng buộc riêng trong trường hợp int
Lennart

1
Có một vấn đề thay đổi một numericcột thành int?
Racer SQL

@RacerSQL Có nếu bạn có các giá trị sẽ tràn kích thước int.
DylanYoung

5

Câu trả lời dứt khoát là không cho tất cả các câu hỏi của bạn. Integer luôn là cách để đi cho bất cứ điều gì bạn có thể sử dụng nó cho. (Ví dụ: tiền)

Hãy suy nghĩ về nó trong một phút. Khi công cụ cơ sở dữ liệu gặp một số nguyên, nó xử lý nó rất hiệu quả vì không có nhiều giải thích cho nó. Nó là một con số Kiểu số hoạt động giống như một chuỗi. Đầu tiên, động cơ phải tìm ra bộ phận nào trước và sau dấu thập phân, và xoa bóp chúng một cách thích hợp để thực hiện các thao tác số.

Sử dụng một số nguyên sẽ luôn hiệu quả hơn một số, mặc dù các loại số thường thuận tiện hơn cho con người.


Tôi không đồng ý khi nói đến tiền. Sử dụng một số nguyên tỷ lệ, như lưu trữ decicents (1000 mỗi đô la) là ok, nhưng vụng về. Nó nhanh chóng trở nên thiết thực hơn để sử dụng NUMERIC. Một số nguyên tỷ lệ là cách tốt hơn so với việc sử dụng giá trị dấu phẩy động cho tiền.
Craig Ringer

2
@CraigRinger Tôi không nghĩ bạn thực sự không đồng ý với tôi! Tôi đồng ý rằng việc sử dụng số thập phân cho tiền luôn ít gây khó xử cho nhà phát triển, nhưng câu hỏi là hiệu quả truy vấn, phải không? Xử lý số nguyên luôn luôn nhanh hơn. Ngoài ra, khi viết các ứng dụng ngân hàng, bạn có thể gặp một số vấn đề làm tròn kỳ lạ mà hầu hết mọi người không quan tâm, nhưng rất quan trọng đối với các ngân hàng. Vì vậy, tôi cũng đồng ý với bạn về việc không sử dụng dấu phẩy động để kiếm tiền!
stubsthewizard

1
Điểm tốt về làm tròn. Tôi muốn PostgreSQL có hỗ trợ chính sách làm tròn. Đừng mong muốn nó đủ để thực hiện nó;)
Craig Ringer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.