2011-04-25 104 views
2

我想知道从大型数据库查询数据的最佳方法是哪一种。查询效率

假设我有一个要求,要求获得所有居住在美国的用户以及他们的订单和属于他们订单的产品的列表。为了简单起见,我们有一个user表,其中CountryId在该表中...然后Order表,userId ..然后可能是一个OrderProduct表,以列出许多产品到一个订单(许多订单可以包含相同产品)。

我的问题是,这将是更好地通过

SELECT userId FROM dbo.User WHERE countrId = @CountryId 

我们现在在一个临时表中的相关用户可能创建一个临时表。

然后,做一个

Select p.ProductDescription ... 
From @TempTable tmp 
INNER JOIN Order o 
ON o.UserId = tmp.UserId 
INNER JOIN OrderProduct op 
ON op.OrderID = o.OrderId 
INNER JOIN Product p 
ON p.ProductId = op.ProductId 

那么,什么我做的是让我需要的用户....动人的是到一个临时表,然后使用该临时表来筛选的数据主要查询。

或者,是高效,如果不是更多,只是做这一切在一个...

Select ... from User u 
INNER JOIN Order o 
.... 
WHERE u.UserId = @UserId 

+0

一体化效率最高。 – Arvo 2011-04-25 07:12:21

+0

如果您发布代码,XML或数据样本,**请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(“{}”)以精确地格式化和语法突出显示它!如果您发布错误信息,请** **使用引用文字('“')格式正确的错误消息。 – 2011-04-25 07:36:48

回答

5

一般而言,您希望在一个查询中编写整个请求,因为这样可以使数据库查询优化器获得最有效的可能性。有了一个体面的数据库,它通常会在这方面做出出色的工作,而且任何帮助它的努力都会比帮助更容易受到伤害。

如果数据库速度不够快,首先要考虑是否有正确的索引,调整数据库等。这些是导致问题的最常见原因,应该及时清除大部分剩余问题。

只有在您给了数据库每个以正确的方式得到正确答案的机会之后,才应该考虑尝试使用临时表来强制执行特定的查询计划。 (还有其他原因需要使用临时表,但为了获得好的查询计划,这应该是最后的手段。)

有一对关于优化的旧规则,适用于黑桃。

  1. 不要。
  2. (仅限专家使用)尚未。
+0

+1 ...完全一致 – 2011-04-25 08:16:09

1

您可以创建一个包含所需数据的view

视图中创建这样的:

CREATE VIEW view_name AS 
SELECT column_name(s) 
FROM table_name 
WHERE condition 

然后,您可以查询您创建就像你查询的表视图。