【问题标题】:How to optimize netTiers data access performance?如何优化 netTiers 数据访问性能?
【发布时间】:2020-10-15 14:13:48
【问题描述】:

我们的环境使用 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-server vb.net .nettiers


    【解决方案1】:

    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 更流畅的计划被取消了。

    【讨论】:

    • 不会是“Select * From History Order by ModifiedDateTime desc”吗?我以为 MS SQL 仍然会使用索引而不是建立一个临时索引。
    • 不,整个SQL调用都封装在GetAll方法中。 orderby 是返回所有数据后在 .net 中运行的 Linq。
    • 哦,好的,谢谢您的解释和建议。现在这是有道理的。我真的更喜欢只使用 SQL 语句来访问数据,但这不是他们做事的方式。
    • netTiers 具有从数据库自动生成以及面向对象的编译时安全性的优势。如果您重命名数据库中的表或列,您的代码将不会在生成后编译;如果您只是使用纯 sql 语句,您永远不会知道并且您的代码最终会在客户端中断,这就是 netTiers 的优势。但是,nettiers 确实有一个 sql 字符串的传递选项:Provider.ExecuteNonQuery(System.Data.CommandType.Text, "sqlquery")
    • 明确地说,我不建议使用 ExecuteNonQuery 来传递文本查询。你绕过了很多安全层来做这件事。我唯一能想到自己编写原始 sql 查询的情况是,如果您正在尝试为一个结构可能会改变您的数据库编写代码。
    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2011-06-14
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多