如何解决有关简单SQL选择的建议
我正在查看有关基本SQL脚本的一些反馈,“输入(选择)”是执行此操作的最有效方法吗?还是我想使不必要的复杂化。
SELECT emailAddress FROM user where companyId in (SELECT id FROM company WHERE trialist = 1 AND DATEADD(DAY,-14,TrialEndDate) = '2020-08-13 00:00:00');
此脚本将使用Dapper从.Net Framework控制台应用程序运行。
解决方法
假设company
表中没有重复项(考虑到表中的命名约定,这似乎非常合理),我建议:
SELECT u.emailAddress
FROM user u JOIN
company c
ON u.companyId = c.id
WHERE c.trialist = 1 AND
c.TrialEndDate = DATEADD(day,14,'2020-08-13');
为什么我推荐这个?两个原因。
首先,显式JOIN
为优化器提供了更多的优化选择。如果一种方法比另一种更快,那将是一个巨大的胜利。
第二,DATEADD()
函数使优化器的工作更加困难(几乎所有函数都具有这种作用)。它禁止在列上使用索引;它防止优化程序对分区进行修剪(如果表在该列上进行了分区);它混淆了有关该列收集的统计信息。将函数移至常量可以消除所有这些问题。
然后,如果要优化查询,可以在company(trialist,trialenddate)
和user(companyid)
上添加索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。