Con trỏ là lựa chọn hợp lý để phân trang trong các ứng dụng mạng nội bộ nhỏ hơn hoạt động với các tập dữ liệu lớn, nhưng bạn cần chuẩn bị loại bỏ chúng sau một thời gian chờ. Người dùng thích đi lang thang, đi ăn trưa, đi nghỉ trong hai tuần, v.v. và để các ứng dụng của họ chạy. Nếu đó là một ứng dụng dựa trên web, thậm chí còn có câu hỏi "đang chạy" là gì và làm thế nào để biết liệu người dùng có còn ở đó hay không.
Chúng không phù hợp với các ứng dụng quy mô lớn với số lượng khách hàng cao và các khách hàng đến và đi gần như ngẫu nhiên như trong các ứng dụng dựa trên web hoặc API web. Tôi không khuyên bạn nên sử dụng con trỏ trong ứng dụng của bạn trừ khi bạn có số lượng khách hàng khá nhỏ và tỷ lệ yêu cầu rất cao ... trong trường hợp đó việc gửi hàng loạt hàng nhỏ sẽ rất kém hiệu quả và thay vào đó bạn nên nghĩ đến việc cho phép yêu cầu phạm vi, v.v. / P>
Con trỏ có một số chi phí. Nếu con trỏ không phải là WITH HOLD
bạn phải giữ một giao dịch mở. Giao dịch mở có thể ngăn autovacuum hoạt động bình thường, gây ra hiện tượng phồng bảng và các vấn đề khác. Nếu con trỏ được khai báo WITH HOLD
và giao dịch không được mở, bạn phải trả chi phí thực hiện và lưu trữ một tập kết quả lớn tiềm năng - ít nhất, tôi nghĩ đó là cách hoạt động của con trỏ giữ. Giải pháp thay thế cũng tệ như vậy, giữ cho giao dịch luôn mở cho đến khi con trỏ bị hủy và ngăn các hàng bị dọn dẹp.
Ngoài ra, nếu bạn đang sử dụng con trỏ, bạn không thể chuyển các kết nối trở lại nhóm kết nối. Bạn sẽ cần một kết nối cho mỗi khách hàng. Điều đó có nghĩa là nhiều tài nguyên phụ trợ hơn được sử dụng chỉ để duy trì trạng thái phiên và đặt giới hạn trên thực tế về số lượng khách hàng mà bạn có thể xử lý bằng phương pháp dựa trên con trỏ.
Ngoài ra còn có sự phức tạp và chi phí của việc quản lý thiết lập dựa trên con trỏ, trạng thái so với cách tiếp cận tổng hợp kết nối không trạng thái với giới hạn và bù đắp. Bạn cần để ứng dụng của mình hết hạn con trỏ sau một khoảng thời gian chờ hoặc bạn phải đối mặt với khả năng sử dụng tài nguyên không giới hạn trên máy chủ và bạn cần theo dõi xem kết nối nào có con trỏ nào đặt kết quả cho người dùng nào ....
Nói chung, mặc dù thực tế là nó có thể khá kém hiệu quả, LIMIT
và OFFSET
có thể là giải pháp tốt hơn. Thường có thể tốt hơn nếu tìm kiếm khóa chính thay vì sử dụng OFFSET
, mặc dù.
Nhân tiện, bạn đang xem tài liệu về con trỏ trong PL / pgSQL. Bạn muốn con trỏ cấp SQL bình thường cho công việc này.
Các con trỏ có yêu cầu kết nối cơ sở dữ liệu được mở không?
Có.
Các con trỏ có chạy bên trong giao dịch, khóa tài nguyên cho đến khi chúng "đóng" không?
Có trừ khi chúng là WITH HOLD
, trong trường hợp đó chúng sử dụng các tài nguyên cơ sở dữ liệu khác.
Có "gotchas" nào khác mà tôi không biết không?
Có, như phần trên sẽ giải thích.