【发布时间】:2018-11-14 23:24:05
【问题描述】:
所以我有以下架构:
我正在尝试获取以下格式的数据:
________________________________________
| Id | Property1 | Property2 | Property3 |
_________________________________________
| 123| Value1 | Value2 | Value3 |
________________________________________
所以,我编写 SQL 查询的方式是这样的:
SELECT
Id
,(SELECT pv.Value FROM CampaignProperty AS cp LEFT JOIN PropertyValue AS pv ON cp.Id = pv.CampaignPropertyId WHERE cp.Name = "Property1" AND pv.ContactId = c.Id AND cp.CampaignId = c.ActiveCampaignId) AS "Property1"
,(SELECT pv.Value FROM CampaignProperty AS cp LEFT JOIN PropertyValue AS pv ON cp.Id = pv.CampaignPropertyId WHERE cp.Name = "Property2" AND pv.ContactId = c.Id AND cp.CampaignId = c.ActiveCampaignId) AS "Property2"
,(SELECT pv.Value FROM CampaignProperty AS cp LEFT JOIN PropertyValue AS pv ON cp.Id = pv.CampaignPropertyId WHERE cp.Name = "Property3" AND pv.ContactId = c.Id AND cp.CampaignId = c.ActiveCampaignId) AS "Property3"
FROM Contact c
我遇到的问题是我已经为 10 多个属性完成了该操作,我有几个 LEFT JOIN 和多个过滤器,这使得我的查询性能非常差。在 SQL Management Studio 中对此进行分析后,我发现瓶颈出现在上面显示的 SELECT 中。
我怎样才能获得相同的结果但性能更好?有没有其他方法可以查询?
还需要注意的是,PropertyValue 表目前还没有索引...
【问题讨论】:
-
您的数据模型中没有名为
CampaignProperty的列。 -
@GordonLinoff
CampaignProperty是一个表格,PropertyValue也是。我不确定我明白你的意思。尽管如此,我还是在表格中添加了额外的字段,以便更清楚。 -
请在所有列名中包含别名
-
@paparazzo 完成! :)
-
键/值表总是很麻烦。复杂而缓慢的查询,从强制性属性中区分可选的问题,不同的属性类型,属性一致性......如果你用简单的列来代替,那就太容易了。每个联系人/广告系列的属性是否差异很大,以至于有必要选择这种可恶的设计?
标签: sql sql-server optimization query-optimization