【问题标题】:Optimize ms sql select query for huge DB为大数据库优化 ms sql 选择查询
【发布时间】:2014-04-25 19:08:18
【问题描述】:

我的查询是

SELECT DISTINCT
    Company.Name,
    Customer.FirmID,
    Customer.ID,
    Customer.ExtendedId,
    (CustomerExtended.FirstName + ' ' + CustomerExtended.LastName) as "Customer Name"

FROM
    Company,
    Customer,
    CustomerExtended

WHERE
    (Customer.ExtendedId = 1) OR
    (CustomerExtended.FirstName = 'John' AND CustomerExtended.LastName = 'Smith')

由于数据库非常庞大,我没有设法执行这个查询 evan 一次。我等了 2 个小时,但它一直在运行。有没有办法优化这个?

【问题讨论】:

  • 你真的需要交叉连接吗?它将组合每个表中的每一行,然后应用 where 条件。如果有很多行,你可以开始一个家庭,直到 if 完成。
  • 您应该发布示例数据和预期结果。 SQL 查询似乎表明对关系数据库的工作方式缺乏了解。

标签: sql sql-server select optimization


【解决方案1】:

除非您的客户群是每个人,否则我怀疑您的数据库实际上“非常庞大”,因此我认为您可能需要 join 您的表格才能获得所需的结果

例如:

FROM
    Company 
        inner join Customer on Company.CompanyID = Customer.FirmID
    ...

有关联接的说明,请参阅 http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

【讨论】:

    【解决方案2】:

    如果你需要区分你可能做错了什么。在这种情况下,您没有加入您的表格(或者没有正确加入您的表格,您所做的称为交叉连接)

    SELECT 
        com.Name,
        cus.FirmID,
        cus.ID,
        cus.ExtendedId,
        cue.FirstName + ' ' + cue.LastName as [Customer Name]
    FROM Company com 
    JOIN Customer cus
    ON com.id = cus.fk_Company
    JOIN CustomerExtended cue
    ON cue.fk_Customer = cus.id
    WHERE
        (cus.ExtendedId = 1) OR
        (cue.FirstName = 'John' AND cue.LastName = 'Smith')
    

    id应该是主键,fk列应该是引用主键的外键

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      相关资源
      最近更新 更多