加快递归SQL请求的性能
我有so类别,这个类别有无限子类别。 在数据库表中,字段是ID、UpperID和Title 如果我在程序(ASP.NET项目)中使用递归方法调用DataTable中的类别及其子类别 表现很差。 很多用户都会使用这个应用程序,所以一切都会变糟。 也许所有类别都填充到一个缓存对象,然后我们就不能进入数据库。 但分类数是15000或20000。 所以我认为这不是一个好方法 我能为快速性能做些什么?加快递归SQL请求的性能,sql,caching,recursion,Sql,Caching,Recursion,我有so类别,这个类别有无限子类别。 在数据库表中,字段是ID、UpperID和Title 如果我在程序(ASP.NET项目)中使用递归方法调用DataTable中的类别及其子类别 表现很差。 很多用户都会使用这个应用程序,所以一切都会变糟。 也许所有类别都填充到一个缓存对象,然后我们就不能进入数据库。 但分类数是15000或20000。 所以我认为这不是一个好方法 我能为快速性能做些什么? 你有什么建议吗?缓存或其他内存持久性比在关系系统上执行此操作要好得多:)。。。嘿哎呀 就我的2美分 例如
你有什么建议吗?缓存或其他内存持久性比在关系系统上执行此操作要好得多:)。。。嘿哎呀 就我的2美分 例如 瞧。。。你的树准备好了 编辑:
你知道你的表现瓶颈在哪里吗 给你一些想法,例如:
- 从数据库加载
- 构筑结构
- 查询结构
然后,您应该加载一次,并确保有一些更改跟踪/通知来获取更改(如果进行了更改)或优化您的查询 构建结构:
创建树(遍历部分)的方法是使用
字典所能做的最浪费的方法
查询结构:
我在示例中使用的结构比List
更快Dictionary
在键上使用索引-因此您可以对键(ID)使用int
编辑:
所以您使用DataTable来修复
问题现在你有两个问题:我
和数据表
你现在有什么?你从哪里开始?你能确定你的泥坑在哪里吗?给我们密码 谢谢大家
我用公共表表达式(CTE)找到了我的解决方案。
它允许快速递归查询
WITH CatCTE(OID, Name, ParentID)
AS
(
SELECT OID, Name, ParentID FROM Work.dbo.eaCategory
WHERE OID = 0
UNION ALL
SELECT C.OID, C.Name, C.ParentID FROM Work.dbo.eaCategory C JOIN CatCTE as CTE ON C.ParentID= CTE.OID
)
SELECT * FROM CatCTE
给我们您的sql stmt:)确实可以共享您的查询,也可以创建递归查询。还要告诉我们您使用的是哪种DMB?您需要计算一下-有多少用户?类别对象在内存中有多大?你有多少可用内存?这个瓶颈有多大?您使用的是每用户线程模型吗?如果是这样的话,有没有一种方法可以构建一个单一实例的持久缓存,也许可以通过在同一台机器上构建一个伴随服务并通过一个快速进程间通信层连接到它?@mike:category的模式非常清楚,正如他在问题中所说:ID,UpperID,Title
。我不确定这是否一定能告诉您内存中的东西是如何运行的,但我想这取决于您缓存的内容,这是很公平的。不管怎样,这是拼图中最小的一块。如果你有100000000个用户,可能不管你的对象有多小,如果你为每个用户缓存每个值的一个实例,你就会遇到问题。谢谢,但是我的代码就像你的代码一样。我有20000个分类记录和许多用户。所以我的问题是速度。我寻找最好的表现。
WITH CatCTE(OID, Name, ParentID)
AS
(
SELECT OID, Name, ParentID FROM Work.dbo.eaCategory
WHERE OID = 0
UNION ALL
SELECT C.OID, C.Name, C.ParentID FROM Work.dbo.eaCategory C JOIN CatCTE as CTE ON C.ParentID= CTE.OID
)
SELECT * FROM CatCTE