【发布时间】:2017-02-13 03:11:52
【问题描述】:
更新:编辑了表格别名。
我正在尝试查找是否可以重写以下查询以提高性能。我们最近开始注意到对查询的巨大性能影响。 Person 表接近 1000 万,Contact 表接近 1700 万 记录。
SELECT
ID, NAME, DEPARTMENT,
CASE
WHEN PrimaryContact = 'MOBILE'
THEN (SELECT TOP 1 MOBILE
FROM CONTACT
WHERE ContactType = 'MOBILE' AND CONTACT.PID = PERSON.PID)
ELSE (SELECT TOP 1 HOME
FROM CONTACT
WHERE CONTACTTYPE = 'HOME' AND CONTACT.PID = PERSON.PID),
FROM
PERSON
WHERE
DEPARTMENT = @DEPARTMENT
每个人都可以在联系人表中拥有一个/多个手机/家庭电话号码。根据主要联系人类型,它应该只获取一个基于PrimaryContact 类型的电话号码。
另外,我们还计划基于Department 对Person 表进行分区。
任何提高整体性能的建议将不胜感激。
谢谢
【问题讨论】:
-
您的查询在语法上远非正确,以至于没有意义。
DETAILS是什么? -
对不起,那是 PERSON.PID 而不是 DETAILS.PID
-
您是否查看过此查询的执行计划?他们显示什么?另外:您的表结构是什么,已经存在哪些索引?
标签: sql-server sql-server-2008 query-optimization