诸位令人惊奇。在过去的两天里,我已经在这里发布了两次-一个新用户-
我对帮助感到震惊。因此,我认为我会采用软件中最慢的查询,看看是否有人可以帮助我加快查询速度。我使用此查询作为视图,因此务必要快(不是!),这一点很重要。
首先,我有一个联系人表,用于存储我公司的客户。该表中有一个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))
我希望你们中的一些超级巨星可以帮助我进行调整。
非常感谢,
罗素·舒特(Russell Schutte)
更新-更新-更新-更新-更新
在收到几条反馈消息(最著名的是来自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添加的前缀。他们有事吗?
我现在在做什么错?
谢谢,
罗素·舒特(Russell Schutte)
== == == == == ==另一个更新==另一个更新==另一个更新==另一个更新==另一个更新== == == == ==
我已经处理了这个查询几个小时了。我已将其归结为:
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)
令人失望的是,我只是无法填补我的知识空白。我是新加入的,除了当我使用可视化工具为我创建它们时,我在想我需要联系人,带有邮政编码的其他机构和contacts_link_email的所有内容,因此我已将其INNER
JOIN(以上)。
我很困惑。如果我加入他们,那么我会得到拥有适当工作的人(<>
1841)-但是我在想我把那些没有JobTitle和JobFunctions条目都没有的人排除在外。在许多情况下,这是不对的。我可以保留一个JobTitle“保管人”,希望将其保留在我们的新闻通讯列表中,但是如果他也没有JobFunction条目,那么我认为如果我使用INNER
JOIN,他将不在列表之列。
但是,如果我像上面那样用LEFT OUTER
JOINs进行查询,我想我会发现很多人的JobTitles错误,仅仅是因为任何缺少JobTitle或JobFunction的人都会在我的名单上-
他们可能是“没有JobFunction的“高级主管”,他们会在列表中-这是不对的。我们不再提供适合“高级主管”的服务。
然后,我了解LEFT OUTER JOIN如何处理新闻通讯清单。它非常光滑,我想我做对了…
但是我仍然被困住。希望有人能看到我在这里要做什么,并引导我朝正确的方向前进。
谢谢,
罗素·舒特(Russell Schutte)
再次更新
可悲的是,这个线程似乎已经死了,没有一个完美的解决方案-但是我已经接近了。
(即使还没有完全找到正确的答案,也要为所提供的大量工作提供正确的答案)。
谢谢!
将查询WHERE
移到实际联接中。这些称为相关子查询,是Voldemort的工作。如果它们是联接,则它们只会执行一次,从而可以加快查询速度。
对于这些NOT IN
部分,请使用左外部联接,并检查联接的列是否为NULL
。
另外,请尽可能避免OR
在WHERE
查询中使用-请记住,这OR
不一定是短路操作。
示例如下:
SELECT
*
FROM
dbo.contacts AS c
INNER JOIN
dbo.contacts_def_jobfunctions AS jf
ON c.JobTitle = jf.JobId AND jf.ParentJobID <> '1841'
INNER JOIN
dbo.contacts_link_emails AS e
ON c.ContactID = e.ContactID AND jf.JobID = c.JobTitle
LEFT JOIN
dbo.newsletterremovelist AS rl
ON e.Email = rl.EmailAddress
WHERE
rl.EmailAddress IS NULL
请不要使用它,因为它几乎可以肯定是不正确的(更不用说了SELECT *
),我已经忽略了contacts_ref_jobfunctions_3的逻辑以提供一个简单的示例。
对于(真正)关于联接的很好的解释,请尝试以下关于联接的直观解释
我正在做一个项目,我的意图是运行一个玉米作业,并发送邮件给我的朋友,祝他们生日,我能够从MySQL DB获取电子邮件,并将其与当前日期进行比较,但当涉及到发送电子邮件时,我得到NullPointerException。 我确信应用程序属性没有问题,我在其他项目中也使用了它们,它们的功能正常 这是我得到以下信息的错误
11:15:57创建表如果不存在tblcompany(companyid INT(11)无符号NOT NULL,custfirst VARCHAR(50),custlast VARCHAR(50),company VARCHAR(50),custphone VARCHAR(50), custemail VARCHAR(50),主键(companyid),索引(companyid),约束外键(com
问题内容: 我有一些代码来计算圆的属性: 它计算周长,但不计算其余部分。 问题答案: 是一个,也一个,这意味着不能在第二个打印语句中使用。试试那里。 回想一下,这是浮点数,而整数。在的文档中对此进行了概述(请参阅“ 格式化字符串语法”)。
我正在使用EclipseIDE编程。在完成有关Apache POI的教程后: https://www.youtube.com/watch?v=RsrF2Ku7ad4 我通过eclipse和以下链接创建了一个可执行jar:http://help.eclipse.org/mars/index.jsp?topic=/org.eclipse.jdt.doc.user/tasks/tasks-37.htm
我使用的是SPARK-SQL-2.4.1、SPARK-Cassandra-Connector2.11-2.4.1和java8以及apache Cassandra3.0版本。 我有如下所示的spark-submit或spark集群环境,可以加载20亿条记录。 当我检查日志时,我看到警告com.datastax.spark.connector.writer.QueryExecutor-BusyPool
我试图发布一个新的条目到MongoDB,我知道这个问题是我在服务器文件中调用我的路由的地方,但我不知道如何解决这个问题。我需要能够测试在邮递员的API和张贴到数据库。 我得到以下错误: /users/ryan/desktop/leasequery/operations-backend/node_modules/express/lib/router/index.js:458抛出新的TypeError