多个查询以避免连接?

时间:2009-02-28 16:50:11

标签: sql linq-to-sql

我注意到,只要我在一些查询中添加了连接,执行这些操作所花费的时间就不仅仅是完成多个查询。

时间包括页面加载和平均超过20页的加载。

没有加入的7-9查询
159ms

带有2个连接的3个查询
235ms

我是否应该继续使用多个查询而不是连接,因为它们似乎对性能有如此显着的影响?我甚至可以优化多重查询方法,因为在这些测试期间我甚至懒得加载。

修改

为了这个问题,我会创建一些虚假信息。

表格对象
ID(int,identity,PK,聚集索引)
UserID(int,nonclustered index)
CategoryID(int,nonclustered index)

表用户
ID(int,identity,PK,聚集索引)

表类别
ID(int,identity,PK,聚集索引)

非常简单。它是Objects表上的双内连接查询。分别查询所有3个似乎比连接更快。

连接的查询计划显示42%完成了2次聚簇索引搜索,23%是聚簇索引扫描,其余是前N级排序。

6 个答案:

答案 0 :(得分:5)

如果你无缘无故地加入,请确定。通常,您加入表格的原因是能够提取相关数据并进行处理。您上面的问题也没有考虑到您需要将这些数据重新组合在一起的编程时间(可能通过循环结构或类似的东西)。

查询分析应该是这里的第一步。我对你的SQL风格并不是很熟悉,但它可能就像EXPLAIN一样。

如果我不得不根据我在这里提供的有限信息给出一个可能的罪魁祸首,那就是缺少索引。您加入的字段是否正确编入索引?这可以获得巨大的性能提升。第二,你加入了适当的领域吗?例如,如果您将两个字符串连接在一起,那么您的性能将比加入整数或其他优化字段更糟糕。

答案 1 :(得分:4)

不,你应该试着改用其他方式。您应该尝试尽可能少的查询。如果操作正确,那就是最快的。

检查表格上是否有正确的索引。例如,对于这样的查询:

select a.Some, b.Other
from TableA a
inner join TableB b on b.Id = a.Id

您应该确保TableB.Id字段上有索引。表的主键通常默认获取索引,但您必须自己创建其他索引。

答案 2 :(得分:2)

我建议您查看实际的查询计划,并了解回复的不同之处。也许它会强调一个表扫描建议,或许添加一个索引?

进行连接更加昂贵。这并不意味着你不应该使用它们。

有助于查看您正在编写的SQL ...(由LINQ to SQL生成)

答案 3 :(得分:1)

您是否尝试通过分析器使用联接运行查询,以查看是否有任何优化措施?

答案 4 :(得分:1)

如果您运行这些只是为了在查询分析器中获取数据,那么多个查询就可以了,但如果您从Web应用程序或控制台应用程序运行它们,那么您将需要优化为1个查询。即使花费的时间稍长,您也会看到性能提升,因为您不会多次访问数据库。击中数据库的次数越少,前端性能就越好。我会努力重新做你的查询只有一个。看起来您的表已经标准化并且索引足够多,您应该能够将其归结为一个查询。

答案 5 :(得分:0)

我会尝试摆脱所有典型的联接。例如,我想修改:

select t1.id, t1.name, t2.gpa from t1 join t2 on t1.id =t2.id 

由此:

select t1.id, t1.name, t2.gpa from t1, t2 where t2.id = t1.id