changeset 4816:2b132bc99d6c

db: drop most lazy joins Lazy joins will in some cases turn small selects into joins that returns huge amounts of redundant data - increasingly bad as the repo size increases. Lazy joins should only be used after careful analysis and with comments explaining the case. This change will make some operations faster and probably also make some operations slower. Performance regressions would have to be analyzed and addressed separately ... and differently.
author Mads Kiilerich <madski@unity3d.com>
date Wed, 11 Feb 2015 02:40:28 +0100
parents 64b1a2320bcb
children 0ee5a36aaa99
files kallithea/model/db.py
diffstat 1 files changed, 13 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/model/db.py	Mon Feb 02 17:20:08 2015 -0500
+++ b/kallithea/model/db.py	Wed Feb 11 02:40:28 2015 +0100
@@ -682,7 +682,7 @@
     expires = Column('expires', Float(53), nullable=False)
     created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
 
-    user = relationship('User', lazy='joined')
+    user = relationship('User')
 
     @property
     def expired(self):
@@ -704,7 +704,7 @@
     email_id = Column("email_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
     user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
     _email = Column("email", String(255, convert_unicode=False), nullable=True, unique=False, default=None)
-    user = relationship('User', lazy='joined')
+    user = relationship('User')
 
     @validates('_email')
     def validate_email(self, key, email):
@@ -736,7 +736,7 @@
     user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
     ip_addr = Column("ip_addr", String(255, convert_unicode=False), nullable=True, unique=False, default=None)
     active = Column("active", Boolean(), nullable=True, unique=None, default=True)
-    user = relationship('User', lazy='joined')
+    user = relationship('User')
 
     @classmethod
     def _get_ip_range(cls, ip_addr):
@@ -798,7 +798,7 @@
     created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
     _group_data = Column("group_data", LargeBinary(), nullable=True)  # JSON data
 
-    members = relationship('UserGroupMember', cascade="all, delete-orphan", lazy="joined")
+    members = relationship('UserGroupMember', cascade="all, delete-orphan")
     users_group_to_perm = relationship('UserGroupToPerm', cascade='all')
     users_group_repo_to_perm = relationship('UserGroupRepoToPerm', cascade='all')
     users_group_repo_group_to_perm = relationship('UserGroupRepoGroupToPerm', cascade='all')
@@ -883,7 +883,7 @@
     users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
     user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
 
-    user = relationship('User', lazy='joined')
+    user = relationship('User')
     users_group = relationship('UserGroup')
 
     def __init__(self, gr_id='', u_id=''):
@@ -1837,7 +1837,7 @@
     permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
 
     user = relationship('User')
-    permission = relationship('Permission', lazy='joined')
+    permission = relationship('Permission')
 
     def __unicode__(self):
         return u'<%s => %s >' % (self.user, self.permission)
@@ -2153,7 +2153,7 @@
     created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
     modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
 
-    author = relationship('User', lazy='joined')
+    author = relationship('User')
     repo = relationship('Repository')
     # status_change is frequently used directly in templates - make it a lazy
     # join to avoid fetching each related ChangesetStatus on demand.
@@ -2212,9 +2212,9 @@
     version = Column('version', Integer(), nullable=False, default=0)
     pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
 
-    author = relationship('User', lazy='joined')
+    author = relationship('User')
     repo = relationship('Repository')
-    comment = relationship('ChangesetComment', lazy='joined')
+    comment = relationship('ChangesetComment')
     pull_request = relationship('PullRequest')
 
     def __unicode__(self):
@@ -2274,7 +2274,7 @@
     def other_ref_parts(self):
         return self.other_ref.split(':')
 
-    author = relationship('User', lazy='joined')
+    author = relationship('User')
     reviewers = relationship('PullRequestReviewers',
                              cascade="all, delete-orphan")
     org_repo = relationship('Repository', primaryjoin='PullRequest.org_repo_id==Repository.repo_id')
@@ -2352,8 +2352,7 @@
     type_ = Column('type', Unicode(256))
 
     created_by_user = relationship('User')
-    notifications_to_users = relationship('UserNotification', lazy='joined',
-                                          cascade="all, delete-orphan")
+    notifications_to_users = relationship('UserNotification', cascade="all, delete-orphan")
 
     @property
     def recipients(self):
@@ -2400,8 +2399,8 @@
     read = Column('read', Boolean, default=False)
     sent_on = Column('sent_on', DateTime(timezone=False), nullable=True, unique=None)
 
-    user = relationship('User', lazy="joined")
-    notification = relationship('Notification', lazy="joined")
+    user = relationship('User')
+    notification = relationship('Notification')
 
     def mark_as_read(self):
         self.read = True