Aleksandr Ignatyev
Коллеги, добрый день.
Есть немного дикий вопрос:
Мы Лайвом подключаемся к бд. При этом прогрузка собранных отчетов занимает приличное время (порядка минуты).
Достали запросы, которые генерит Табло и отсылает в бд. Там используется cursor.
При этом в этом бд cursor обрабатывает один оптимизатор запросов, который очень проблематично реагирует на запросы с distinct.
Соответственно вопрос: можно ли в Табло как-то изменять вид запросов на бд при лайв коннекте?
Табло по умолчанию использует FETCH=10000, то есть, за одну сессию при подключении к БД при объявлении курсора выгружается 10000 строк, здесь теряется много времени на подключения между сессиями и база ждет, когда табло запросит очередные 10000 строк (вы видите запросы типа fetch 10000 in "SQL_CUR2". Конструкция DECLARE CURSOR/ FETCH плохо работает с несколькими джойнами и динстинктами. Можно отключить объявление курсора в xml самого воркбука в строке <connection class= ... 'odbc-connect-string-extras' (для разных типов источников разные строки будут) в '' прописать либо 'FETCH=100000' (увеличить на порядок или два) либо 'UseDeclareFetch=0', тогда вы будете ходить в БД чистыми запросами. Отключение fetch чревато тем, что если вы попытаетесь чистым запросом загрузить данных больше, чем память машины, то табло будет писать, что запрос идет, а БД будет ждать, когда освободится память для всех этих данных (а она никогда не освободится), потом все отвалится по таймауту либо базы либо двухчасовому дефолтному таймауту табло.
Если увеличиваете fetch, посмотрите, сколько занимает сериализованный курсор в БД.
Редактирование xml работает (не только для этого случая), но оно не поддерживается компанией
Это все также работает и для экстрактов (у меня время снижалось с часа до 4х минут на локальном компьютере)
Есть еще возможность изменения глобальных настроек самого сервера, но лучше этого не делать, потому что ширина таблиц разная (для одной памяти хватит, для другой-нет).
Вопрос, кстати, не дикий ))