Атрибут IsSystemObject объекта Smo
Я получаю список хранимых процедур из базы данных с помощью SMO. У меня есть цикл foreach над хранимыми процедурами, чтобы выполнять намеченные операции. Однако мне нужно использовать только созданные пользователем хранимые процедуры. Я использую атрибут IsSystemObject хранимых процедур. Однако это так медленно:
Примерно 10 сек:
foreach (StoredProcedure mystr in mydb.StoredProcedures)
{
if (!mystr.IsSystemObject)
{
classGenerated += mystr.Name + Environment.NewLine;
}
}
Менее 1 секунды:
foreach (StoredProcedure mystr in mydb.StoredProcedures)
{
classGenerated += mystr.Name + Environment.NewLine;
}
Является ли эта разница нормальной только для одного условия? Если нет, то в чем причина такой разницы в производительности? Я могу использовать другой способ разграничения системных и несистемных объектов, если есть другой метод.
1 ответ
Ага. И вот почему. SMO предварительно выбирает определенные свойства по умолчанию и оставляет другие как раз вовремя. Таким образом, вы по сути получаете вызов для каждой процедуры, чтобы выяснить, является ли это системной процедурой или нет. К счастью, есть исправление. Проверьте эту статью BOL
Оптимизация SMO позволяет загружать только минимальные свойства при создании объекта. При обращении к неинициализированным свойствам SMO делает отдельные запросы на загрузку информации из экземпляра SQL Server. Вы можете использовать этот метод, чтобы настроить, какие свойства инициализируются для объекта при его первом создании, для дальнейшей оптимизации производительности.