【问题标题】:Removing performance overhead消除性能开销
【发布时间】:2013-03-06 12:15:18
【问题描述】:

我已将应用程序中的性能开销缩小到此块:

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 个系统视图。如何跳过系统视图并仅遍历用户定义的视图?

【问题讨论】:

  • 这不是一个很大的性能瓶颈。你在用视图做什么......这是缓慢的部分。
  • @Hogan - 我已经添加了完整的代码。系统在这方面花费的时间太长了。
  • 啊。现在我明白了。还要显示 currentDatabase.Views 的定义——我猜这是花时间查询服务器的地方
  • @Hogan - 编辑了代码。
  • @Hogan Views 这里大概是 SMO 的 Database.Views Property,它填充了数据库中所有视图的集合(不影响用户视图和系统视图)。

标签: c# .net sql sql-server database


【解决方案1】:

不清楚您使用的是什么 API - 但如果您下拉到常规 TSQL / ADO.NET,您可以查看诸如 INFORMATION_SCHEMA.VIEWS / sys.views 之类的内容,它们仅包含用户定义的视图。系统视图位于sys.system_views 中(两者都位于sys.all_views 中)。这将在服务器上完成所有限制,因此如果您查询INFORMATION_SCHEMA.VIEWS / sys.views,唯一通过网络返回的数据就是您感兴趣的数据如果您在客户端进行过滤,您需要付费以传输所有您感兴趣的数据。

【讨论】:

  • 感谢您的建议。所以你会建议我忘记这个任务的 SMO 库?
  • @DotNET 如果有人回来用 SMO 做这件事的好方法,那很好。我只是说,如果没有好的 SMO 选项即将推出,则存在替代方案。
  • @DotNET 使用编辑后的代码,您需要传输 更少 数据 - 只需一个 EXISTS 测试,因此返回一行。哎呀,您甚至可以使用 OBJECT_ID(@name) 并检查 null / not-null
  • 是的,如果他只是想查看名称的视图是否存在,则可以查询 IMFORMATION_SCHEMA 视图。从未使用过 SMO,所以谁知道呢。
  • 谢谢大家,我会研究这种方法。然而,稍后还将执行进一步的操作,即获取所有这些视图的名称。这种方法在这方面也有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2016-12-19
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2018-07-26
  • 1970-01-01
  • 2013-02-24
相关资源
最近更新 更多