Có một số cách để lặp qua tập hợp kết quả. Sự cân bằng của mỗi cái là gì?cx_Oracle: Làm cách nào để lặp qua tập hợp kết quả?
Trả lời
Cách kinh điển là sử dụng trình vòng lặp con trỏ được tích hợp sẵn.
curs.execute('select * from people')
for row in curs:
print row
Bạn có thể sử dụng fetchall()
để có được tất cả các hàng cùng một lúc.
for row in curs.fetchall():
print row
Nó có thể được thuận tiện để sử dụng này để tạo ra một danh sách Python chứa các giá trị trả về:
curs.execute('select first_name from people')
names = [row[0] for row in curs.fetchall()]
Điều này có thể hữu ích cho bộ kết quả nhỏ hơn, nhưng có thể có tác dụng phụ xấu nếu đặt kết quả lớn.
Bạn phải chờ cho toàn bộ kết quả được trả về quy trình khách hàng của bạn.
Bạn có thể ăn nhiều bộ nhớ trong ứng dụng khách để giữ danh sách được tạo sẵn.
Có thể mất một lúc để Python xây dựng và giải mã danh sách mà bạn sắp hủy ngay lập tức.
Nếu bạn biết có một hàng duy nhất được trả lại trong tập hợp kết quả bạn có thể gọi fetchone()
để có được hàng duy nhất.
curs.execute('select max(x) from t')
maxValue = curs.fetchone()[0]
Cuối cùng, bạn có thể vòng qua kết quả thiết lập lấy một hàng tại một thời điểm. Nói chung, không có lợi thế cụ thể trong việc làm điều này qua việc sử dụng trình lặp.
row = curs.fetchone()
while row:
print row
row = curs.fetchone()
về phương pháp thứ hai, nếu bạn sử dụng SScursor thì sao? nó sẽ ăn cắp rất nhiều bộ nhớ? – Sylvain
Tôi nghĩ SScursor dành cho MySQL. Nhưng bất cứ thứ gì có hàm fetchall() có thể sẽ có cùng mức sử dụng bộ nhớ, vì nó trả về một danh sách tất cả các hàng được trả về. –
Ngoài ra còn có cách psyco-pg
dường như để làm điều đó ... Từ những gì tôi thu thập, có vẻ như để tạo từ điển giống như hàng-proxy để lập bản đồ tra cứu chìa khóa vào khối bộ nhớ được trả về bởi truy vấn. Trong trường hợp đó, tìm nạp toàn bộ câu trả lời và làm việc với một nhà máy proxy tương tự trên các hàng có vẻ như ý tưởng hữu ích. Nghĩ lại thì, nó giống Lua hơn là Python.
Ngoài ra, đây nên được áp dụng cho tất cả các PEP-249 DBAPI2.0 giao diện, không chỉ Oracle, hoặc bạn đã có nghĩa là chỉ nhanh nhất sử dụng Oracle?
Cách ưa thích của tôi là trình lặp con trỏ, nhưng trước tiên hãy đặt thuộc tính arraysize của con trỏ.
curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
print row
Trong ví dụ này, cx_Oracle sẽ lấy hàng từ Oracle 256 hàng tại một thời điểm, giảm số lượng các chuyến đi vòng mạng mà cần phải được thực hiện
Trong các bài kiểm tra của tôi (trên cơ sở dữ liệu được kết nối bằng mạng LAN), điều này thực sự dường như cho tốc độ giống nhau (thậm chí chậm hơn, trong một vài lần lặp) so với thực hiện 'fetchone()' nhiều lần. Tôi đã làm nó với khoảng 12000 mục ... Rất kỳ lạ! –
Cách duy nhất mà tôi biết, và tôi không phải là một chuyên gia Oracle, rằng đây là trường hợp nếu truy vấn của bạn trả về đối tượng lớn (CLOB) hoặc đối tượng nhị phân lớn (BLOB). AFAI Hiểu nó, việc đọc các đối tượng này yêu cầu một chuyến đi vòng mạng khác đến máy chủ db cho mỗi bản ghi; có nghĩa là với fetchmany bạn thực sự có được điều tồi tệ nhất của cả hai thế giới. – asmoore82
Đối với cx_Oracle, kết nối với một cơ sở dữ liệu 12c với các loại cột tiêu chuẩn (không có clobs, vv) Tôi nhận được một tăng tốc nhưng chỉ khi tôi đặt arraysize * trước * thực hiện truy vấn. Các con số chính xác rõ ràng sẽ phụ thuộc nhiều vào ngữ cảnh nhưng để đưa ra ý tưởng về thứ tự thay đổi độ lớn, truy vấn của tôi (trả về 5 cột) với mảng = 50 (mặc định) cho 3,75us mỗi hàng. Giảm mảng đến 1 cho 70us. Tăng mảng lên 1000 cho 800ns – FredL
- 1. Làm cách nào để lặp qua các giá trị của một hàng từ tập hợp kết quả trong java?
- 2. Cách truy vấn Số liệu và lặp qua kết quả?
- 3. Làm cách nào để kết hợp các tập hợp kết quả từ hai cuộc gọi thủ tục được lưu trữ?
- 4. lặp qua $ _GET quả
- 5. Neo4j Cypher: Làm thế nào để lặp qua kết quả ExecutionResult
- 6. Làm thế nào để foreach hoạt động khi lặp qua các kết quả hàm?
- 7. Làm cách nào để tìm các kết quả trùng lặp trùng lặp với regexp?
- 8. Làm cách nào để lặp qua PropertyCollection
- 9. jQuery lặp qua kết quả JSON từ thành công AJAX?
- 10. Làm cách nào để kết hợp nhiều bộ kết quả trong SSRS?
- 11. Java, vòng lặp thông qua kết quả thiết
- 12. Chèn kết quả của ZRANGEBYSCORE vào một tập hợp
- 13. Cách hiệu quả nhất để lặp qua ma trận Eigen
- 14. Làm cách nào để có được Management Studio 2005 để sao chép tiêu đề từ tập hợp kết quả?
- 15. Làm thế nào để lặp qua tải lên tập tin trong Grails
- 16. Làm cách nào để kết hợp hai ResultSets trong Java?
- 17. Làm thế nào để kết hợp kết quả của hai truy vấn vào một tập dữ liệu đơn
- 18. Làm cách nào để kết hợp/hợp nhất các cột từ hai kết quả truy vấn SQL?
- 19. Kết hợp các kết quả lặp đệ quy: trẻ em với cha mẹ
- 20. Tạo chuỗi dài từ tập hợp kết quả
- 21. làm cách nào để lặp lại kết quả của bộ chọn jquery
- 22. Đặt mã hóa kết quả truy vấn trong cx_Oracle/UnicodeDecodeError bằng ký tự Trung Quốc
- 23. cách có thể kết hợp một tập kết quả truy vấn với một bảng hiện có?
- 24. Làm cách nào để trả lại tập hợp kết quả trống từ quy trình sử dụng T-SQL?
- 25. Phương pháp hiệu quả để tính toán xác suất của một tập hợp các kết quả?
- 26. Làm cách nào để có được regex để tìm mọi kết quả phù hợp trong javascript?
- 27. Làm cách nào để lặp qua tệp CSV với tập lệnh batch hoặc PowerShell?
- 28. Làm cách nào để lặp qua loại enum trong khi bỏ qua một số giá trị?
- 29. Làm cách nào để lặp qua bảng trong Lua?
- 30. Làm cách nào để kết hợp hai Doctrine 2 ArrayCollection()
Có những ngoại lệ này, nhưng nguyên tắc chung của ngón tay cái là: nếu có nhiều cách để làm điều đó, có thể vì mỗi cách đều phù hợp với các tình huống khác nhau.Nếu không thì sẽ chỉ có một cách. –