我的存储过程非常慢(每次运行约30分钟),它会为传递的每个日期写入输出表。它唯一的参数是输入日期,它需要在一个范围内的每一天运行。使用游标或for循环导致没有加速,因为它是按顺序运行的,并且proc的每次运行必须等待前一个完成。
我曾尝试使用线程为范围内的每个日期执行proc,但我没有注意到我期望的加速。如果我做错了,或者有更普遍接受的方式来运行并发SQL,请告诉我。我希望由于一次执行需要30分钟,如果我同时运行程序,那么100个日期应该比一个日期需要的30分钟稍长一些,但绝对不是线性增加。
以下是代码的相关部分:
def query(table_name,prod_dt):
cur.execute("exec {} '{}';".format(table_name,prod_dt))
conn.commit()
def next_workday(start_date,end_date):
start_date=datetime.strptime(start_date,'%Y-%m-%d')
end_date=datetime.strptime(end_date,'%Y-%m-%d')
yield datetime.strftime(start_date,'%Y-%m-%d')
while start_date<end_date:
start_date+=BDay(1)
yield datetime.strftime(start_date+BDay(0),'%Y-%m-%d')
def main():
'''
change func call in line 1 to last_workday_of_month or next_workday
depending on what you need, monthly vs daily business days
'''
for date in next_workday('2014-12-31','2015-03-31'):
t1=Thread(target=query,args=('slow_proc',date))
t1.start()
t1.join()