查询效率

时间:2011-04-25 06:42:41

标签: sql sql-server

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

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

我的问题是,或许可以通过

创建一个临时表
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

2 个答案:

答案 0 :(得分:5)

通常,您希望在一个查询中编写整个请求,因为这为数据库查询优化器提供了最有效的可能性。有了一个像样的数据库,它通常会在这方面做得很好,而你所做的任何努力都会比帮助更容易受伤。

如果数据库速度不够快,首先要研究一下你是否拥有正确的索引,调整数据库等等。这些是导致问题的最常见原因,应该能够及时清除大部分遗留问题。

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

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

  1. 别。
  2. (仅限专家。)尚未。

答案 1 :(得分:1)

您可以创建一个view来保存您需要的数据。

视图的创建方式如下:

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

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