【问题标题】:Query takes time on comparing non numeric data of two tables, how to optimize it?查询比较两个表的非数值数据需要时间,如何优化?
【发布时间】:2010-04-22 00:59:45
【问题描述】:

我有两个数据库。第一个数据库有 CallsRecords 表,第二个数据库有 Contacts 表,两者都在 SQL Server 2005 上。

以下是两张表的示例。

Contact table has 1,50,000 records
CallsRecords has 75,000 records

Indexes on CallsRecords:
CallFrom
CallTo
PickUP

Indexes on Contacts:
PhoneNumber

alt text http://img688.imageshack.us/img688/8422/calls.png

我正在使用此查询来查找匹配项,但需要超过 7 分钟。

SELECT *
    FROM CallsRecords r INNER JOIN Contact c ON r.CallFrom = c.PhoneNumber 
        OR r.CallTo = c.PhoneNumber OR r.PickUp = c.PhoneNumber

在估计的执行计划内连接成本 95%

任何优化它的帮助。

【问题讨论】:

  • 几千条记录不是很多!
  • 这些表上有哪些索引?
  • @Mitch Wheat 请看我的编辑。
  • 执行计划会很有用,但您可以尝试将其分成三个 SELECT - 每个 CallsRecords 列一个 - 使用 UNION 将它们连接起来。
  • 运行:set showplan_xml on 然后你的查询,在这里发布输出。

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:

您可以尝试摆脱连接条件中的 or 并用 union all 语句替换。也永远不要,我的意思是永远不要,在生产代码中使用 select * 特别是当你有一个连接时。

SELECT <Specify Fields here>
FROM CallsRecords r INNER JOIN Contact c ON r.CallFrom = c.PhoneNumber  
UNION ALL
SELECT <Specify Fields here>    
FROM CallsRecords r INNER JOIN Contact c ON r.CallTo = c.PhoneNumber 
UNION ALL
SELECT <Specify Fields here> 
FROM CallsRecords r INNER JOIN Contact c ON r.PickUp = c.PhoneNumber 

或者,您可以尝试不使用电话号码加入。而是使用身份字段创建联系人电话列表,并将其存储在通话记录中而不是电话号码中。一个 int 字段可能是一个更快的连接。

【讨论】:

  • 感谢@HLGEM,我已经尝试使用UNION ALL,它适用于我的示例查询我将在生产查询中对其进行测试。
【解决方案2】:

您要比较的字段是否有索引?执行计划中是否使用了这个索引?

【讨论】:

    【解决方案3】:

    您的select * 可能导致 SQL Server 忽略您的索引,并导致扫描每个表。相反,请尝试仅列出您需要选择的列。

    【讨论】:

    • No select * 仅用于此示例。我在查询中使用字段。
    【解决方案4】:

    还有很大的优化空间

    1. 取出*(永远不要使用它,使用列名)
    2. 指定表的架构(应为 dbo.CallRecords 和 dbo.Contact)
    3. 最后数据的存储方式也是个问题。我看到CallIDContactID中有很多"1"。这两个表中是否有任何聚集索引(主键)?
    4. 我宁愿按照 HLGem 的建议取出您的加入并实施联合。我同意他的观点,搜索 ID 比搜索长字符串更好。

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      相关资源
      最近更新 更多