SQL优化分享邮编和号码

Posted

技术标签:

【中文标题】SQL优化分享邮编和号码【英文标题】:SQL optimization sharing zip code and number 【发布时间】:2020-03-10 19:33:05 【问题描述】:

我正在尝试优化一个 sql 查询,该查询详细说明客户何时与另一个客户共享地址(邮政编码、号码)。我已经使用邮政编码和数字这两个列创建了一个索引。但是,该索引可以很好地显示特定邮政编码和数字中的公司(如下图):

不过,我必须进行一些具体分析才能知道有多少公司共享此地址(邮政编码、号码),因为我们的分析是使用共享同一地址的客户数量范围(2,3-5,6 -9,>10)。所以,我对特定范围有不同的查询,然后,最终结果是每个客户的详细结果(如下图):

例如,我们的客户 LOCALIZA 与不同的公司共享地址。我附上了我当前的代码。我已经为邮政编码和号码创建了一个过滤索引(具有以下条件情况 = 2 和 invalid_number = 0 并且 zip 在 table company 上不为空)

SELECT pj.zip, pj.number, count(pj.id) as number_of_customers
INSERT INTO #customerSharingAddress 
FROM company pj
WHERE pj.situation = 2 and pj.invalid_number = 0 and pj.zip is not null
GROUP BY pj.zip, pj.number 
HAVING count(pj.cnpj) > 1



SELECT DISTINCT pj.id, pj.[name], company_sharing_address.id, company_sharing_address.[name]
FROM #customerSharingAddress _address
INNER JOIN company pj
    ON pj.zip = _address.zip AND pj.number = _address.number
        AND pj.situation = 2 AND pj.invalid_number = 0 AND PJ.zip IS NOT NULL
INNER JOIN customerUnderAnalysis MRP
    ON MRP.id= pj.id
INNER JOIN company company_sharing_address
    ON company_sharing_address.zip = pj.zip AND company_sharing_address.number = pj.number AND company_sharing_address.id != pj.id
        AND company_sharing_address.situation = 2 AND company_sharing_address.invalid_number = 0 AND company_sharing_address.zip IS NOT NULL
WHERE _address.number_of_customers BETWEEN 3 AND 5

【问题讨论】:

您要优化的查询是什么样的? 查询的同时,别忘了给我们paste the plan。 我已在问题中附加了查询。 【参考方案1】:

首先,当您插入 #customerSharingAddress 时,您使用 WHERE 子句来匹配您在公司表上的过滤索引。很好。但是现在#customerSharingAddress 仅具有这些值,因此您不需要在 JOIN 中具有相同条件的 AND 子句,因为它们是多余的。

此外,如果 pj.id 不是集群索引值,请确保将其作为包含列添加到您的 zip 和编号索引中。

如果这些想法都没有帮助,请尝试使用 COUNT OVER () PARTITION BY pj.zip, pj.number 窗口函数重写初始查询以插入临时表。这将创建一个完全不同的查询计划,通常更快。

【讨论】:

以上是关于SQL优化分享邮编和号码的主要内容,如果未能解决你的问题,请参考以下文章

分享Sql性能优化的一些建议

分享Sql性能优化的一些建议

分享Sql性能优化的一些建议

SQL优化之语句优化

SQL优化案例分享--联合索引

分享一则sql优化案例:生产数据库从385s优化到16.8s