В этой статье приведу несколько советов от Бориса Тюкина по увеличению скорости загрузки данных в Qlik из базы данных Oracle.
0. Оптимизируйте качество ваших SQL-выражений
Это, действительно, основополагающий шаг, который подразумевает наличие у вас опыта работы с БД Oracle. Если у вас такого опыта не имеется, то необходимо уделить время для изучения принципов работы этой базы данных, которая имеет ряд специфичных особенностей.
Наверняка, вам известные инструменты диагностики производительности. Например, Explain Plan – верный друг и помощник, на котором лучше всегда проверять любые внесенные вами изменения, чтобы убедиться, что все работает корректно. Никогда не запускайте запросы на продуктивной базе данных, прежде чем не протестируйте его в Explain Plan, ведь один некачественный запрос может положить БД Oracle.
НА ЗАМЕТКУ! Основным инструментом для мониторинга производительности ORACLE является коллекция динамических таблиц производительности. Эти таблицы имеют имена, начинающиеся с «V$», и упоминаются в тех частях настоящего руководства, которые описывают отслеживание производительности. Дополнительными инструментами мониторинга являются команда Explain Plan и средство трассировки SQL. Проанализировав полученный план выполнения можно убедиться, что SQL запрос будет выполняться оптимально, либо принять меры по изменению текста SQL запроса, создании дополнительных индексов или выполнить иные действия по настройке SQL запроса или базы данных.
Итак, протестируйте сначала работу ваших запросов, например с помощью Oracle SQL Developer. Проверив время выполнения, скорость загрузки, можно откопировать и вставить его QlikView или Qlik Sense.
Таким образом, проверяем качество SQL-запроса, прежде, чем запускать в работу инструменты Qlik.
1. Ограничьте данные для загрузки.
Чем больше данных загружаем, тем ниже скорость – это здравый смысл. Поэтому нужно сказать нет «SELECT * FROM table». Перечисляйте список точных имен колонок в вашем выражении SELECT.
Всегда старайтесь отфильтровать данные в источнике (например, через условные WHERE или HAVING).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
LOAD * WHERE col1 > 1000; SQL SELECT col1, col2 FROM table1 ; Вместо этого сделайте следующее: LOAD * ; SQL SELECT col1, col2 FROM table1 WHERE col1 > 1000 ; |
Также попробуйте объединить таблицы через JOIN.
2. Используйте драйвер Oracle OLE DB x64.
Драйвер ODBC работает более медленно – вместо этого используйте OLE DB. Также убедитесь, что вы используете x64-битный, а не x86 драйвер.
3. Будьте осторожны с подсказками к запросам.
Обычно подсказки к запросам в Oracle пишут в формате синтаксиса /*+ … */. Qlik же воспримет эти подсказки как комментарий /*+ … */. На QlikCommunity есть даже целое обсуждение по этой теме.
Для этого есть просто решение – вместо этого используйте синтаксис —+ , если вам нужна подсказка запроса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SELECT /*+ index(e PI_CUST_READMIT_DENOM3) */ ... FROM CUST_V500.CUST_COM_READMIT_DENOM e .... Корректная работа подсказки в Oracle: SELECT --+ index(e PI_CUST_READMIT_DENOM3) ... FROM CUST_V500.CUST_COM_READMIT_DENOM e .... |
4. Подумайте об изменении настроек по умолчанию FetchSize.
Вы можете добавить параметр FetchSize и протестировать разные значения. Универсального подходящего значения параметра нет, т.к. он зависит от количества строк в таблице. Можно ускорить время выполнения запроса на 10-50%, поиграв с этим параметром. Помогает не всегда, но попробовать стоит.
Вот несколько полезных линков на эту тему: Link1 Link2 Link3
1 |
OLEDB CONNECT TO [Provider=OraOLEDB.Oracle.1;Persist Security Info=True;User ID=USERID;Data Source=TNSNAME;FetchSize=10000;Extended Properties=""]; |
5. Попробуйте параллельное исполнение кода.
Это полезная техника, но может иметь и отрицательные последствия, поэтому прежде чем вносить изменения, посоветуйтесь с архитектором БД Oracle. Почитать немного на эту тему можно в официальной документации Oracle: How Parallel Execution Works.
1 2 3 4 5 |
SELECT --+ PARALLEL ... FROM |
6. Посмотрите на глобальные временные таблицы.
Познакомьтесь с Oracle Global Temporary Tables (GTT). Если вы запускаете несколько запросов и вам нужно повторно использовать данные, то можно использовать GTT, чтобы предобработать определенный набор данных и затем использовать их в дальнейшем.
7. Инкрементальная загрузка данных.
Иногда самый удобный способ – разбить загрузку данных на части. Например, когда приложение нужно перезагружать ежедневно или чаще.
На этом все на сегодня! Удачных вам разработок!
Добрый день!
По этому совету:
Вместо этого сделайте следующее:
LOAD *;
SQL SELECT
col1,
col2
FROM table1
WHERE col1 > 1000
;
Столкнулся с проблемой возможности использования команды exist() в блоке SELECT, возможно ли использование этой или аналогичной конструкции при фильтрации данных в источнике, есть ли какое либо разумное решение этого вопроса?
Спасибо!