Sql 需要进行查询优化,使用'时原始查询需要花费很长时间;在';和';或/和';在这个问题上,我相信联合会需要更长的时间

Sql 需要进行查询优化,使用'时原始查询需要花费很长时间;在';和';或/和';在这个问题上,我相信联合会需要更长的时间,sql,hive,hql,hue,Sql,Hive,Hql,Hue,我正试图从这个查询中获得最佳性能,该表有2700万条记录,但当我使用下面的where子句时,结果将只包含160条记录。这是一种观点。原始表由emp_dept进行分区。并行读取不适用于我的用例,因为该视图的数据将每天刷新以获取过去24个月的数据 SELECT a.fname, a.lname, a.mname, a.emp_id, a.emp_dob, a.emp_dept FROM emp.emp_profile a WHERE a.emp_join_dt BETWEEN '2018-01-01

我正试图从这个查询中获得最佳性能,该表有2700万条记录,但当我使用下面的where子句时,结果将只包含160条记录。这是一种观点。原始表由emp_dept进行分区。并行读取不适用于我的用例,因为该视图的数据将每天刷新以获取过去24个月的数据

SELECT
a.fname,
a.lname,
a.mname,
a.emp_id,
a.emp_dob,
a.emp_dept
FROM emp.emp_profile a
WHERE a.emp_join_dt BETWEEN '2018-01-01 00:00:00' AND '2019-07-01 00:00:00'
AND a.emp_salary BETWEEN 0 AND 1000000
AND ((a.emp_id = '0000000024Z67089' AND a.emp_dept= 'INV' AND a.emp_div = '293') 
    OR (a.emp_id = '000000008UK23197' AND a.emp_dept = 'INV' AND a.emp_div = '293') 
    OR (a.emp_id = '000000006JF10942' AND a.emp_dept = 'INV' AND a.emp_div = '293')
    OR (a.emp_id = '5B103B51' AND a.emp_dept = 'IPS' AND a.emp_div = '640')
    OR (a.emp_id = '0000000016H79794' AND a.emp_dept = 'INV' AND a.emp_div = '293'));
我试过使用“IN”:

SELECT
a.fname,a.lname,a.mname,a.emp_id,a.emp_dob,a.emp_dept
FROM emp.emp_profile a
WHERE (a.emp_join_dt BETWEEN '2018-01-01 00:00:00' AND '2019-07-01 00:00:00')
AND (a.emp_salary BETWEEN 0 AND 1000000) AND a.emp_id in    ('0000000024Z67089', '000000008UK23197', '000000006JF10942', '0000000016H79794', '5B103B51')  
AND a.emp_dept in ('INV','IPS') 
AND a.emp_div in ('293', '640');

*This gives me the same count and better query time, but it is still over 1.5 minute.*
我想,所有的比赛都会花费更多的时间,一个我已经厌倦的比赛并没有给我正确的结果


如果可能,尝试在1分钟内获得查询时间。

您的第二次查询将给出不同的结果,因此无法进行比较。相反,
如果a.emp_在'2018-01-01 00:00:00'和'2019-07-01 00:00:00'之间加入dt,a.emp_的工资在0和1000000之间('00000000 24Z67089','00000000 8UK23197','00000000 6JF10942','00000000 16H79794'),a.emp_部门='INV'和a.emp_部门='293')或(a.emp_部门='5B103B51'和a.emp部门='IPS='640部门)
但是像您的测试一样,您可能看不到太多的改进。为什么不试试union呢?你有关于
emp\u join\u dt
emp\u div
的索引吗?在上述场景中,使用union应该会给你带来最好的性能。请尽量避免在JOIN语句中使用或使用条件。请回答您的问题并为表添加DDL语句。我猜
emp\u join\u dt
是日期或时间戳类型,而
emp\u div
是数字类型;如果这是真的,那么在
WHERE
子句中使用字符串可能会导致不必要的转换和/或阻止使用索引。哪些列被索引?您的第二个查询将给出不同的结果,因此不具有可比性。相反,
如果a.emp_在'2018-01-01 00:00:00'和'2019-07-01 00:00:00'之间加入dt,a.emp_的工资在0和1000000之间('00000000 24Z67089','00000000 8UK23197','00000000 6JF10942','00000000 16H79794'),a.emp_部门='INV'和a.emp_部门='293')或(a.emp_部门='5B103B51'和a.emp部门='IPS='640部门)
但是像您的测试一样,您可能看不到太多的改进。为什么不试试union呢?你有关于
emp\u join\u dt
emp\u div
的索引吗?在上述场景中,使用union应该会给你带来最好的性能。请尽量避免在JOIN语句中使用或使用条件。请回答您的问题并为表添加DDL语句。我猜
emp\u join\u dt
是日期或时间戳类型,而
emp\u div
是数字类型;如果是这样,在
WHERE
子句中使用字符串可能会导致不必要的转换和/或阻止使用索引。哪些列被索引?