假设下面的查询需要很长时间才能运行。为了提高这个 SQL 查询的运行时间,以下哪个选项是最好的方法?
SELECT Name
FROM People
WHERE Birth_Date > CAST('2000-01-01' AS DATE) ;
People 是 table 的名称。现在有4个选项:
- 将表达式
Birth_Date
替换为CAST (Birth_Date AS DATE)
以避免类型转换。 CREATE INDEX IDX ON People (Birth_Date, Name)
CREATE INDEX IDX ON People (Name, Birth_Date)
- 创建一个包含此查询的视图,并将实际出生日期作为输入参数。
哪个选项是最好的,为什么?
回答1
选项 2。
选项 1 执行了不必要的类型转换,因为我们可能假设 Birth_Date
已经是 DATE
(或兼容类型),否则为什么要将 '2000-01-01'
强制转换为 DATE
?由于额外的强制转换,这无助于加快查询速度,只会减慢它的速度。
选项2创建一个索引,其第一个成员是Birth_Date
,因此引擎可以在索引中使用有效的搜索来找到满足WHERE
条件的Birth_Date
最少的记录,然后从那里输出所有记录,遵循索引顺序。
选项 3 创建一个无用的索引,因为 Birth_Date
不是它的第一个成员,所以它不能用于有效地找到具有最少 Birth_Date
的记录,也不能用于按 Birth_Date
的顺序遍历记录。
选项 4 是不可能的,因为视图不带参数。即使某个数据库引擎知道这个概念,它也只会影响 WHERE
条件的右侧,而不影响数据库引擎可用于检索匹配记录的算法。
回答2
基本上,您只需要在 People(Birth_Date) 上创建索引。因为,只有这一列作为条件涉及选择性。
- 请不要 CAST (Birth_Date AS ),除非您创建函数索引,否则对列类型进行强制转换会导致相关索引无效。没必要这样做。
- 对于您的 2 和 3,无需创建组合索引。列名不在条件列表中。对效率没有帮助。
- 这是一个简单的查询,无需为此创建视图。