Sql 查询比较两个表的非数字数据需要时间,如何对其进行优化?

Sql 查询比较两个表的非数字数据需要时间,如何对其进行优化?,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我有两个DBs。第一个数据库有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 我正在使用此查询查找匹配项,但它需要7分钟

我有两个DBs。第一个数据库有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
我正在使用此查询查找匹配项,但它需要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%


是否有助于对其进行优化。

您正在比较的字段是否有索引?此索引是否正在执行计划中使用?

您可以尝试在联接条件中删除或,并替换为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 

或者,您可以尝试不使用电话号码加入。而是创建带有标识字段的联系人电话列表,并将其存储在通话记录中,而不是电话号码中。整型字段可能是更快的联接

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

有太多的优化空间

取出*切勿使用,请使用列名 指定表的架构应为dbo.CallRecords和dbo.Contact 最后,数据的存储方式也是一个问题。我看到CallID和ContactID中有很多1。这两个表中是否有聚集索引主键? 我宁愿按照HLGem的建议删除您的连接并实现联合。我同意他的观点,在ID上搜索比在长字符串上搜索更好。
HTH

数千条记录并不多!这些表上有哪些索引?@Mitch Wheat请查看我的编辑。执行计划会很有用,但您可以尝试将其分为三个选项-每个CallsRecords列一个选项-使用UNION将它们连接起来。运行:打开showplan_xml,然后将查询结果发布到此处。谢谢@HLGEM,我尝试过使用UNION ALL,它对我的示例查询有效,我将在生产查询中测试它。我正在查询中使用字段。