왜 ActiveRecord 발행하는 별도의 쿼리당하는 가입?
-
03-07-2019 - |
문제
나는 하 ActiveRecord 찾 작업(을 통해"will_paginate"라이브러리)에 다음과 같다:
contacts = Contact.paginate(:all,
:conditions => conditions_specified,
:select => "DISTINCT contacts.*",
:joins => joins,
:include => [:addresses, :emails, :phone_numbers, {:addresses => :organization}],
:page => page,
:per_page => @@PAGE_SIZE,
:order => 'last_name, first_name, middle_name')
콘솔에서 나는 출력을 얻을 아래와 같습니다.에 의해 설정 include
매개 변수가 기대 이하 결과에 하나만 쿼리가 있습니다.그러나는 출력에서 나는 보고 많은 쿼리를 처리합니다.예를 들어,깜짝 놀랐다.
Address Load (2.5ms) SELECT `addresses`.* FROM `addresses` WHERE (`addresses`.contact_id IN (94,106,104,108,121,55,40,75,62,4,67,36,77,64,7,35,24,68,57,117,8,30,85))
출력에서 아래.(나는 이해 SHOW FIELDS FROM
쿼리가 캐시에 생산하도록 문제가되지 않습니다.그것은 모든 선택하면 그림이 있습니다.)
Processing ContactController#index (for 127.0.0.1 at 2009-01-03 21:21:18) [GET]
Session ID: d453897c2f67c29c9a68d3fbc7b94f7b
ContactSearch Columns (4.4ms) SHOW FIELDS FROM `contact_searches`
Contact Load (1.1ms) SELECT DISTINCT contacts.* FROM `contacts` WHERE (contacts.last_name LIKE '%n%') ORDER BY last_name, first_name, middle_name LIMIT 0, 35
Contact Columns (2.3ms) SHOW FIELDS FROM `contacts`
Address Load (2.5ms) SELECT `addresses`.* FROM `addresses` WHERE (`addresses`.contact_id IN (94,106,104,108,121,55,40,75,62,4,67,36,77,64,7,35,24,68,57,117,8,30,85))
Address Columns (2.7ms) SHOW FIELDS FROM `addresses`
Email Load (1.7ms) SELECT `emails`.* FROM `emails` WHERE (`emails`.contact_id IN (94,106,104,108,121,55,40,75,62,4,67,36,77,64,7,35,24,68,57,117,8,30,85))
Email Columns (1.8ms) SHOW FIELDS FROM `emails`
PhoneNumber Load (3.3ms) SELECT `phone_numbers`.* FROM `phone_numbers` WHERE (`phone_numbers`.contact_id IN (94,106,104,108,121,55,40,75,62,4,67,36,77,64,7,35,24,68,57,117,8,30,85))
PhoneNumber Columns (3.0ms) SHOW FIELDS FROM `phone_numbers`
Organization Columns (2.9ms) SHOW FIELDS FROM `organizations`
Organization Load (0.9ms) SELECT * FROM `organizations` WHERE (`organizations`.`id` IN (99,116,44,6,23,78,107,91,79,119,14,120,71,26,59,94,27,100,62,1,51,29,30,2,65,76,5))
Rendering template within layouts/main
Rendering contact/index
Rendered contact/_field_function_specifier (0.9ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_field_function_specifier (0.6ms)
Rendered contact/_search_form (14.1ms)
Rendered contact/_quick_view_contact_info (3.2ms)
Rendered contact/_quick_view_contact_info (2.1ms)
Rendered contact/_quick_view_contact_info (1.9ms)
Rendered contact/_quick_view_contact_info (1.9ms)
Rendered contact/_quick_view_contact_info (0.8ms)
Rendered contact/_quick_view_contact_info (2.0ms)
Rendered contact/_quick_view_contact_info (2.4ms)
Rendered contact/_quick_view_contact_info (1.7ms)
Rendered contact/_quick_view_contact_info (1.4ms)
Rendered contact/_quick_view_contact_info (1.7ms)
Rendered contact/_quick_view_contact_info (2.2ms)
Rendered contact/_quick_view_contact_info (1.5ms)
Rendered contact/_quick_view_contact_info (2.0ms)
Rendered contact/_quick_view_contact_info (1.7ms)
Rendered contact/_quick_view_contact_info (1.8ms)
Rendered contact/_quick_view_contact_info (3.6ms)
Rendered contact/_quick_view_contact_info (2.2ms)
Rendered contact/_quick_view_contact_info (2.2ms)
Rendered contact/_quick_view_contact_info (1.9ms)
Rendered contact/_quick_view_contact_info (1.7ms)
Rendered contact/_quick_view_contact_info (2.0ms)
Rendered contact/_quick_view_contact_info (2.1ms)
Rendered contact/_quick_view_contact_info (1.9ms)
Completed in 308ms (View: 104, DB: 27) | 200 OK [http://localhost/contact]
해결책
았다 좀 더 연구하고 응답을 발견했다.업데이트하고 이에 대한 사람들을 검색니다.장 응답이 이 블로그 게시물.
그것은이 나타납을 할 때는 모두 참여하고,제한 ActiveRecord 가 첫 번째 질의 기본 테이블을 얻을 수 Id 의 행를 반환한 다음,다시 실행 쿼리에는 사용자 Id 를 적용되기 위해서는 제한.
었기 때문에 사용하는 will_paginate
, 무슨 일이 일어났으로 will_paginate
사 limit
ed 쿼리를 수행에 매김.
제휴하지 않습니다 StackOverflow