Сессия Teradata прерывает порог процессора AMP - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть пакет служб SSIS, который обновляет разделы куба SSAS. Каждый раздел представляет собой SQL-запрос, выполняемый против Teradata. Я использую «Поставщик данных NET для Teradata» в пакете служб SSIS. Куб SSAS использует «Teradata.Client.Provider». Любой конкретный запрос выполняется просто отлично. Тем не менее, после 5-10 итераций я получаю прерванную сессию. После некоторого исследования я обнаружил, что все запросы используются в одном сеансе:

sel * from DBC.DBQLogTbl where sessionid = 123456

Этот запрос возвращает несколько строк с запросами из цикла. Каждый запрос сам по себе не превышает пороговое значение AMP ЦП, однако совокупное использование AMP превышает пороговое значение. Я настроил строки подключения в службах SSIS и SSAS следующим образом:

  • SSAS: время ожидания подключения = 180; механизм проверки подлинности = LDAP; размер буфера ответов = 64000; идентификатор пользователя = ***; источник данных =my.production.server; Persist Security Info = True; набор символов сеанса = UTF16; пул соединений = False; тайм-аут пула соединений = 15; тайм-аут команды = 900
  • SSIS: источник данных = my.production.server;Идентификатор пользователя = ***; Механизм аутентификации = LDAP; Постоянная информация о безопасности = Истина; Набор символов сеанса = UTF16; Пул соединений = Ложь;

Я отключил параллельное выполнение на кубе. Я отключил пул соединений, как вы можете видеть из строки соединения. Я установил для параметра «Максимальное количество соединений» значение 1 на кубе.

Есть идеи, как заставить каждый запрос иметь собственный сеанс в Teradata?

Обновление

После некоторого расследования я почти уверен, что где-то в кубе или драйвере базы данных скрыта ошибка. Куб просто игнорирует параметр

Connection Pooling = false;

и выполняет каждую команду SQL в одном сеансе. Итак, я посмотрел, как драйвер обрабатывает пул. Согласно документации, строка соединения используется в качестве ключа при хранении ресурса соединения в пуле. Поэтому, если вы предоставляете другую строку подключения, драйвер обрабатывает такой случай как «новое подключение» и не использует тот, который уже существует в пуле. Теперь у меня есть задача скрипта после каждой итерации, которая «тасует» параметры заданной строки соединения и обновляет соединение в кубе. Это определенно хак, и я не рекомендую это как решение, но отчаянные времена требуют отчаянных мер ...

string dcs = @"Connection Timeout=180;Authentication Mechanism=LDAP;Response Buffer Size=64000;User Id=***;Data Source=my.production.server;Persist Security Info=True;Session Character Set=UTF16;Connection Pooling=False;Connection Pooling Timeout=15;Command Timeout=900";
Random r = new Random();
var shuffled = dcs.Split(';').OrderBy(x => r.Next()).ToArray();
var newCs = string.Join(";", shuffled);
...