在Rails中有一個有用的方法,可以顯示查詢需要多長時間以及它是什麼查詢。使用說明與計數
的方法是 '解釋'
所以我可以做:
User.where(name: 'Johnny').explain
它將顯示實際的SQL查詢。
'count'方法也會生成一個sql查詢,但由於'count'返回一個數字而不是一個活動記錄,所以我無法使用解釋。 有沒有辦法做到這一點?
在Rails中有一個有用的方法,可以顯示查詢需要多長時間以及它是什麼查詢。使用說明與計數
的方法是 '解釋'
所以我可以做:
User.where(name: 'Johnny').explain
它將顯示實際的SQL查詢。
'count'方法也會生成一個sql查詢,但由於'count'返回一個數字而不是一個活動記錄,所以我無法使用解釋。 有沒有辦法做到這一點?
這工作:
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)
這與解釋計數方法不完全相同。如果在複雜的情況下count方法產生一個與select方法不同的sql查詢,那麼這是不夠的。 – sonnyhe2002
請參閱編輯,它是一樣的。當然,如果存在複雜的案例(例如涉及不同或順序的案例),則必須注意「按摩」該陳述,以便生成相同的代碼。 – AnoE
'count'是不是一個真正的查詢 - 它的一個功能,在查詢結果中運行。複雜性將存在於需要「解釋」的「FROM」和「WHERE」中。 –
'count'是SQL查詢的一部分,因此是「真正」的查詢。它在DB內部運行,而不是在rails中運行。 – AnoE