我有一个面试问题,下面两个sql语句中哪一个更快?假设使用registration\u timestamp列对表进行索引。解释原因。
查询1
SELECT
name
FROM
user_table
WHERE
DATE(DATETIME_ADD(registration_timestamp, INTERVAL 7 HOUR))
>= DATE(‘2018-01-01’)
AND
DATE(DATETIME_ADD(registration_timestamp, INTERVAL 7 HOUR))
< DATE(‘2019-01-01’)
查询2
SELECT
name
FROM
user_table
WHERE
registration_timestamp
>= DATETIME_SUB(‘2018-01-01’, INTERVAL 7 HOUR)
AND
registration_timestamp
< DATETIME_SUB(‘2019-01-01’, INTERVAL 7 HOUR)
我正在使用sql和bigquery,但语法不正确。你知道吗?
3条答案
按热度按时间yduiuuwa1#
第二个手放下。
第一个患有“左手操作者表情”综合征。列上的表达式无法使用索引。
mitkmikd2#
第二个查询将比第一个查询快。
原因:如果对索引列执行强制转换或某些操作,导致查询作为简单查询运行,则不会使用索引。但在第二个查询中,索引是完整的,只对输入进行操作,这样就可以直接使用范围索引来更快地执行搜索。
你可以从这里找到一个很好的解释
k2fxgqgv3#
假设表上有索引
registration_timestamp
,则该索引很可能只能在第二个版本中使用,即sargable。第一个版本registration_timestamp
出现在函数调用内部时,通常无法使用索引。所以,你通常应该坚持第二个版本。