工作 SQL Server 2005 查询优化
Posted
技术标签:
【中文标题】工作 SQL Server 2005 查询优化【英文标题】:Working SQL Server 2005 Query Optimization 【发布时间】:2013-12-23 11:09:47 【问题描述】:我有两张表 Sell 和 Purchase。我的查询给了我想要的结果,我对它的性能很小心,所以如果它可以更好,请指导我。我的桌子是:Table Sell
UserId | ProductId | ProductName | ProductPrice
1 | p_101 | Cycle | 500
1 | p_121 | Car | 500000
2 | p_111 | Cycle | 5000
餐桌购买
UserId | ProductId | ProductName | ProductPrice
1 | p_109 | CellPhone | 150
2 | p_121 | Car | 500000
3 | p_111 | Book | 15
所需的输出表
Type | ProductId | ProductName | ProductPrice
Sell | p_101 | Cycle | 500
Sell | p_121 | Car | 500000
Purchase| p_109 | CellPhone | 150
工作查询:
SELECT type, P1.ProductId, P1.ProductName, P1.ProductPrice
FROM
(
SELECT s.UserId, 'Sell' as type, s.ProductId, s.ProductName, s.ProductPrice FROM [Sell] s
UNION
SELECT p.userid, 'Purchase' as type, p.ProductId, p.ProductName, p.ProductPrice FROM [Purchase] p
) as P1
WHERE userid=1
【问题讨论】:
你有查询执行计划吗?有什么索引吗?这是ms-sql吗?这可能更适合 dba.stackexchange.com... 这些表上的行数? 只是一个想法:将WHERE userid=1
移动到内部选择
@rene, nop... 我没有查询执行和索引。
要查看计划,请在查询前加上 Explain 并执行它。说唯一有用的索引是产品和销售中的 UserId,因为它是 where 子句中的唯一因素。
【参考方案1】:
更好的设计是结合两个表并有一个 transaction_type 列,该列将“Purchase”或“Sell”作为值。如果您这样做,您将不必执行 UNION 或 UNION ALL。
使用当前设计,这是一种获取记录的简单快捷方式。请注意,我使用的 UNION ALL 比 UNION 更快,因为 UNION 使用 DISTINCT 来处理我认为在您的情况下不适用的唯一记录。如果您提供有关索引和执行计划的详细信息,我可以看看是否有更好的方法。
SELECT s.userid,
'Sell' as type,
s.ProductId,
s.ProductName,
s.ProductPrice
FROM Sell s
WHERE UserId = 1
UNION ALL
SELECT p.userid,
'Purchase' as type,
p.ProductId,
p.ProductName,
p.ProductPrice
FROM Purchase P
WHERE UserId = 1
【讨论】:
如果我在 sql server 2005 上运行这两个查询并单击“显示估计的执行计划”,它表明这两个查询都使用了 50%、50% 的 cpu... 与 UNION 和 UNION ALL。但this link 让我对你的回答更好.. 您的表中有多少条记录?您在 UserId 上是否有非唯一索引?另外,正如我在上面的答案中所说,是否可以只使用一个带有 transaction_type 列的表? 100 到 150 条记录。而且我没有关于 UserId 的索引。 100 到 150 条记录可能不会显示差异,但当表增长时 UNION ALL 会有所帮助。您可以在blog.sqlauthority.com/2009/03/11/… 阅读有关它的更多信息。还可以尝试向 UserId 添加非唯一索引,看看是否有帮助。 是的,我经常阅读该博客.. 得到了完美的答案。谢谢阿达什.. :)【参考方案2】:最好使用连接而不是子查询。这样一来,您的查询就不会产生任何开销,特别是在处理大量数据时。
【讨论】:
@Emil Rena:我在哪里可以使用加入?? 可能某处有一个用户表,您可以加入该表。 Adarsh's 答案是更好的选择。Its better to use joins rather than subqueries
作为一般陈述并不总是正确的。无论如何,很难看到它如何应用于问题中的代码。
JOIN 比子查询快 在真正的 RDBMS(例如 Oracle、Sql Server、PostgreSQL)上确实是一个神话。 mysql 子查询的速度非常慢,因此它的连接看起来很快ienablemuch.com/2013/08/…以上是关于工作 SQL Server 2005 查询优化的主要内容,如果未能解决你的问题,请参考以下文章