2015-01-02 2 views
0

У меня есть таблица, наследующая от другой и имеющая более 10 000 строк и 10 столбцов. Я читаю более 10 000 элементов из ввода. Для каждого элемента я запрашиваю таблицу, чтобы увидеть, нет ли данных. В этом случае я вставляю его в таблицу. Упрощенный пример выглядит следующим образом:Как улучшить производительность частого запроса таблицы в sqlalchemy?

class Port(Interface): 
    __tablename__ = 'ports' 
    Int_Class_ID = Column(Integer, ForeignKey('interfaceitems.Int_Class_ID', ondelete='cascade'), primary_key=True) 
    __mapper_args__ = { 
     'polymorphic_identity': 'ports', 
    } 
    Name = Column(Text) 
    Locked = Column(Boolean) 
    UniqueIdentifier = Column(Text, index=True) 

Тогда я:

portList = Session.query(Port).filter(Port.UniqueIdentifier == ID).all() 

который будет называться, например, в 10000 раз. Но это очень медленно, это занимает 3 минуты, которые для применения кода и частоты, которые будут выполнены, не удовлетворяют. Есть ли способ улучшить производительность?

ответ

2

Кажется, что вы читаете идентификаторы, а затем вызываете запрос для каждого идентификатора отдельно. Это будет очень медленно, и вы хотите прочитать гораздо больший список предметов за раз. Обычно я делаю это, чтобы использовать куски; Таким образом, вы, безусловно, есть много элементов в запросе, но не загружать вниз систему слишком много идентификаторов в одном запросе:

list_of_ids = list(input_ids) 
while list_of_ids: 
    chunk = list_of_ids[0:1000] 
    list_of_ids = list_of_ids[1000:] 
    for port_object in session.query(Port).filter(Port.uniqueidentifier.in_(chunk)): 
     process_object(port_object) 

с вышеизложенным, а излучающие 10000 запросов для одной строки каждого, вам испускать только десять запросов по 1000 строк. Он должен работать довольно быстро.

Если проблема в другом месте, например, чтение всех строк 10K происходит слишком медленно, и вы не можете обойти испускание многих запросов со многими строками, подсказки в orm slowness помогут. Предстоящая функция baked query также поможет в создании строки SQL из запроса, хотя это не похоже на проблему.

Смежные вопросы