工作 SQL Server 2005 查询优化

Posted

技术标签:

【中文标题】工作 SQL Server 2005 查询优化【英文标题】:Working SQL Server 2005 Query Optimization 【发布时间】:2013-12-23 11:09:47 【问题描述】:

我有两张表 SellPurchase。我的查询给了我想要的结果,我对它的性能很小心,所以如果它可以更好,请指导我。我的桌子是: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 查询优化的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005 查询优化

SQL server2005上千万条数据分页查询怎么做优化?

sql server2005主从数据库同步配置

SQL Server 2005 - 内部联接的顺序

SQL Server查询优化中的两个选项

大型sql server查询性能优化