1
3
我建议您实际构建最容易维护的方式(“标准”父/子设置),并在上面运行一些基本基准。 您会惊讶于数据库引擎如何使用正确的索引,特别是如果您的数据集可以放入内存中。 假设每个组有6个属性,2000个组和30个字节/属性,您所说的是360kb*预期的项目/组——图400kb。如果您希望拥有1000个项目/组,那么您只需要查看400MB的数据——这些数据可以在内存中毫无问题地容纳,而且数据库是 快速的 当所有数据都在内存中时在联接处。 |
2
2
公共表表达式将让您得到具有父子关系的组的列表。 Here 是将CTE用于其他应用程序的存储过程示例。它相当有效,但要注意以下注意事项:
Oracle的Connect By比CTE更灵活,因为它对查询结构的限制并没有CTE那么多,但是如果您使用的是SQL Server,这将不是一个选项。 如果您需要对中间结果做一些巧妙的工作,那么就编写一个存储过程,该存储过程使用CTE将原始查询获取到一个临时表中,并从中对其进行处理。选择“进入”将最小化由此产生的流量。结果表将在缓存中,因此对它的操作将相当快速。 一些可能的物理优化可以帮助:
父属性类型属性编码表不能很好地处理CTE,因为如果包含属性表,则在行计数中会出现组合爆炸。这将排除查询中过滤属性的任何业务逻辑。 最好直接将属性存储在BOM表条目上。 |
3
1
预排序树遍历非常方便。通过使用触发器使遍历数保持最新,可以使其保持健壮。 我使用的一种类似的技术是保存一个单独的表(祖先_id,后代_id),其中列出了所有的祖先和后代。这几乎和预先排序的遍历数一样好。 使用单独的表很方便,因为即使它引入了额外的联接,也会将复杂性消除到单独的表中。 |
4
1
修改后的预订单本质上是JoeCelko的嵌套集方法。他的书“树和等级……”涵盖了邻接列表和N,并描述了各自的优缺点。通过适当的索引,邻接表的CTE得到了最平衡的性能。如果你主要是为了阅读,那么ns会更快。 你所描述的似乎是一个物料清单处理器。虽然不是百万美元,但Graeme Birchall有一本免费的DB2书籍,其中有一章是关于使用CTE进行层次结构处理的(语法实际上是相同的,IIRC,因为ANSI语法采用了DB2,然后采用了M美元): http://mysite.verizon.net/Graeme_Birchall/cookbook/DB2V95CK.PDF |
Duvan · 将逗号(,)替换为点(.)[副本] 2 年前 |
Mateen Bagheri · 选择表的计数并选择其自身 2 年前 |
SoT · SQL Server中求和函数的工作方式 2 年前 |
NKAT · 将列值聚合到列表中会产生错误 2 年前 |
deanpillow · 返回两列中有一个匹配值的记录 2 年前 |
snowflakes74 · 在Dapper中异步查询多个结果 2 年前 |