首页 > 解决方案 > 如何优化 netTiers 数据访问性能?

问题描述

我们的环境使用 netTiers 创建的类来访问在 VB.net 应用程序中访问的 MS SQL 表。

通过在选定的数据库列上添加“GetBy”方法,我成功地加快了几个查询。

但是,我为不使用键的数据访问创建了索引。例如,我正在按日期降序查询历史文件,而且速度很慢。大约 12 秒的响应时间。我在降序的列上创建了一个索引,它根本没有给我带来任何性能提升。

我对整个 netTiers、数据类方法比较陌生,不知道下一步该去哪里解决这个问题。

这是我如何访问数据的示例。第一次得到历史时有很长的延迟。我相信它正在建立一个索引,但它不应该是因为已经有一个索引。

    For Each hist In HistoryProviderService.GetAll().OrderByDescending(Function(x)  x.ModifiedDateTime).ToList()

        ' do stuff with hist

    Next

这是索引的代码

    SET ANSI_PADDING ON
    GO

    CREATE NONCLUSTERED INDEX [IX_History_ModifiedDateTime] ON [Common].[History]
        (   [ModifiedDateTime] DESC,
            [ModificationType] ASC
        )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
    ON [PRIMARY]
    GO

非常感谢您提供的任何见解。

标签: sql-servervb.net.nettiers

解决方案


GetAll 方法等价于:“Select * From History”。没有索引可以加快速度。

如果您需要历史表中的每一行,您可以尝试将其缓存起来,甚至为此目的在 netTiers 中内置了几个缓存功能。但是,如果您不需要该表中的所有数据,我建议您先过滤到您实际需要的数据。

以下是实现此目的的两个选项:

// use the dynamic find method that will parse the simple string you send in and turn it into a parameterized query.  This method can only handle simple constraints like equals.
new HistoryProviderService().Find("ColumnToFilterBy=ValueToConstrainTo").OrderBy(...

// build a more complex filtering query
var filter = new Namespace.Data.HistoryProviderQuery();
filter.AppendIn(HistoryProviderColumn.ColumnToFilterBy, ValueCsvToConstrainTo.Split(',');
TList<HistoryProvider> rows = new HistoryProviderService().Find(filter);

还可以选择为自己构建一个自定义存储过程,如果命名正确,netTiers 会将其作为 HistoryProviderService 上的一个方法拾取并返回表行的 TList。

重要的是要记住,您在 *Service() 类中调用的第一个方法将构建并执行一条 SQL 语句,并且您希望该语句尽可能高效地获取您需要的所有数据,但不是如果可能的话,一堆额外的数据。与 Entity Framework 等数据访问层不同,netTiers 不是围绕流畅的设计构建的;所以第一种方法对于过滤查询非常重要。当 Entity Framework 出现时,让 netTiers 更流畅的计划被取消了。


推荐阅读