Python Azure数据库摄取速度

Python Azure数据库摄取速度,python,sql-server,azure,azure-sql-database,Python,Sql Server,Azure,Azure Sql Database,我正在努力提高Azure SQL中的接收速度。即使我使用的是SQLAlchemy连接池,但在一定数量的线程之后,速度并没有增加,并且停留在每秒大约700次插入 Azure SQL显示50%的资源利用率。代码在Azure中运行,因此网络不应成为问题 有没有办法提高速度 import pyodbc from sqlalchemy.engine import create_engine from sqlalchemy.orm import scoped_session, sessionmaker d

我正在努力提高Azure SQL中的接收速度。即使我使用的是SQLAlchemy连接池,但在一定数量的线程之后,速度并没有增加,并且停留在每秒大约700次插入

Azure SQL显示50%的资源利用率。代码在Azure中运行,因此网络不应成为问题

有没有办法提高速度

import pyodbc
from sqlalchemy.engine import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

def connect():
    return pyodbc.connect('....')

engine = create_engine('mssql+pyodbc://', creator=connect, pool_recycle=20, pool_size=128, pool_timeout=30)
session_factory = sessionmaker(bind=engine)


def process_entry(i):
  session = scoped_session(session_factory)

  # skipping logic for computing vec, name1, name2
  # vec - list of floats, name1, name2 - strings
  vec = [55.0, 33.2, 22.3, 44.5]
  name1 = 'foo'
  name2 = 'bar'

  for j, score in enumerate(vec):  
    parms = {'name1': name1, 'name2': name2, 'score': score }
    try:
      session.execute('INSERT INTO sometbl (name1, name2, score) VALUES (:name1, :name2, :score)', parms)
      session.commit()
    except Exception as e:
      print(e)



fs = []
pool = ThreadPoolExecutor(max_workers=128)

for i in range(0, N):
  future = pool.submit(process_entry, i)
  fs.append(future)

concurrent.futures.wait(fs, timeout=None, return_when=ALL_COMPLETED)
commit()。而是每N行提交一次。比如:

  rn = 0
  for j, score in enumerate(vec):  
    parms = {'name1': name1, 'name2': name2, 'score': score }
    try:
      session.execute('INSERT INTO sometbl (name1, name2, score) VALUES (:name1, :name2, :score)', parms)
      rn = rn + 1
      if rn%100 == 0:
        session.commit()
    except Exception as e:
      print(e)
  session.commit()
如果您想更快地加载数据,可以发送包含成批数据的JSON文档,并使用SQL Server中的函数批量解析和插入它们。也有一些特殊的批量加载API,但是这些API不容易从python中访问

您也可能会在适当数量的工人中达到最大吞吐量。除非您的表是空的,否则您的插入可能需要协调对共享资源的访问,比如在BTree中锁定首页,或者在辅助索引中锁定行


您当前拥有的高并发级别可能只是(部分地)补偿当前每行提交策略。

取决于数据库大小,您可以考虑在IO密集工作负载期间扩展到高级级别,以加快进度,一旦完成,可以考虑缩回原始层。

<>你也可以考虑使用分批来提高性能。您将了解如何使用批处理和其他策略来提高插入性能,如SqlBulkCopy、UpdateBatchSize等

要获得最快的插入性能,请遵循以下一般准则,但要测试您的场景:

  • 对于<100行,使用单个参数化INSERT命令
  • 对于<1000行,请使用表值参数
  • 对于>=1000行,请使用SqlBulkCopy

我发现顶级存储层仅为内存优化的表提供32GB的存储空间:当数据量增加十倍时,您将如何处理此问题?最大的Gen5 VCore配置限制为131GB。但在任何情况下,我都可能会使用群集的Columnstore。对于新行,您将得到一个简单的BTree,每1M行将被压缩到列存储中(可选延迟)。Columnstore没有内存表的无锁、无闩锁行为,但对于大容量数据来说,它是一种更好的格式。