2017-02-08 11 views
15

Tôi có một truy vấn mà trông như thế này:Tăng tốc truy vấn SDK SDK cục bộ của App Engine khi có nhiều thuộc tính đơn đặt hàng?

query = (models.Foo.all() 
    .filter('x =', x) 
    .filter('y =', y) 
    .filter('z =', z) 
    .filter('zz =', zz) 
    .order('-a')) 

Nó chạy trên nền SDK địa phương trong ~ 100ms, và chạy trong đám mây với tốc độ chấp nhận được. Khi tôi thêm một trật tự thứ hai (vì vậy nó trông như thế này :)

query = (models.Foo.all() 
    .filter('x =', x) 
    .filter('y =', y) 
    .filter('z =', z) 
    .filter('zz =', zz) 
    .order('-a') 
    .order('-b')) 

..it mất ~ 10s (100x dài hơn) trên SDK địa phương, và chạy với tốc độ tương tự như trước trong đám mây. Tôi cần phải có tài sản thứ tự thứ hai.

Một vài thông tin về các thiết lập: phiên bản

  • Windows SDK 1.9.50
  • Python 2.7
  • Sử dụng mô hình db, không ndb
  • Tôi đã bắt đầu với một cơ sở dữ liệu tươi địa phương (thay thế datastore.db) và xây dựng lại các bản ghi từ đầu
  • Có ~ 1200 thực thể Foo cục bộ (~ 3M trong đám mây)
  • Tôi chạy sqlite3 datastore.db "PRAGMA integrity_check trên db cục bộ và không có lỗi nào được báo cáo

Câu hỏi: làm cách nào để truy vấn chạy nhanh hơn cục bộ? (Thật sự rất khó để phát triển với độ trễ 10 giây trong toàn bộ thời gian đó.)

+0

Nếu bạn đã tìm nạp() và được sắp xếp trong python thì sao? – GAEfan

+0

Trong đám mây truy vấn đang chạy hơn ~ 3M thực thể, do đó không thể thực hiện được, nó phải là truy vấn DB. – tom

+1

Xin lỗi, câu hỏi có vẻ như là dành riêng cho SDK địa phương – GAEfan

Trả lời

2

Đây có thể không phải là câu trả lời bạn muốn, nhưng hiệu suất kho dữ liệu chậm trên máy chủ phát triển là vấn đề đã biết từ lâu là tracked on the public issue tracker.

Một lý do tại sao đây là một phần do cách thi đua được xử lý. Nếu bạn xem google/appengine/datastore/datastore_sqlite_stub.py trong SDK, bạn có thể thấy rằng các cuộc gọi đến db các phương thức được dịch một cách ngây thơ thành các truy vấn SQL cơ bản được đưa vào cơ sở dữ liệu SQLite đang chạy cục bộ.

Bạn không thể làm gì ở cấp ứng dụng để cải thiện hiệu suất trong những trường hợp này. Giải pháp là để SDK thực hiện dịch các truy vấn thông minh hơn trên máy chủ phát triển, trong nhóm kỹ thuật SDK để triển khai.

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