Rails - so sánh where vs select khi thao tác trên memory và performance.
Bài toán Tôi đã viết một file seed trong đó nó cần phải được thiết lập để cập nhật chi tiết liên quan đến service_id trong một bảng. Task hiện tại của tôi là cần tìm trên 10.000 services và sau đó cập nhật các bản ghi. Viết một cách theo như tư duy truyền thống thì tôi có thể lấy tất cả các ...
Bài toán
Tôi đã viết một file seed trong đó nó cần phải được thiết lập để cập nhật chi tiết liên quan đến service_id trong một bảng. Task hiện tại của tôi là cần tìm trên 10.000 services và sau đó cập nhật các bản ghi.
Viết một cách theo như tư duy truyền thống thì tôi có thể lấy tất cả các services lưu vào một biến và sau đó lặp qua từng bản ghi đẻ thao tác(Cách này đương nhiên là tồi tệ nếu số lượng bản ghi lớn nhưng tôi vẵn muốn thử chạy để xem nó tệ như thế nào)
services = Service.all services.each do |service| #Do something on service end
Để hiểu và so sánh rõ hơn về sự tác động thì tôi muốn nhìn và đánh giá trên 2 tiêu chí:
- Bộ nhớ được cấp cho biến.
- Thời gian thực thi câu lênh SQL
Tiêu chí 1
Có một mudule khá là hay trong Ruby để kiểm tra bộ nhớ được sử dụng bởi một biến đó là Object Space. Để sử dụng được nó bên trong Rails Console hãy làm như bên dưới.
require 'objspace'
Module này bao gôm rất nhiều điều hay và đáng quan tâm để thực sự nghiên cứu một đối tượng, nhưng trước hết hãy tập trung vào vấn đề đang được xem xét ở trên. Phương thức memsize_of giúp chúng ta biết kích thước của một đối tượng trên memory và đơn vị là byte.
ObjectSpace.memsize_of(services) #=> 120632
Như ví dụ trên là biến services đang chưa tất cả thông tin của service, vì vậy tôi quyết định thử sửa và chỉ chọn id của service bằng cách sử dụng select method của Rails query method(ActiveRecord).
services_id = Service.select(:id).all
Tôi đã dự đoán rằng cách làm này sẽ làm giảm size đi và nhỏ hơn rất nhiều so với cách trên, nhưng chắc tôi đã nhầm. Bên dưới là kết quả