-
Notifications
You must be signed in to change notification settings - Fork 88
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Very slow fetching string rows #458
Comments
DBeaver (use JDBC) fetching ALL rows from test_int and test_str - very quickly (0.2-0.3 sec) |
Выяснилось, что задержка происходит при вызове SQLGetData,, если параметр BufferLength передается 0. |
На скрине видно, что если при вызове SQLGetData предпоследний параметр BufferLength передан 0, то осуществляется значительно дольше, чем случае, когда передано ненулевое значение. Прототип SQLGetData() выглядит так
|
Далее взял результаты трассировки APIMonitor сохранил в текстовый файл, залил в базу, в табличку APIMonitor и сгруппировал вызовы по методу и отсортировал по длительности. Получил такую картину
Тут видно, что задержки достаточно большие (50000 вызовов SQLGetData отрабатывали 0.6 сек) |
К примеру такой скрипт на Python не вызывает задержек
ClickHouse (test_int): 1.560003 sec, 50000 rows Это происходит потому, что библиотека pyodbc вызывает SQLGetData всегда с ненулевым значением параметра BufferLength (это удалось подтвердить через вышеупомянутый APIMonitor) |
В первоначальном скрипте используется ADODB поверх ODBC,
ADODB - это высокоуровневый интерфейс в т.ч. вокруг ODBC (используется в случаях, когда клиентское приложение может использовать только высокоуровнеый COM IDispatch. |
Задержка происходит из-за проброса исключений
в методе fillOutputBuffer (driver\utils\type_info.h)
в методе fillOutputString (driver\utils\type_info.h) Чуть выше исключение перехватывается
и в вызывающий код передается SQL_SUCCESS_WITH_INFO, а не SQL_SUCCESS, как обычно (это кстати, видно в APIMonitor) Вызов исключения происходит часто, если у меня 30 полей и 50000 строк - то вызов 1.5 млн исключений съедает 15 секунд Закомментил эти строки (throw SqlException... и условия перед ними), пересобрал, задержка ушла. |
ClickHouse version 24.9.2.42
ODBC version 1.03.00.55930 for Windows
I'm run queries by ODBC
select * from test_int - fetching all rows very quickly (1 sec)
select * from test_str - fetching all rows very slowly (15 sec)
For example, vbs script
ClickHouse (test_int): 1 sec, 50000 rows
ClickHouse (test_str): 15 sec, 50000 rows
The text was updated successfully, but these errors were encountered: