正在运行的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:)