正在运行的SQLServer2005查询优化
我有两张桌子出售和购买。我的查询给了我想要的结果,我很关心它的性能,所以请告诉我它是否可以更好。我的桌子是:正在运行的SQLServer2005查询优化,sql,sql-server,query-optimization,Sql,Sql Server,Query Optimization,我有两张桌子出售和购买。我的查询给了我想要的结果,我很关心它的性能,所以请告诉我它是否可以更好。我的桌子是: 表格销售 UserId | ProductId | ProductName | ProductPrice 1 | p_101 | Cycle | 500 1 | p_121 | Car | 500000 2 | p_111 | Cycle
表格销售
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
所需输出表
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
最好使用联接而不是子查询。这样,您的查询就不会有额外的开销,特别是在处理大量数据时。更好的设计是将两个表合并,并有一个事务类型列,该列的值为“购买”或“出售”。如果你这样做了,你就不必做工会或全体工会 使用当前的设计,这里是一种简单快捷的获取记录的方法。请注意,我使用了UNION ALL,它比UNION快,因为UNION使用的是独特到唯一的记录,我认为在您的案例中不适用。如果您提供有关索引和执行计划的详细信息,我可以看看是否有更好的方法
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小姐吗?这可能更适合dba.stackexchange.com。。。这些表上的行数?只是一个想法:将userid=1的位置移动到内部Selects@rene,没有。。。我没有查询执行和索引。要查看计划,请在查询前面加上Explain并执行它。说唯一有用的索引是产品和销售中的UserId,因为它是where子句中唯一的因素。@Emil Rena:我在哪里可以使用连接?大概在某个地方有一个users表,你可以连接到它。答案是一个更好的方法。
最好使用连接而不是子查询。
作为一般性语句并不总是正确的。无论如何,很难看出它是如何应用于问题中的代码的。JOIN比subquery快在真正的RDBMS(例如Oracle、Sql Server、PostgreSQL)上确实是一个神话。MySQL子查询的速度非常慢,因此如果我在SQLServer2005上运行这两个查询并单击“显示估计的执行计划”,它的连接看起来很快,这表明这两个查询都使用了50%,50%的cpu。。。团结一致。但这让我对你的答案更满意你的桌子上有多少张记录?您是否在UserId上有非唯一索引?另外,正如我在上面的回答中所说的,是否可以只使用一个带有事务类型列的表?100到150条记录。我在UserId上没有索引。100到150条记录可能不会显示差异,但当表增长时,所有记录都会有帮助。你可以在上阅读更多关于它的信息。也可以尝试向UserId添加非唯一索引,看看是否有帮助。是的,我经常读那个博客。。得到了完美的答案。Thanx Adarsh:)