有关简单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)上添加索引。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...