创建高效(动态)数据源以支持自定义应用程序网格视图

时间:2018-01-09 20:19:12

标签: sql-server tsql

在我正在处理的应用程序中,我们拥有能够显示数据自定义视图的数据网格。作为参考,我们使用SharePoint中存在的视图概念来建模此功能。

自定义视图应具有以下功能:

  • 能够定义哪些列的子集(那些列的子集) 应该显示在视图中。
  • 能够定义一个或 更多用于检索数据的过滤器。这些过滤器不受约束 仅使用结果集中的列但必须使用一列 可用列的。标准逻辑条件和运算符 适用于这些过滤器。例如, ColumnA Equals Value1 ColumnB> = Value2
  • 能够定义数据将按其排序的一组列。这组列可以是一列或多列 来自将在结果集中返回的列集。
  • 成为 能够定义数据将按其分组的一组列。 这组列可以是一组中的一列或多列 将在结果集中返回的列。

我有应用程序代码,它将动态生成必要的SQL以检索适当的数据集。但是,它似乎表现不佳。当我遇到性能不佳的查询时,我的第一个想法是确定索引可能有用的位置。这里的问题是我不一定知道需要创建哪些索引,因为底层查询可以用许多不同的方式检索数据。

基本上,当前使用的SQL执行以下操作:

  • 创建临时表变量以保存过滤后的数据。此表包含应在结果集中返回的每列的列。
  • 将与过滤器匹配的数据插入表变量。
  • 查询表变量以确定数据的总行数。
  • 如果请求,使用指定的分组列确定表变量中数据的分组值。
  • 从表变量返回所请求页面大小的数据的请求页面,按任何指定的排序列排序。

我的问题是,我可以通过哪些方式改进这一过程?例如,我的一个想法是让我的表变量只包含用于分组和排序的数据列,然后在末尾加入源表以获取其余显示的数据。我不确定这是否会产生任何差异,这就是这篇文章的原因。

除了SQL Azure之外,我还需要支持SQL Server 2014,2016和2017版本。基本上,我将无法使用SQL Server版本的特定功能,除非该功能在所有上述平台中都可用。

1 个答案:

答案 0 :(得分:0)

(这不是真的"答案" - 我只是无法添加评论,因为我的声誉评分还不够高。)

我认为您的一般方法很好 - 基本上您正在为SQL创建GUI生成器。但是有一些事情:

  1. 此类功能最适合仓库或只读副本数据库。不要在实时生产事务数据库上构建它。有一些排列,您没有想到您的用户会发现会破坏您的数据库(从仓库的角度来看也是如此,但他们通常没有作为交易的响应时间预期数据库)
  2. 从数据库的角度来看,您描述的进行分页的方法效率不高。您实际上是多次查询,过滤,分组和排序相同的精确数据集,以便每次都选择几行。如果您已缓存数据,那可能没问题,但您不应该做出这样的假设。如果您具备相关知识,请弄清楚如何使用额外列对整个最终数据集进行快照,以使数据按照用户请求的顺序进行物理排序。这样,您就可以快速查询分页结果。
  3. 如果您有一个Repository / DAL层,请设计您的解决方案,以便将来某些表/列组合可以使用硬编码查询/存储过程。不可避免地会出现一些导致性能问题的查询,您可能必须为特定查询构建自定义解决方案,以便获得动态sql无法获得的所需性能