当前位置: 首页 > 面试题库 >

优化使用between子句的SQL

洪通
2023-03-14
问题内容

考虑以下两个表:

Table A:
id
event_time

Table B
id
start_time
end_time

表A中的每条记录都精确映射到表B中的1条记录。这意味着表B没有重叠的时间段。表A中的许多记录可以映射到表B中的同一记录。

我需要一个返回所有A.id,B.id对的查询。就像是:

SELECT A.id, B.id 
FROM A, B 
WHERE A.event_time BETWEEN B.start_time AND B.end_time

我正在使用MySQL,但无法优化此查询。表A中有约980条记录,表B中有130.000条记录,这是永远的事。我知道必须执行980个查询,但是在功能强大的计算机上花费超过15分钟的时间却很奇怪。有什么建议?

PS我不能更改数据库架构,但是可以添加索引。但是,时间字段上的索引(具有1或2个字段)无济于事。


问题答案:

您可能想尝试这样的事情

Select A.ID,
(SELECT B.ID FROM B
WHERE A.EventTime BETWEEN B.start_time AND B.end_time LIMIT 1) AS B_ID
FROM A

如果您在B的Start_Time,End_Time字段上有一个索引,那么这应该可以很好地工作。



 类似资料:
  • 主要内容:Oracle BETWEEN运算符简介,Oracle BETWEEN示例在本教程中将学习如何使用Oracle 运算符来选择值在一个范围内的行数据。 Oracle BETWEEN运算符简介 运算符允许指定要测试的范围。当使用运算符为SELECT语句返回的行形成搜索条件时,只返回其值在指定范围内的行。 以下说明运算符的语法: 在上面的语法中, low 和high - 和指定要测试的范围的下限值和上限值。和值可以是文字或表达式。 expression - 是和定义的范围内测

  • 问题内容: 使用BETWEEN子句或使用<= AND> =比较之间在性能上有区别吗? 即这两个查询: …和 在此示例中,year列是带有索引的VARCHAR2(4)。 问题答案: 这两个示例查询之间没有性能差异,因为这只是表示 包含 范围比较的一种简便方法。Oracle解析条件时,它将自动扩展为单独的比较子句: 前任。 …将自动变为:

  • 本文向大家介绍MySQL中BETWEEN子句的用法详解,包括了MySQL中BETWEEN子句的用法详解的使用技巧和注意事项,需要的朋友参考一下 可以使用IN子句来代替相结合的“大于等于和小于等于”的条件。 要了解BETWEEN 子句考虑的EMPLOYEE_TBL表有以下记录: 现在,假设根据上表想获取记录条件daily_typing_pages超过170,等于和小于300。这可以使用如下条件>=和

  • 问题内容: 我想获取介于两个时间戳之间的记录。我想要使​​用hibernate模式。我尝试使用以下查询进行操作,但未获得任何输出 这是从控制台形成的SQL查询: 我的数据库具有T_ADM_TNM_UPDATE_DATETIME = 10/2/2012 5:10:40 PM的记录 但是结果集无法获取此查询…我不知道我哪里出错了。 谁能指导我进一步 问题答案: 您应该使用HQL参数而不是串联。 举个例

  • 问题内容: 如果我运行带有子句的查询,它似乎排除了结束值。 例如: 从‘2011-01-01’到‘2011-01-30’的所有结果;跳过“ 2011-01-31” 所在的记录。谁能解释这个查询的行为方式,以及如何修改它以包含“ 2011-01-31” 所在的记录?(由于用户选择了结束日期,因此未在结束日期前加上1。) 问题答案: 该字段可能具有时间成分。 截断它:

  • 问题内容: (1)表 (2)中的VBA 值 我想在子句中的语句中使用日期的内部运行查询。 当我在之外运行此查询时,它运行完美: 一次,我在中运行它不会给我一个错误,但也不会给我任何结果。 我认为问题是由和中的组合引起的。 我必须如何更改才能使其正常工作? 问题答案: 您在日期和时间之间缺少空格… 打开VBE并调试打印公式以查看结果(制造商确保您具有立即窗口[视图菜单/立即窗口])。 结果 2020