有没有办法加快 SQL Server 管理对象对现有数据库的遍历速度?
-
03-07-2019 - |
题
我目前正在使用 SMO 和 C# 遍历数据库来创建代表两个数据库各个方面的设置树,然后比较这些树以了解它们在何处以及如何不同。
问题是,对于 2 个大小合理的数据库,在本地抓取它们并收集我想要比较的表/列/存储过程信息需要几乎 10 分钟。
有没有比 SMO 更好的接口来以这种方式访问数据库?我不想包含任何额外的依赖项,但为了将速度提高 50%,我会承受这种痛苦。下面是我如何枚举表和列的示例。
Microsoft.SqlServer.Management.Smo.Database db = db_in;
foreach (Table t in db.Tables)
{
if (t.IsSystemObject == false)
{
foreach (Column c in t.Columns)
{
}
}
}
解决方案
尝试强制 SMO 一次读取所有必填字段,而不是在访问时查询。看 这个博客 了解更多信息
编辑:链接已失效,但我找到了 这一页 在 archive.org 上。这是相关代码:
Server server = new Server();
// Force IsSystemObject to be returned by default.
server.SetDefaultInitFields(typeof(StoredProcedure), "IsSystemObject");
StoredProcedureCollection storedProcedures = server.Databases["AdventureWorks"].StoredProcedures;
foreach (StoredProcedure sp in storedProcedures) {
if (!sp.IsSystemObject) {
// We only want user stored procedures
}
}
其他提示
几乎没有什么是您无法通过 TSQL 查询获得的。以这种方式获取元数据通常非常快。
不隶属于 StackOverflow