你们太棒了。在过去的几天里,我已经在这里发帖两次(作为一个新用户),我对这些帮助感到震惊。因此,我想我应该采用软件中最慢的查询,看看是否有人可以帮助我加快速度。我使用此查询作为视图,因此速度快很重要(但事实并非如此!)。
首先,我有一个联系人表,用于存储我公司的客户。该表中有一个 JobTitle 列,其中包含在 Contacts_Def_JobFunctions 表中定义的 ID。还有一个名为 contacts_link_job_functions 的表,其中包含客户的 contactID 号和其他工作职能 - 也在 Contacts_Def_JobFunctions 表中定义。
其次,Contacts_Def_JobFunctions 表记录与其自身具有父/子关系。通过这种方式,我们将相似的工作职能聚集在一起(例如:女佣、洗衣服务、家政、清洁等都是相同的基本工作 - 尽管职位名称可能有所不同)。我们当前不使用的作业功能将作为 ParentJobID 1841 的子项进行维护。
第三,具有附加邮政编码的机构只是为最终结果提供地理数据。
最后,像所有负责任的公司一样,我们为任何希望选择退出我们的新闻通讯(选择加入后)的客户保留了一份删除列表。
我使用以下查询来构建一个表,其中包含已选择接收我们的新闻通讯以及具有与我们提供的服务/产品相关的工作职能或职位的人员。
这是我的丑陋查询:
SELECT DISTINCT
dbo.contacts_link_emails.Email, dbo.contacts.ContactID, dbo.contacts.First AS ContactFirstName, dbo.contacts.Last AS ContactLastName, dbo.contacts.InstitutionID,
dbo.institutionswithzipcodesadditional.CountyID, dbo.institutionswithzipcodesadditional.StateID, dbo.institutionswithzipcodesadditional.DistrictID
FROM
dbo.contacts_def_jobfunctions AS contacts_def_jobfunctions_3
INNER JOIN
dbo.contacts
INNER JOIN
dbo.contacts_link_emails
ON dbo.contacts.ContactID = dbo.contacts_link_emails.ContactID
ON contacts_def_jobfunctions_3.JobID = dbo.contacts.JobTitle
INNER JOIN
dbo.institutionswithzipcodesadditional
ON dbo.contacts.InstitutionID = dbo.institutionswithzipcodesadditional.InstitutionID
LEFT OUTER JOIN
dbo.contacts_def_jobfunctions
INNER JOIN
dbo.contacts_link_jobfunctions
ON dbo.contacts_def_jobfunctions.JobID = dbo.contacts_link_jobfunctions.JobID
ON dbo.contacts.ContactID = dbo.contacts_link_jobfunctions.ContactID
WHERE
(dbo.contacts.JobTitle IN
(SELECT JobID
FROM dbo.contacts_def_jobfunctions AS contacts_def_jobfunctions_1
WHERE (ParentJobID <> '1841')))
AND
(dbo.contacts_link_emails.Email NOT IN
(SELECT EmailAddress
FROM dbo.newsletterremovelist))
OR
(dbo.contacts_link_jobfunctions.JobID IN
(SELECT JobID
FROM dbo.contacts_def_jobfunctions AS contacts_def_jobfunctions_2
WHERE (ParentJobID <> '1841')))
AND
(dbo.contacts_link_emails.Email NOT IN
(SELECT EmailAddress
FROM dbo.newsletterremovelist AS newsletterremovelist))
我希望你们中的一些超级明星可以帮助我调整这个。
非常感谢,
拉塞尔·舒特
更新 - 更新 - 更新 - 更新 - 更新
在收到多条反馈消息(尤其是来自 Khanzor 的反馈消息)后,我努力调整此查询并得出以下结论:
SELECT DISTINCT
contacts_link_emails.Email, contacts.ContactID, contacts.First AS ContactFirstName, contacts.Last AS ContactLastName, contacts.InstitutionID,
institutionswithzipcodesadditional.CountyID, institutionswithzipcodesadditional.StateID, institutionswithzipcodesadditional.DistrictID
FROM contacts
INNER JOIN
contacts_def_jobfunctions ON contacts.jobtitle = contacts_def_jobfunctions.JobID AND contacts_def_jobfunctions.ParentJobID <> '1841'
INNER JOIN
contacts_link_jobfunctions ON contacts_link_jobfunctions.JobID = contacts_def_jobfunctions.JobID AND contacts_def_jobfunctions.ParentJobID <> '1841'
INNER JOIN
contacts_link_emails ON contacts.ContactID = contacts_link_emails.ContactID
INNER JOIN
institutionswithzipcodesadditional ON contacts.InstitutionID = institutionswithzipcodesadditional.InstitutionID
LEFT JOIN
newsletterremovelist ON newsletterremovelist.emailaddress = contacts_link_emails.email
WHERE
newsletterremovelist.emailaddress IS NULL
这并不是很完美(我怀疑我应该做一些外部连接或右连接或其他东西,但我不太确定)。我的结果集大约是我原始查询提供的记录的 40%(我不再 100% 肯定这是一个完美的查询)。
为了清理一切,我取出了所有“dbo”。 SQL Studio 添加的前缀。他们有做任何事情吗?
我现在做错了什么?
Thanks,
拉塞尔·舒特
==========
== 另一个更新 == 另一个更新 == 另一个更新 == 另一个更新 == 另一个更新
==========
我已经在这个查询上工作了几个小时了。我把它归结为:
SELECT DISTINCT
contacts_link_emails.Email, contacts.contactID, contacts.First AS ContactFirstName, contacts.Last AS ContactLastName, contacts.InstitutionID,
institutionswithzipcodesadditional.CountyID, institutionswithzipcodesadditional.StateID, institutionswithzipcodesadditional.DistrictID
FROM
contacts INNER JOIN institutionswithzipcodesadditional
ON contacts.InstitutionID = institutionswithzipcodesadditional.InstitutionID
INNER JOIN contacts_link_emails
ON contacts.ContactID = contacts_link_emails.ContactID
LEFT OUTER JOIN contacts_def_jobfunctions
ON contacts.JobTitle = contacts_def_jobfunctions.JobID AND contacts_def_jobfunctions.ParentJobID <> '1841'
LEFT OUTER JOIN contacts_link_jobfunctions
ON contacts_link_jobfunctions.JobID = contacts_def_jobfunctions.JobID AND contacts_def_jobfunctions.ParentJobID <> '1841'
LEFT OUTER JOIN
newsletterremovelist ON newsletterremovelist.EmailAddress = contacts_link_emails.Email
WHERE (newsletterremovelist.EmailAddress IS NULL)
令人失望的是,我无法填补我知识上的空白。我是加入新手,除非我有可视化工具为我构建它们,所以我想我想要联系人、机构与邮政编码附加和联系人链接电子邮件中的所有内容,所以我已经内部加入了它们(上图)。
我对接下来的一点感到困惑。如果我内部加入他们,那么我会得到拥有适当工作的人( 1841) - 但我想我会失去那些没有 JobTitle 和 JobFunctions 条目的人。在很多情况下,这是不对的。我可以有一个 JobTitle“Custodian”,我想将其保留在我们的时事通讯列表中,但如果他没有 JobFunction 条目,我想如果我使用 INNER JOIN,他就会从列表中掉出。
但是,如果我使用 LEFT OUTER JOIN 进行查询,如上所述,我想我会得到很多人的 JobTitles 错误,仅仅是因为任何缺少 JobTitle 或 JobFunction 的人都会在我的列表中 - 他们可能是“高级管理人员”,没有工作职能,他们就会出现在名单上 - 这是不对的。我们不再提供适合“高级管理人员”的服务。
然后我看到 LEFT OUTER JOIN 如何用于 newsletterremovelist。它非常光滑,我想我做得对......
但我还是被困住了。希望有人能看到我在这里想做的事情并引导我走向正确的方向。
Thanks,
拉塞尔·舒特
再次更新
可悲的是,这个线程似乎已经死了,没有一个完美的解决方案 - 但我已经接近了。请查看启动的新线程,它重新启动了讨论:点击这里 https://stackoverflow.com/questions/4472886/super-slow-query-sped-up-but-not-perfect-please-help
(为所提供的大量工作提供了正确答案 - 即使尚未完全达到正确答案)。
Thanks!
拉塞尔·舒特