Оптимизация выборки данных из таблицы

Ответить
Karen
Сообщения: 12
Зарегистрирован: 20 авг 2021, 10:34
Поблагодарили: 1 раз

Оптимизация выборки данных из таблицы

Сообщение Karen »

Добрый день! Есть необходимость оптимизировать работу с таблицами. Конкретный пример.
Передо мной стоит задача синхронизировать данные по пользователям с корпоративного портала с их учётными записями в Active Directory. Это реализовано, но работает крайне медленно. Что сделано:
1) Реализовано получение данных по пользователям посредством API портала
2) Сборка данных в таблицу (объект DataTable)
3) Связываю я пользователей по уникальному ID, который есть у каждого в его профиле на портале. В связи с этим после 2-го пункта я выдёргиваю всех пользователей из AD, у кого атрибут, в который я помещаю ID заполнен.
4) Получаю разницу между ID пользователей из портала и ID пользователей из AD (массив)
5) Вот тут, собственно, затык в части оптимизации. Очень долго осуществляется выборка и формирование хэш-таблицы (id, samaccountname), с помощью которой я меняю атрибуты пользователей. Каким образом это делается сейчас:
Разница из п. 4 итерируется и на основании свойства ID из таблицы (п. 2) формируется хэш-таблица.
Для сравнения команда:
$table.ForEach({$hashtable.add($_.id,$_.login)}) формирует хэш-таблицу за секунду. Пользователей в $table порядка 5000. У каждого пользователя по 15 атрибутов. То есть мы имеем ~5000 строк и 15 столбцов. Задача сводится к тому, чтобы, например, я из существующей таблицы мог сформировать новый аналогичный объект (таблица), который будет содержать данные в соответствии с фильтрами. В данном примере мне нужно выдернуть из таблицы все строки, у которых значения в колонке ID будут равны значениям из п. 4. Возможно ли сравнивать не по одной, а нескольким колонкам? Спасибо

Аватара пользователя
Fors1k
Администратор
Сообщения: 57
Зарегистрирован: 08 июн 2021, 17:23
Благодарил (а): 4 раза
Поблагодарили: 3 раза

Re: Оптимизация выборки данных из таблицы

Сообщение Fors1k »

Привет. Так на воображении тяжело представить полную картину задачи)
Может ты сможешь дать две условные таблицы (массив, если нужен), и на их примере объяснишь что нужно сделать?

Аватара пользователя
Fors1k
Администратор
Сообщения: 57
Зарегистрирован: 08 июн 2021, 17:23
Благодарил (а): 4 раза
Поблагодарили: 3 раза

Re: Оптимизация выборки данных из таблицы

Сообщение Fors1k »

Пока вот, на сколько я понял, выборка по значением нескольких столбцов:

Wake up, Neo, select all

cls
# Создание тестовой таблицы
$dataTable = [System.Data.DataTable]::new()

$columns = @(
[System.Data.DataColumn]::new("id", [int])
[System.Data.DataColumn]::new("name", [string])
[System.Data.DataColumn]::new("number", [int])
)

$columns|ForEach{$dataTable.Columns.Add($_)}

$dataTable.Rows.Add(1, "John", 500)|Out-Null
$dataTable.Rows.Add(2, "Bob", 700)|Out-Null
$dataTable.Rows.Add(3, "Mike", 800)|Out-Null
$dataTable.Rows.Add(4, "James", 900)|Out-Null

# Выборка
$ids = 1, 2, 3
$names = @(
"John"
"Bob"
)

$dataTable|Where{$_.id -in $ids -and $_.name -in $names}

Запись с id равным 3 не будет выбрана, так как колонка name не будет удовлетворять условию.

Karen
Сообщения: 12
Зарегистрирован: 20 авг 2021, 10:34
Поблагодарили: 1 раз

Re: Оптимизация выборки данных из таблицы

Сообщение Karen »

Да, то, что нужно, спасибо!)

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей