2011-09-09 32 views

Trả lời

7

Điều đó tùy thuộc. Bạn đã không chỉ định RDBMS vì vậy tôi chỉ có thể nói chuyện với SQL Server cụ thể nhưng các kiểu dữ liệu có các chi phí lưu trữ khác nhau liên quan đến chúng. Ints nằm trong khoảng từ 1 đến 8 byte, Decimals là 5-17 và floats là 4 đến 8 byte.

RDBMS sẽ cần phải đọc các trang dữ liệu ngoài đĩa để tìm dữ liệu của bạn (trường hợp xấu nhất) và chúng chỉ có thể phù hợp với nhiều hàng trên một trang 8k dữ liệu. Vì vậy, nếu bạn có 17 byte số thập phân, bạn sẽ nhận được 1/17 số lượng hàng đọc đĩa trên mỗi lần đọc hơn bạn có thể có nếu bạn định kích thước dữ liệu của mình một cách chính xác và sử dụng một chi phí nhỏ với chi phí 1 byte để lưu trữ X.

Chi phí lưu trữ đó sẽ có tác dụng xếp tầng khi bạn sắp xếp (sắp xếp theo) dữ liệu của mình. Nó sẽ cố gắng để sắp xếp trong bộ nhớ nhưng nếu bạn có một hàng bazillion và bị bỏ đói cho bộ nhớ nó có thể đổ vào lưu trữ tạm thời cho các loại và bạn đang trả tiền mà chi phí hơn và hơn.

Chỉ mục có thể trợ giúp khi dữ liệu có thể được lưu trữ theo cách được sắp xếp nhưng một lần nữa, nếu nhận dữ liệu đó vào bộ nhớ có thể không hiệu quả đối với các loại dữ liệu béo phì.

[sửa]

@Bohemian làm cho một điểm tốt về hiệu quả xử lý của CPU nguyên vs so sánh điểm nổi nhưng nó là đáng ngạc nhiên hiếm hoi cho CPU được tăng vọt trên máy chủ cơ sở dữ liệu. Bạn có nhiều khả năng bị hạn chế bởi hệ thống con đĩa IO và bộ nhớ đó là lý do tại sao câu trả lời của tôi tập trung vào sự khác biệt về tốc độ giữa việc đưa dữ liệu đó vào động cơ để nó thực hiện thao tác sắp xếp so với chi phí so sánh CPU.

+0

Cảm ơn, @billinkc. Cơ sở dữ liệu rất có thể sẽ là PostgreSQL. Tôi có lẽ sẽ cần một * bigint * vì vậy tôi có linh hoạt hơn khi lưu hồ sơ được sắp xếp sau theo một thứ tự cụ thể. –

5

(Edited) Kể từ khi cả hai intfloat chiếm chính xác cùng một không gian trên đĩa, và dĩ nhiên trong bộ nhớ - tức là 32 bit - sự khác biệt duy nhất là trong cách họ xử lý .

int nên nhanh hơn để sắp xếp hơn float, vì so sánh đơn giản hơn: Bộ xử lý có thể so sánh int trong một chu kỳ máy, nhưng bit của phao phải được "diễn giải" để nhận giá trị trước khi so sánh (không chắc chắn bao nhiêu chu kỳ , nhưng có lẽ nhiều hơn một, mặc dù một số CPU có thể có hỗ trợ đặc biệt cho so sánh nổi).

+1

Tốt điểm về chi phí CPU thực tế , Tôi đã tập trung vào đĩa và bộ nhớ – billinkc

+0

Tôi đồng ý, nhưng đối với số thập phân, nó không nên đúng: chúng được mã hóa bằng cách nào đó giống như EBCEDIC cũ và nên so sánh nhanh chóng ở chế độ nhị phân. –

+0

Hình như nó hoàn toàn phụ thuộc vào việc thực hiện bộ vi xử lý: một số có các đơn vị dấu chấm động làm cho chúng rất nhanh. Tuy nhiên 1 vì int vẫn được đảm bảo nhanh trong mọi trường hợp. – Klaim

3

Nói chung, việc chọn kiểu dữ liệu phải được điều khiển bởi liệu kiểu dữ liệu có thích hợp để lưu trữ các giá trị được yêu cầu để được lưu trữ hay không. Nếu một kiểu dữ liệu nhất định là không đầy đủ, nó không quan trọng nó hiệu quả như thế nào.

Về mặt đĩa i/o, chênh lệch tốc độ là thứ tự thứ hai. Đừng lo lắng về hiệu ứng đặt hàng thứ hai cho đến khi thiết kế của bạn tốt về các hiệu ứng đặt hàng đầu tiên.

Thiết kế chỉ mục chính xác sẽ dẫn đến giảm sự chậm trễ lớn khi truy vấn có thể được truy lục theo thứ tự sắp xếp để bắt đầu. Tuy nhiên, việc tăng tốc truy vấn đó được thực hiện với chi phí làm chậm các quy trình khác, như các quy trình sửa đổi dữ liệu được lập chỉ mục. Giao dịch phải được xem xét để xem liệu nó có đáng giá hay không.

Nói tóm lại, lo lắng về những thứ đó sẽ tăng gấp đôi đĩa i/o hoặc tệ hơn trước khi bạn lo lắng về những thứ đó sẽ cộng thêm 10% vào đĩa của bạn i/o

+0

Điểm tốt về thiết kế, Walter. Lý do thực sự tôi hỏi câu hỏi là vì tôi muốn xây dựng một dòng thời gian tương đối http://stackoverflow.com/questions/7342264 trong cơ sở dữ liệu và tự hỏi liệu tôi có nên sử dụng một bigint hoặc float để sắp xếp các sự kiện hay không. Sau khi tất cả, nếu tôi cách nhau các số khác nhau khi tạo các bản ghi trên một int, tôi có thể chèn một sự kiện mới ở giữa 2 sự kiện cũ bằng cách lấy số nửa chừng ở giữa. Tôi cũng có thể sử dụng một số thập phân, vì tôi luôn có thể thêm một vị trí mới ở cuối để chèn vào giữa (.50 -> .501 -> .51). –

Các vấn đề liên quan