并行化L2S实体检索

时间:2010-04-24 15:56:05

标签: sql sql-server linq-to-sql domain-driven-design

假设使用SQL Server的典型域实体方法和带有逻辑层的dbml / L2S DAL:

在懒惰加载不是一个选项的情况下,我已经确定了一个约定,其中获取实体列表也不会获得每个项目的子实体(没有加载),但获得单个实体(急切加载)。

由于获得单个实体也会获得子项,因此会产生级联效应,其中每个子项也会获得其子项。这听起来很糟糕,但只要模型不太深,我通常不会发现性能问题超过了易用性的好处。

因此,如果我想获得一个列表,其中每个项目都与孩子完全融合,我结合了GetList和GetItem方法。因此,我将获得一个列表,然后通过它循环获取每个项目的完整级联。即使这在我参与的许多项目中都是可以接受的 - 但我最近遇到了更大模型和/或更多数据需要更高效的情况。

我发现对循环进行分区并在多个线程上执行它会产生出色的结果。在我的第一个实验中,我从一个特定项目获得了50个项目的列表,我做了5个线程,每个项目10个项目,并且在时间上有3倍的改进。

当然,里程将因项目而异,但在其他条件相同的情况下,这显然是一个很大的机会。然而,在我走得更远之前,我想知道其他人已经做过的事情。并行化这类事情有哪些好方法?

1 个答案:

答案 0 :(得分:0)

通常,进行一次返回一组记录的数据库调用会更快。

此记录集可以“保湿”顶级对象,然后另一个记录集可以加载子对象。我不确定你的情况是如何不允许延迟加载的,但是这种方法本质上是延迟加载的,并且肯定比每次多次调用返回单个记录的数据库更快。

您可以对数据库进行异步调用,以便并行运行多个查询。如果将它与模型的每个“层”的第一个策略结合起来,并根据多记录返回集编写一个更复杂的水化函数,您应该看到数据库处理并发连接非常好(这就是为什么你看到的使用多个线程获得的性能提升)。

但是你不需要显式创建线程 - 查看asynchronous methods of一个SqlCommand。