#python #sql-server #python-3.x #pyodbc
#python #sql-сервер #python-3.x #pyodbc
Вопрос:
Я запрашиваю у SQL Server список полей как с потоковой обработкой, так и без потоковой обработки.
import pyodbc
import datetime
import concurrent.futures
server = 'xx.xxx.xxx.xxx,1433'
database = 'db'
username = 'user'
password = 'password'
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=' server ';DATABASE=' database ';UID=' username ';PWD=' password ';MARS_Connection=yes' ';Max_Pool_Size=100000')
filter_list = ["department_id", "employee_id", "city", "country", "state", "zip_cope", "department_name", "employee_name", "employee_experience"]
t1 = datetime.datetime.now()
result_list = []
def query_executor(field):
try:
ft1=datetime.datetime.now()
cursor = cnxn.cursor()
result = cursor.execute("""SELECT DISTINCT TOP 1000 [{}] from EMPLOYEE_DETAILS""".format(field))
print(field)
result_list1 = [filter_item[0] for filter_item in result if filter_item[0]]
# print("#############################################")
return {"name": field, "filter_data": result_list1}
except Exception as e:
print(e)
finally:
print("#############################################")
print(datetime.datetime.now()-ft1)
print("#############################################")
cursor.close()
# with threading
with concurrent.futures.ThreadPoolExecutor() as executor:
result = [executor.submit(query_executor, field) for field in filter_list]
for f in concurrent.futures.as_completed(result):
result_list.append(f.result())
print(result_list)
t2 = datetime.datetime.now()
print("#############################################")
print('with threading time taken')
print(t2-t1)
print("#############################################")
#without threading
for f in filter_list:
result_list.append(query_executor(f))
print(result_list)
t2 = datetime.datetime.now()
print("#############################################")
print('without threading time taken')
print(t2-t1)
print("#############################################")
Во время выполнения я комментирую любой из них, чтобы увидеть время, затраченное индивидуально с потоковой обработкой и без нее. Но я не вижу большой разницы во времени. На самом деле иногда поток становится медленным.
Я делаю что-то не так? Как я получу повышение производительности? filter_list
иногда список может увеличиться еще больше, что может привести к замедлению ответа.
Заранее спасибо!
Комментарии:
1. Использование нескольких потоков не является «волшебной пулей», которая гарантированно повышает производительность во всех случаях. Если скорость, с которой вы можете извлекать строки из базы данных, ограничена несвязанными факторами, такими как пропускная способность сети, дисковый ввод-вывод на сервере и т. Д., То На самом деле не имеет значения, является ли ваше клиентское приложение однопоточным или многопоточным. И, поскольку использование нескольких потоков усложняет работу вашего приложения (для управления этими потоками), это может фактически замедлить работу вашего приложения.
2. @GordThompson Не могли бы вы предложить. как ускорить выполнение запросов.
3.
Max_Pool_Size
по умолчанию значение равно 100. Установка значения 100 000 не приведет ни к чему, кроме истощения клиентской системы python в отношении дескрипторов памяти и сокетов, в частности, исчерпания портов.