您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

使用范围谓词的查询

检查查询在您为谓词列创建索引时如何使用范围谓词。

在使用范围谓词的下列情况下,选择 DATETIME 或 DTTM 索引处理查询:

  • 比较条件:SELECT * FROM tab WHERE col1 < ‘2002/10/09’;SELECT * FROM tab WHERE col2 >= ‘2002/01/01 09:12:04.006’; 比较运算符一侧是列名,另一侧是常量表达式(常量值或主变量)。

  • Between 条件:SELECT * FROM tab WHERE col3 BETWEEN ‘09:12:04.006’ AND ‘20:12:04.006’;SELECT * FROM tab WHERE col2 BETWEEN tmp_datetime1 AND tmp_datetime2;

    对于这些查询类型, DATETIME 或 DTTM 索引通常比 HNG 索引的执行速度更快。

    在下面三种特定情况中,使用 DATE 或 DTTM 索引可以显著提高性能:

  • 谓词范围恰好是一年或多年(实际开始日期是某一年年初,而实际结束日期是某一年年末)。例如:SELECT * FROM tab WHERE col1 BETWEEN ‘1993-01-01’ AND ‘1996-12-31’;SELECT * FROM tab WHERE col1 >= ‘1993-01-01’ ANDcol1 < ‘1997-01-01’;SELECT * FROM tab WHERE col2 BETWEEN ‘1993-01-01 00:00:00.000000’ AND ‘1996-12-31 23:59:59.999999’;

  • 谓词范围恰好是一个月或同一年中的多个月(实际开始日期是某个月月初,而实际结束日期是某个月月末)。例如,SELECT * FROM tab WHERE col1 > ‘1993-01-31’ ANDcol1 <= ‘1993-06-31’;SELECT * FROM tab WHERE col2 >= ‘1993-01-01 00:00:00.000000’ AND col1 < ‘1993-06-01 00:00:00.000000’;

  • 谓词范围恰好是一天。例如,SELECT * FROM tab WHERE col2 >= ‘1993-01-31 00:00:00.000000’ ANDcol2 <= ‘1993-01-31 23:59:59.999999’;

    注意 在上面三种情况下,必须注意年范围、月范围和恰好一天的概念。例如,识别为年范围的 DTTM 索引包含四种情况: col2 > ’year1/12/31 23:59:59.999999’ andcol2 < ’year2/01/01 00:00:00.000000’col2 >= ’year1/01/01 00:00:00.000000’ andcol2 < ’year2/01/01 00:00:00.000000’col2 > ’year1/12/31 23:59:59.999999’ andcol2 <= ’year2/12/31 23:59:59.999999’col2 >= ’year1/01/01 00:00:00.000000’ andcol2 <= ’year2/12/31 23:59:59.999999’ 以下示例中的范围不符合年范围: col2 > ’year1/12/31 23:59:59.999999’ andcol2 <= ’year2/01/01 00:00:00.000000’col2 > ’year1/01/01 00:00:00.000000’ andcol2 < ’year2/01/01 00:00:00.000000’第一个范围不相符,因为除年范围之外,它还包括值 "year2/01/01 00:00:00:000000"。第二个范围缺少值 "year1/01/01 00:00:00.000000"。类似具体信息也适用于 DTTM 和 DATE 索引的月范围和恰好一天。

    如果较小的日期范围(小于 60 个值)不适用于上面三种特定情况,则 HG 索引比 DATE 索引的执行速度更快。