Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按日期筛选大型表_Sql_Performance_Date_Join_Hive - Fatal编程技术网

Sql 按日期筛选大型表

Sql 按日期筛选大型表,sql,performance,date,join,hive,Sql,Performance,Date,Join,Hive,我有一个表,VISIT_INFO,包含以下列: pers_key - unique identifyer for each person pers_name - name of person visit_date - date at which they visited a business condition - string start_date - date end_date - date 和另一个表VALID_DATES,其中包含以下列: pers_key - unique ide

我有一个表,VISIT_INFO,包含以下列:

pers_key - unique identifyer for each person
pers_name - name of person
visit_date - date at which they visited a business
condition - string
start_date - date
end_date - date 
和另一个表VALID_DATES,其中包含以下列:

pers_key - unique identifyer for each person
pers_name - name of person
visit_date - date at which they visited a business
condition - string
start_date - date
end_date - date 
我目前有以下疑问:

select pers_key, pers_name from VISIT_INFO a
CROSS JOIN
(select start_date, end_date from VALID_DATES where condition = 'condition1') b
WHERE (a.visit_date >= b.start_date and a.visit_date <= b.end_date)
GROUP BY a.pers_key
所以“条件1”有一个特定的开始日期和结束日期。我需要过滤两个日期之间的访问信息。我想知道是否有更有效的方法来做这件事。根据我目前的理解,它目前必须遍历整个表数百万行,并将开始日期和结束日期添加到每一行。那么它是否必须再次遍历每一行,并根据WHERE条件进行测试

我这样问是因为当我删除交叉连接并硬编码condition1的开始日期和结束日期时,所花费的时间要少得多。我尽量避免在日期中硬编码,因为这将导致今后的严重乏味

因此,重申一下,是否有更好的方法按有效日期中的特定日期过滤访问信息

编辑:我刚刚意识到我漏掉了一条相当大的信息,因为这都是在蜂巢里。因此,b和c之间在a上存在连接是不可能的。

那么:

SELECT DISTINCT pers_key, pers_name
FROM visit_info
WHERE EXISTS
(
    SELECT 1
    FROM valid_dates
    WHERE condition = 'condition1'
    AND visit_date BETWEEN start_date AND end_date
);

尝试现有版本绝对是可能的。但是,您最好扩展VALID_DATES表,这样每个日期就有一行

然后,查询:

select vi.*
from VISIT_INFO vi JOIN
     VALID_DATES_expanded vde
     ON vi.visit_date = vde.valid_date
where vde.condition = 'condition1';

可以使用访问信息访问日期索引和有效日期索引扩展条件有效日期索引。这可能是解决这个问题的最快方法,如果访问信息非常大,并且查询选择的行相对较少。

交叉连接几乎不是正确答案。您能提供更好的选择吗?这是否需要连接到CTE?在dt.start\u日期和dt.end\u日期之间的a.VISIT\u日期连接dt?在@jamied77处对其进行修改,但这不只是检查访问日期是否相等吗到某个日期,而不是检查它是否在两个日期之间?@Tarzan。扩展表将包含两个值之间的所有日期。虽然数据更大,但equi连接更容易优化。你知道我如何在HIVE中实现这样的功能吗?我不小心忘记了我正在使用蜂巢的事实。你正在运行哪个版本的蜂巢?起始于0.13的配置单元应支持WHERE子句中的子查询,以及EXISTS。对于EXISTS,您需要一个相关子查询,但我的示例是相关的。看,我正在运行.12,这可能就是它给我一个错误的原因。无法识别指定函数中“从中选择1”附近的输入@Tripp动力学