【问题标题】:What is a productive / efficient way to query a table with repeating fields using T-SQL?使用 T-SQL 查询具有重复字段的表的高效/高效方法是什么?
【发布时间】:2011-11-13 00:23:38
【问题描述】:

我有一个这样的表(简化):

Lender
   Id (PK)
   AgencyCode1
   AgencyCode2
   AgencyCode3...
   AgencyCode20

Agency
   AgencyCode
   AgencyName

贷方表是来自报告视图的非规范化数据。对于每个贷方,我的输出中需要一行,并且我需要将代理代码加入代理表以获取每个代理的显示名称。

我在每一行中寻找的结果输出是:

LenderId, AgencyCode1, AgencyName1, ... AgencyCode20, AgencyName20

在查询此类内容时,在性能和(开发人员)生产力之间取得最佳平衡的模式是什么?

--编辑,机构代码不是主键,正如我最初指出的那样。

【问题讨论】:

  • UNPIVOT 然后PIVOT 我想。
  • 但是你使用这个视图吗?
  • 我差不多。它是存储在表中的已处理数据,用于导出。表格/视图比我在示例中提供的要多得多。
  • Pivot 和 Unpivot 是标准 SQL 的一部分吗?如果我可以将它们作为我武器库的长期组成部分,我会更倾向于使用它们。
  • 不知道。如果没有,可以使用CASE 轻松复制 Pivot。 UNPIVOT 可以模拟,但效率不高。

标签: sql sql-server tsql join denormalization


【解决方案1】:

与@Martin Smith 的评论相呼应,unpivot、join 和 pivot 可能是最有效的、最明智的 - 并且,通过解决如何 unpivot 和 pivot 的复杂性,您的开发人员会更有经验,从而更有效率随着时间的推移。

或者,如果有 20 个并且总是 20 个非规范化列,您可以只写出 20 个左外连接(假设 Lender 与 20 个代理机构无关)。这是丑陋的代码,需要 SQL 来处理 20 个连接...但如果 Agency 表很小(我称之为 8 pages/1 extent small),那么整体处理时间可能相对较短。需要进行测试,以确定哪个性能最好。

关于开发人员的整体生产力,请跟踪一切需要多长时间(包括发布到 SO)。完成后,汇总所有内容,并用它来显示您的开发人员不得不使用设计不佳的表格浪费了多少时间。

【讨论】:

  • 第一个表中可能有 600K+ 行,第二个表中可能有 16K+ 行 =)
  • 啊,但是行有多宽?保存数据需要多少磁盘空间/RAM?你能用一个覆盖指数吗?如果性能很关键,您可以采取许多技巧来加快速度,而磁盘 I/O 是最常见的瓶颈。
猜你喜欢
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
相关资源
最近更新 更多