从多个表中进行多个选择或从所有表中选择所有数据是否更好?

时间:2012-07-23 17:31:27

标签: sql sql-server

我有多个表可以通过连接查询数据。

关于数据库性能:

我应该从多个表中为所需数据运行多个选择吗?

我应该写一个选择使用一堆联接来一次从所有表中选择所需的数据吗?

编辑:

我将用于select的where子句包含表的Indexed字段。听起来就是这样,使用带有许多连接的1个select语句会更快。不过,我仍会测试2之间的性能差异。

感谢所有出色的答案。

5 个答案:

答案 0 :(得分:4)

这可能是其中之一,非常依赖,但通常如果您正在编写SQL,请执行一次查询 - 特别是因为连接可能会限制您获得的某些数据。

如果您对每个表中的一个记录执行多个点查询,则很有可能,如果您使用表的主键进行查找,则每个查询的连接成本将比实际查询更昂贵。

答案 1 :(得分:4)

只需用连接写一个查询。如果您担心性能,有很多选择,包括:

  • 创建有助于提高选择效果的索引
  • 创建所需数据的持久非规范化形式,以便查询一个表。这很可能是索引视图或另一个表。

答案 2 :(得分:3)

这取决于表的连接方式。如果你做所有表的交叉产品,那么最好做个别选择。但是,如果您的表被正确编入索引并仔细考虑过,那么具有多个选择的查询将更有效。

答案 3 :(得分:3)

如果您的表上有适当的索引,那么使用JOIN可能会更好,但它们通常会导致瓶颈。您可以查看取消规范化数据的方法,而不是多次选择。当用户执行更新多个表中的计数或时间戳的操作时,它远不那么“昂贵”,这会阻止您必须加入这些表。

我找到的用于查询性能调优的最佳工具是使用EXPLAIN。在查询之前键入EXPLAIN,您可以看到扫描的行数。您的目标是数字越低越好,这意味着您的索引正在运行。另一件事是在创建索引时,在多个字段上使用复合索引,并按照它们在WHERE子句中出现的顺序从左到右排序。

例如,您在sometable中有10,000行:

SELECT id, name, description, status FROM sometable WHERE name LIKE '%someName%' AND status = 'Active';

您可以在查询之前键入EXPLAIN,并且可能会返回10,000作为扫描匹配的行数。然后创建复合索引:

ALTER TABLE sometable ADD INDEX idx_st_search (name, status);

然后再次对表执行EXPLAIN,当扫描的行数和性能显着提高时,它可能会返回1。

答案 4 :(得分:1)

取决于您的桌面设计。

大多数情况下,一个大型查询更好,但一定要

  • 尽可能多地使用where子句中的主键进行连接。

  • 使用索引字段或为where子句中使用的字段创建索引。