Ich habe den folgenden Code (beachten Sie includes
und .each
):
Entsprechend sehe ich in meinen Protokollen Folgendes (d. h. select * from ROSTER_INFO ... IN (...)
):
Gleich danach gibt es select * from ROSTER_INFO
für jede ID, die bereits in der IN
Liste der vorherigen Abfrage angegeben wurde:
Wenn select *
bereits auf ROSTER_INFO
für alle IDs von Interesse ( IN (...)
) ausgeführt wurde, warum wird dann für jede der gleichen IDs erneut ein select *
ausgeführt? Kennt ActiveRecord
bereits nicht alle ROSTER_INFO
-Spalten für jede ID?
(Zwischenzeitlich gibt es keine individuellen Abfragen für ROSTER_CONTACT
, aber wenn ich :roster_contact
von der Methode includes
entferne, wird ROSTER_INFO
nicht erneut abgefragt, aber ROSTER_CONTACT
ist.)
RosterInfo-Modell (gekürzt)
%Vor%RosterContact-Modell (gekürzt)
%Vor%RosterWeb-Modell (gekürzt)
%Vor%Mailgroup-Modell (abgekürzt)
%Vor%MailgroupMember-Modell (abgekürzt)
%Vor% Es stellte sich heraus, dass das Problem mit m.roster_contact.member_name
zusammenhängt - leider habe ich member_name
zu einer Methode von roster_contact
gemacht, die (indirekt) roster_info.member_name
abgefragt hat. Ich habe das gelöst, indem ich die Zeile
um roster_info
wie folgt direkt abzufragen
Es tut mir leid für die Probleme!
Ich werde meinen Hals herausstrecken und sagen, dass dies wahrscheinlich eine In-Flight-Optimierung durch Ihre Suchmaschine ist. Das 'IN' wird normalerweise verwendet, um große Mengen von Schlüsseln zu vergleichen. Die effizienteste Möglichkeit, drei Schlüssel aufzulösen (vorausgesetzt, ID ist der Schlüssel), würde darin bestehen, jede Zeile nach Schlüssel abzurufen, wie es geschehen ist.
Ich weiß nicht, was die Voraussetzung für bidirektionales has_one
ist, aber ich vermute, dass es schlecht ausgehen wird. Wahrscheinlich ändern Sie einen von ihnen in belongs_to
. Machen Sie dasselbe für die anderen bidirektionalen has_one
Assoziationen.
Eine andere Sache ist, dass Sie 'ID' für die foreign_key-Spalte verwenden, wobei die übliche Vorgehensweise roster_contact_id
oder die Klasse ist, auf die Sie verweisen.
Bearbeiten:
Bei näherer Betrachtung sehen RosterInfo
, RosterContact
, RosterWeb
wie separate Tabellen für einen einzelnen Datensatz aus, da sie alle den gleichen Satz von gegenseitigen has_one
Assoziationen haben . Dies ist etwas, das auf der Schema-Ebene behandelt werden sollte, aber momentan sollten Sie in der Lage sein, die Assoziationen has_one
von eins der drei Modelle zu löschen, um Ihr unmittelbares Problem zu lösen.
Tags und Links sql ruby-on-rails activerecord ruby-on-rails-3.2 query-optimization