text: from sqlalchemy import *
  from sqlalchemy.orm import *
  from sqlalchemy.test import profiling
  
  NUM = 500
  DIVISOR = 50
  
  engine = create_engine('sqlite://')
  meta = MetaData(engine)
  items = Table('items', meta,
                Column('item_id', Integer, primary_key=True),
                Column('value', String(100)))
  subitems = Table('subitems', meta,
                   Column('sub_id', Integer, primary_key=True),
                   Column('parent_id', Integer, ForeignKey('items.item_id')),
                   Column('value', String(100)))
  
  class Item(object):pass
  class SubItem(object):pass
  mapper(Item, items, properties={'subs':relationship(SubItem, lazy='joined')})
  mapper(SubItem, subitems)
  
  def load():
      global l
      l = []
      for x in range(1,NUM/DIVISOR + 1):
          l.append({'item_id':x, 'value':'this is item #%d' % x})
      #print l
      items.insert().execute(*l)
      for x in range(1, NUM/DIVISOR + 1):
          l = []
          for y in range(1, DIVISOR + 1):
              z = ((x-1) * DIVISOR) + y
              l.append({'sub_id':z,'value':'this is item #%d' % z, 'parent_id':x})
          #print l
          subitems.insert().execute(*l)
  
  @profiling.profiled('massjoinedload', always=True, sort=['cumulative'])
  def massjoinedload(session):
      session.begin()
      query = session.query(Item)
      l = query.all()
      print "loaded ", len(l), " items each with ", len(l[0].subs), "subitems"
  
  def all():
      meta.create_all()
      try:
          load()
          massjoinedload(create_session())
      finally:
          meta.drop_all()
  
  if __name__ == '__main__':
      all()
  