[英]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
?
通常,您希望在一个查询中编写整个请求,因为这使数据库查询优化器有最大的机会提出最有效的可能性。 有了一个不错的数据库,它通常会在此方面做得很好,而您自己进行的任何努力都可能会带来伤害而不是帮助。
如果数据库的速度不够快,请首先检查诸如您是否具有正确的索引,调整数据库等问题。这些是导致问题的最常见原因,应尽快清除大部分剩余的问题。
只有为数据库提供了以正确的方式获得正确答案的所有机会之后,您才应该考虑尝试使用临时表来强制执行特定的查询计划。 (使用临时表还有其他原因。但是,为了获得良好的查询计划,这应该是最后的选择。)
黑桃有一对关于优化的老规则。
您可以创建一个包含所需数据的视图 。
这样创建一个视图:
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
然后,您可以查询创建的视图,就像查询表一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.