繁体   English   中英

查询效率

[英]Query efficiency

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

假设我需要获取居住在美国的所有用户的所有列表,以及他们的订单和属于他们的订单的产品。 为简单起见,我们有一个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 

通常,您希望在一个查询中编写整个请求,因为这使数据库查询优化器有最大的机会提出最有效的可能性。 有了一个不错的数据库,它通常会在此方面做得很好,而您自己进行的任何努力都可能会带来伤害而不是帮助。

如果数据库的速度不够快,请首先检查诸如您是否具有正确的索引,调整数据库等问题。这些是导致问题的最常见原因,应尽快清除大部分剩余的问题。

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

黑桃有一对关于优化的老规则。

  1. 别。
  2. (仅适用于专家。)

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

这样创建一个视图:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM