gpt4 book ai didi

SQL:可选的附加索引搜索

转载 作者:行者123 更新时间:2023-12-04 15:08:04 25 4
gpt4 key购买 nike

我有一个表格,其中包含一些数据,包括日期:

id   action_type     created_date    data
1 action 1 20180405 03:00 ...
2 action 2 20180405 03:01 ...
3 action 1 20180405 02:58 ...

我有两个独立的索引(我不能添加另一个索引):action_typecreated_date。我需要一个查询来选择特定日期之间具有特定 action_type 的所有条目:

-- Query 1:
declare @from_date datetime = '20180101 00:00'
,@to_date datetime = '20180301 00:00'
,@action_type varchar(20) = 'action 1'

select *
from my_table
where created_at between @from_date and @to_date
and action_type = @action_type

我正在使用这个查询,只是在声明部分更改变量值。问题是我没有包含日期​​和类型的索引,因此查询效率不高,但我对此无能为力。

但是,有时我需要针对所有日期运行查询(不受日期限制)。我不想编写不同的查询,所以我正在做的是设置 @from_date = '20010101 00:00'@to_date = getdate() 因为我确定所有日期都大于 2001 年 1 月 1 日。

我的问题是:

1 我猜服务器不“理解”所有数据都落在这个区域并且仍然按日期执行搜索。我是对的吗,在这种情况下,不按日期运行搜索会更有效率,如:

select  *
from my_table
where action_type = @action_type

2 如果 @from_date 为空,下面的查询是否会消除按日期搜索?我的意思是,对于不需要按日期进行约束的情况,这是否比查询 1 更有效?

select  *
from my_table
where (created_at between @from_date and @to_date or @from_date is null)
and action_type = @action_type

3 是否有任何其他方法可以编写包含这两种情况的查询:如果不为空则按日期搜索,如果为空则不搜索;并且会有效率吗?

最佳答案

我认为你可以使用union all:

select t.*
from my_table t
where t.action_type = @action_type and @from_date is null
union all
select t.*
from my_table t
where t.action_type = @action_type and
created_at >= @from_date and created_at <= @to_date is null;

每个子查询都应该独立评估。我认为 SQL Server 足够聪明,可以识别 NULL 条件意味着没有行返回。

关于SQL:可选的附加索引搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51042932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com