Khi truy xuất các mục trong cơ sở dữ liệu, có sự khác biệt giữa lưu trữ các giá trị dưới dạng dấu phẩy hoặc thập phân so với int khi sử dụng ORDERBY trong câu lệnh SELECT không?Có sự khác biệt về tốc độ trong thứ tự của int so với float không?
Trả lời
Đ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.
(Edited) Kể từ khi cả hai int và float 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).
Tốt điểm về chi phí CPU thực tế , Tôi đã tập trung vào đĩa và bộ nhớ – billinkc
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. –
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
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
Đ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). –
- 1. Sự khác biệt về tốc độ tạo Bảng
- 2. Nullable <int> so với int? - Có sự khác biệt nào không?
- 3. Tốc độ của PHP so với JavaScript?
- 4. Có sự khác biệt về tốc độ giữa WSGI và FCGI không?
- 5. Thứ tự JOIN có tạo sự khác biệt không?
- 6. Câu hỏi SQL: Thứ tự của mệnh đề WHERE có tạo nên sự khác biệt không?
- 7. C/C++ int [] so với int * (con trỏ so với ký hiệu mảng). Sự khác biệt là gì?
- 8. Tốc độ truy vấn dựa trên thứ tự các cột
- 9. Tại sao có sự khác biệt về tốc độ giữa vòng lặp của Clojure và phương pháp lặp lại
- 10. SET so với CHỌN - Sự khác biệt là gì?
- 11. Sự khác biệt về PHP giữa int và số nguyên
- 12. Sự khác biệt thứ tự mảng đầu tiên trong Ruby
- 13. MOM so với SOA? Sự khác biệt?
- 14. Sự khác biệt và lợi thế của SurfaceView so với GLSurfaceView trên Android?
- 15. Có sự khác biệt giữa int & a và int & a không?
- 16. sự khác biệt giữa int * i và int * i
- 17. Tại sao lớn hơn so với bằng tạo nên sự khác biệt trong MySQL SELECT?
- 18. Sự khác biệt thực sự giữa "int" và "unsigned int"
- 19. C++ và C# tốc độ so sánh
- 20. Sự khác biệt về hiệu suất của AtomicInteger so với số nguyên
- 21. Sự khác biệt giữa float và double trong php?
- 22. Có sự khác biệt về sự khác biệt nào giữa tuần tự hóa nhị phân và XML không?
- 23. So sánh 2 mảng trả về sự khác biệt
- 24. smallint so với int về hiệu suất
- 25. Sự khác biệt giữa hàm obj.create() so với obj.cshe của AlertDialog.build() so với obj.create(). Show()
- 26. Sự khác biệt về vòng lặp trong Ruby khi sử dụng Range so với Times
- 27. Hoạt động bit để tìm sự khác biệt về chuỗi
- 28. Sự khác biệt về Shader trên iOS
- 29. C: sự khác biệt giữa (int) x và tầng (x)?
- 30. Iterators trong C++ (stl) vs Java, có sự khác biệt về khái niệm không?
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ể. –