2016-01-15 97 views
1

在Rails中有一個有用的方法,可以顯示查詢需要多長時間以及它是什麼查詢。使用說明與計數

的方法是 '解釋'

所以我可以做:

User.where(name: 'Johnny').explain 

它將顯示實際的SQL查詢。

'count'方法也會生成一個sql查詢,但由於'count'返回一個數字而不是一個活動記錄,所以我無法使用解釋。 有沒有辦法做到這一點?

+0

'count'是不是一個真正的查詢 - 它的一個功能,在查詢結果中運行。複雜性將存在於需要「解釋」的「FROM」和「WHERE」中。 –

+0

'count'是SQL查詢的一部分,因此是「真正」的查詢。它在DB內部運行,而不是在rails中運行。 – AnoE

回答

1

這工作:

User.select('count(*)').where(name: 'Johnny').explain 

編輯:這確實是正是相同:

irb(main):004:0> Benutzer.where(login: 'xxx').count 
    (2.2ms) SELECT COUNT(*) FROM "BENUTZER" WHERE "BENUTZER"."LOGIN" = 'xxx' 
=> 0 
irb(main):005:0> Benutzer.select("count(*)").where(login: 'xxx').explain 
    Benutzer Load (0.9ms) SELECT count(*) FROM "BENUTZER" WHERE "BENUTZER"."LOGIN" = 'xxx' 
=> EXPLAIN for: SELECT count(*) FROM "BENUTZER" WHERE "BENUTZER"."LOGIN" = 'xxx' 
Plan hash value: 1339361075 

------------------------------------------------------------------------------- 
| Id | Operation   | Name  | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |   |  1 | 12 |  2 (0)| 00:00:01 | 
| 1 | SORT AGGREGATE |   |  1 | 12 |   |   | 
|* 2 | TABLE ACCESS FULL| BENUTZER |  1 | 12 |  2 (0)| 00:00:01 | 
------------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    2 - filter("BENUTZER"."LOGIN"='xxx') 

Note 
----- 
    - dynamic sampling used for this statement (level=2) 
+0

這與解釋計數方法不完全相同。如果在複雜的情況下count方法產生一個與select方法不同的sql查詢,那麼這是不夠的。 – sonnyhe2002

+0

請參閱編輯,它是一樣的。當然,如果存在複雜的案例(例如涉及不同或順序的案例),則必須注意「按摩」該陳述,以便生成相同的代碼。 – AnoE