Добрый день! Есть необходимость оптимизировать работу с таблицами. Конкретный пример.
Передо мной стоит задача синхронизировать данные по пользователям с корпоративного портала с их учётными записями в 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
- Администратор
- Сообщения: 57
- Зарегистрирован: 08 июн 2021, 17:23
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
Re: Оптимизация выборки данных из таблицы
Пока вот, на сколько я понял, выборка по значением нескольких столбцов:
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 не будет удовлетворять условию.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость