Python Azure数据库摄取速度
我正在努力提高Azure SQL中的接收速度。即使我使用的是SQLAlchemy连接池,但在一定数量的线程之后,速度并没有增加,并且停留在每秒大约700次插入 Azure SQL显示50%的资源利用率。代码在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
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没有内存表的无锁、无闩锁行为,但对于大容量数据来说,它是一种更好的格式。