Tôi đã làm việc tối ưu hóa các cuộc gọi DB của dự án của tôi và tôi nhận thấy một sự khác biệt "đáng kể" trong hoạt động giữa hai cuộc gọi giống hệt dưới đây:Truy vấn ActiveRecord chậm hơn nhiều so với SQL thẳng?
connection = ActiveRecord::Base.connection()
pgresult = connection.execute(
"SELECT SUM(my_column)
FROM table
WHERE id = #{id}
AND created_at BETWEEN '#{lower}' and '#{upper}'")
và phiên bản thứ hai:
sum = Table.
where(:id => id, :created_at => lower..upper).
sum(:my_column)
Các phương pháp sử dụng phiên bản đầu tiên trên trung bình mất 300ms để thực thi (hoạt động được gọi là một vài nghìn lần tổng số trong đó), và phương pháp sử dụng phiên bản thứ hai mất khoảng 550ms. Tốc độ giảm gần như 100%.
Tôi đã kiểm tra lại SQL được tạo bởi phiên bản thứ hai, nó giống hệt với phiên bản đầu tiên có ngoại lệ đối với cột bảng chuẩn bị trước với tên bảng.
- Tại sao chậm lại? Việc chuyển đổi giữa ActiveRecord và SQL có thực sự khiến cho hoạt động mất gần gấp 2 lần không?
- Tôi có cần phải viết để viết SQL thẳng (có lẽ ngay cả một sproc) nếu tôi cần phải thực hiện các hoạt động tương tự một tấn thời gian và tôi không muốn để đạt trên không?
Cảm ơn!
chỉ cần sử dụng .explain và nhìn vào truy vấn mà được tạo ra, tôi chắc chắn có vẻ khác nhau và thats lý do tại sao phải mất quá nhiều thời gian hơn – antpaw
tôi kiểm tra lại kế hoạch truy vấn, họ đều giống hệt nhau, chi phí và tất cả các. Đã thay thế .select từ .sum trong phiên bản thứ hai, khi bạn nhận được một Fixnum trở lại từ đó và tôi không thể tìm thấy một cách để làm một. Giải thích về truy vấn đã được sử dụng để tạo ra nó. –