sql - 提高 SQL 查询的运行时间

假设下面的查询需要很长时间才能运行。为了提高这个 SQL 查询的运行时间,以下哪个选项是最好的方法?

SELECT Name
FROM People
WHERE Birth_Date > CAST('2000-01-01' AS DATE) ;

People 是 table 的名称。现在有4个选项:

  1. 将表达式 Birth_Date 替换为 CAST (Birth_Date AS DATE) 以避免类型转换。
  2. CREATE INDEX IDX ON People (Birth_Date, Name)
  3. CREATE INDEX IDX ON People (Name, Birth_Date)
  4. 创建一个包含此查询的视图,并将实际出生日期作为输入参数。

哪个选项是最好的,为什么?

回答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) 上创建索引。因为,只有这一列作为条件涉及选择性。

  1. 请不要 CAST (Birth_Date AS ),除非您创建函数索引,否则对列类型进行强制转换会导致相关索引无效。没必要这样做。
  2. 对于您的 2 和 3,无需创建组合索引。列名不在条件列表中。对效率没有帮助。
  3. 这是一个简单的查询,无需为此创建视图。

相似文章

随机推荐

最新文章