Aar*_*ght 8 database performance search database-design hierarchy
我现在正处于升级主要交易系统中层次结构设计的最后阶段,我一直在这150行查询中盯着看(我将免除你阅读的所有单调)并认为那里必须是一个更好的方式.
该问题的快速摘要如下:
我发现了一个有点相关的问题,但它实际上只有我实际需要的答案的20%左右.这是完整的场景/规范:
hierarchyid(物化路径),索引广度优先和深度优先.每个层次结构节点/记录都有一个Name要查询的列.基于节点的层次结构查询非常快,所以不要担心这些.我的"梦想"是向用户提供即时反馈,如渐进式搜索/过滤器,但我知道这可能是不可能的或非常困难的.我对当前方法的任何重大改进感到满意,通常需要0.5s到1s,具体取决于结果的数量.
为了完整起见,现有查询(存储过程)首先收集包含最终项的所有叶节点,然后向上连接并排除其路径与先前项不匹配的任何路径.如果这对任何人来说都是落后的,那么请放心,它比从根源开始并散开更有效率.这是"旧的"方式,每次搜索可能需要几秒钟.
那么我的问题是: 是否有更好(更有效)的方式来执行此搜索?
我不一定在寻找代码,只是方法.我考虑了一些可能性,但它们似乎都有一些问题:
NamePath实际上是嵌套字符串序列的列,使用CLR类型,类似于hierarchyid它自己.问题是,我不知道微软如何能够将这种类型的查询"转换"为索引操作,我甚至不确定是否可以在UDT上进行.如果最终结果只是一个完整的索引扫描,我通过这种方法得不到任何结果.如果我不能做得比现有的更好,那真的不是世界末日; 搜索"非常快",没有人抱怨它.但我愿意打赌有人之前已经解决了这个问题,并且有一些想法.请分享!
看看 Apache Lucene。您可以使用 Lucene 实现非常灵活且高效的搜索。它可能有用。
另请查看搜索模式 - 您所描述的内容可能适合分面搜索模式。
实现一个简单的“Aaron House Living Door”算法非常容易,但不确定基于常规 SVM/分类/熵的算法是否可以扩展到大型数据集。您可能还想了解 Motwani 和 Raghavan 的“近似搜索”概念。
如果可能的话,请发回您发现的内容:-)