Лучшее, что вы можете сделать, - это запланировать периодический экспорт интересующих вас данных AD в таблицу.
Таблица, конечно, может иметь все индексы, которые вам нравятся. Если вы запускали экспорт каждые 10 минут, и возможность получения данных, которые устарели на 9 минут и 59 секунд, не является проблемой, тогда ваши запросы будут молниеносными.
Единственная часть проблемы будет связана с управлением блокировками и параллелизмом во время экспорта. Одна из стратегий может состоять в том, чтобы экспортировать данные в новую таблицу, а затем переименовать и заменить их. Другой может быть использование SYNONYMs (SQL 2005 и выше), чтобы сделать нечто подобное, когда вы просто указываете SYNONYM на две чередующиеся таблицы.
Данные, которые обеспечивают выполняемый вами запрос, поступают из совершенно другой системы за пределами SQL Server. SQL Server не может создать индексированное представление для данных, которые ему не принадлежат. Для начала, как он будет уведомлен, когда что-то было изменено, чтобы он мог обновить свои индексы? Должен существовать некоторый механизм уведомлений и обновлений, что неправдоподобно, поскольку SQL Server не может разумно поддерживать ACID для такой распределенной, медленной, не SQL-транзакции сервера во внешнюю систему.
Таким образом, мое предложение подражать таким вещам через ваши собственные запланированные задания, которые обновляют данные каждые X минут.
- Ответ на ваш комментарий -
Невозможно определить, был ли добавлен новый пользователь, без запроса. Если Active Directory поддерживает какой-то API, который генерирует события, я никогда не слышал об этом.
Но каждый раз, когда вы запрашиваете, вы можете хранить наибольшее время создания всех пользователей в таблице, а затем с помощью динамического SQL запрашивать только новых пользователей с датой создания после этого. Этот запрос теоретически должен быть очень быстрым, поскольку он будет передавать очень мало данных по проводам. Вам просто нужно посмотреть, каким будет точное поле AD для даты создания пользователя и синтаксис условий для этого поля.
Если управление динамическим SQL было слишком сложным, очень простое приложение vbscript, VB или .Net также могло бы запросить у вас активный каталог по расписанию и обновить базу данных.