C# 消除性能开销
我已将应用程序中的性能开销缩小到以下模块:C# 消除性能开销,c#,.net,sql,sql-server,database,C#,.net,Sql,Sql Server,Database,我已将应用程序中的性能开销缩小到以下模块: Server currentServer = new Server(databaseConnection.DataSource); Database currentDatabase = currentServer.Databases[databaseConnection.InitialCatalog]; foreach (View view in currentDatabase.Views) { if (view.IsSystemObject
Server currentServer = new Server(databaseConnection.DataSource);
Database currentDatabase = currentServer.Databases[databaseConnection.InitialCatalog];
foreach (View view in currentDatabase.Views)
{
if (view.IsSystemObject == false)
{
if (view.Name.Equals(viewName))
{
MessageBox.Show(parent, "A virtual table with that name already exists! Virtual\ntable not created.", "Not created", MessageBoxButton.OK, MessageBoxImage.Information);
break;
}
else
{
valid = true;
break;
}
}
}
我基本上希望迭代不属于系统的数据库视图。但是,使用这种方法,SMO
库会在所有视图中迭代。你知道怎么安排吗
编辑:
例如,我只有大约10个用户定义的视图,但有1000多个系统视图。如何跳过系统视图并只遍历用户定义的视图?不清楚您使用的是什么API-但是如果您下拉到常规TSQL/ADO.NET,您可以查看类似于
信息\u架构视图/系统视图,它们只包含用户定义的视图。系统视图位于sys.system\u视图中
(两者均位于sys.all\u视图中
)。这将在服务器上执行所有限制,因此,如果您查询信息\u SCHEMA.VIEWS
/sys.VIEWS
,通过连线返回的唯一数据就是您感兴趣的数据。如果在客户端进行筛选,则需要付费传输所有不感兴趣的数据。这不是一个大的性能瓶颈。你在用这些视图做什么。。。这就是慢的部分。@Hogan-我已经添加了完整的代码。系统在这上面花的时间太长了。现在我明白了。还显示了currentDatabase.Views的定义——我猜这就是对server@Hogan-编辑了代码。@HoganViews
这里大概是SMO,它填充了数据库中所有视图的集合(不影响用户视图和系统视图)。谢谢您的建议。所以你建议我忘记SMO库来完成这项任务?@DotNET如果有人带着一个很好的方法来使用SMO,那就好了。我只是说,若并没有好的SMO选项,那个么替代方案就存在了。@DotNET使用编辑过的代码,您需要传输更少的数据-只需要一个存在的测试,所以返回一行。见鬼,你甚至可以使用OBJECT\u ID(@name)
并检查null/not null是的,如果他只是想看看某个名称的视图是否存在,那么查询IMFORMATION\u SCHEMA视图就是最好的选择。从未使用过SMO,所以谁知道呢。谢谢大家,我会研究这个方法。但是,稍后还将执行进一步的操作,即获取所有这些视图的名称。这个方法在这方面也有帮助吗?