【发布时间】:2010-09-27 12:33:46
【问题描述】:
就性能而言,什么更好?
【问题讨论】:
标签: sql database performance
就性能而言,什么更好?
【问题讨论】:
标签: sql database performance
除了已经说过的内容之外,需要考虑的一件事是,选择将通过网络返回比连接可能返回的更多数据。如果网络连接已经成为瓶颈,这可能会使情况变得更糟,尤其是如果经常这样做的话。也就是说,在任何表现不佳的情况下,您最好的选择就是测试、测试、测试。
【讨论】:
如前所述,没有上下文就没有正确答案。
这个问题的答案取决于(从我的脑海中):
【讨论】:
如果您的数据库有大量数据......并且有多个连接,那么请使用索引以获得更好的性能。
如果在这种情况下存在左/右外连接,则使用多选。
这完全取决于您的数据库大小、您的查询、索引(也包括主键和外键)......人们无法对您的问题得出是/否的结论。
【讨论】:
如果您使用的是 SQL Server(我不确定这是否适用于其他 RDBMS),我建议您将执行计划与查询结果捆绑在一起。这将使您能够准确查看查询的执行方式以及导致任何瓶颈的原因。
除非您知道 SQL Server 实际在做什么,否则我不会冒险猜测哪个查询更好。
【讨论】:
不要尝试将自己的连接循环编写为一堆选择。您的数据库服务器有许多巧妙的连接算法。此外,您的数据库服务器可以使用统计数据和估计的访问成本来动态选择连接算法。
数据库服务器的连接算法——通常——比你想出来的任何东西都要好。他们更了解物理 I/O、缓存等等。
这使您可以专注于您的问题领域。
【讨论】:
这完全取决于数据库将如何优化连接以及索引的使用。
我有一个缓慢而复杂的查询,有很多连接。然后我将其细分为 2 或 3 个不太复杂的查询。性能提升是惊人的。
但最终,“这取决于”,你必须知道瓶颈在哪里。
【讨论】:
只有一种方法可以知道:计时。
总的来说,我认为单次连接可以让数据库做很多优化,因为它可以看到它需要扫描的所有表,减少开销,并且可以在本地建立结果集。
最近,我在代码中将大约 100 个选择语句更改为 JOIN。通过几个索引,我能够将运行时间从 1 分钟缩短到大约 0.6 秒。
【讨论】:
单个连接通常会优于多个单个选择。但是,有太多不同的案例适合您的问题。在一个简单的规则下将它们混为一谈是不明智的。
更重要的是,如果您和下一个程序员在使用 SQL 时“说同一种语言”,那么下一个程序员通常更容易理解和修改单个连接。我说的是元组集的语言。
同样重要的是,数据库物理设计和查询设计需要首先关注会导致十比一速度提升的问题,而不是 10% 的速度提升。如果您要进行数千次简单的选择而不是一次连接,您可能会获得十对一的优势。如果您进行三到四次简单的选择,无论哪种方式,您都不会看到很大的改进。
【讨论】: