【发布时间】:2020-06-12 13:01:06
【问题描述】:
我在 Hive 和 SQL Server 中有一个表,其数据存储如下。我正在使用 SSIS 将此数据移动到 SQL Server。查询时间过长。 Description 列中大约有 175 个单独的值,这会导致 174 个 UNION ALL 语句,因此查询在大约 2 小时后超时。
SQL 错误 [08S01]:org.apache.thrift.transport.TTransportException:java.net.SocketTimeoutException:读取超时*
有没有更好的方法来编写这个查询?
谢谢!
蜂巢:
ID | Description
----+------------------------------
1 | Desc1;Desc2;Desc3;Desc4
2 | Desc1;Desc3;Desc4;Desc5;Desc6
...
230 | Desc8;Desc163;Desc9;Desc2;Desc172
SQL 服务器:
CaseID | GroupID | Description
-------+---------+--------------
1 | 63 | Desc1
1 | 44 | Desc2
1 | 57 | Desc3
1 | 78 | Desc4
...
2 | 78 | Desc1
2 | 57 | Desc3
查询:
select
case
when cas.description like '%Desc1%' then 63
end as groupid, -- maps to groupid
cas.id as caseid, -- maps to caseid
current_timestamp as INSERT_DT
from
svc_case cas
inner join account acc on acc.id = cas.id
where cas.description <> 'NULL' and LENGTH(cas.description) > 0
and acc.recordid = '03443FGT'
union all
select
case
when cas.description like '%Desc2%' then 44
end as groupid, -- maps to groupid
cas.id as caseid, -- maps to caseid
current_timestamp as INSERT_DT
from
svc_case cas
inner join account acc on acc.id = cas.id
where cas.description <> 'NULL' and LENGTH(cas.description) > 0
and acc.recordid = '03443FGT'
union all
select
case
when cas.description like '%Desc3%' then 57
end as groupid, -- maps to groupid
cas.id as caseid, -- maps to caseid
current_timestamp as INSERT_DT
from
svc_case cas
inner join account acc on acc.id = cas.id
where cas.description <> 'NULL' and LENGTH(cas.description) > 0
and acc.recordid = '03443FGT'
union all
select
case
when cas.description like '%Desc4%' then 78
end as groupid, -- maps to groupid
cas.id as caseid, -- maps to caseid
current_timestamp as INSERT_DT
from
svc_case cas
inner join account acc on acc.id = cas.id
where cas.description <> 'NULL' and LENGTH(cas.description) > 0
and acc.recordid = '03443FGT'
...
select
case
when cas.description like '%Desc175%' then 12
end as groupid, -- maps to groupid
cas.id as caseid, -- maps to caseid
current_timestamp as INSERT_DT
from
svc_case cas
inner join account acc on acc.id = cas.id
where cas.description <> 'NULL' and LENGTH(cas.description) > 0
and acc.recordid = '03443FGT'
【问题讨论】:
-
您有 174 个
UNION ALL语句的事实似乎是这里的真正问题。为什么你有这么多?在这里修复设计似乎是正确的选择。 -
很遗憾,我无法更改设计,因为 Hive DB 是第 3 方应用程序数据库,而 SQL Server 也是自定义应用程序使用的第 3 方应用程序数据库。
-
摆脱那些 174
UNION ALL是的解决方案。花费这么长时间的原因是您似乎要完成 348 次表扫描。难怪它会超时。 -
我意识到 UNION ALL 是这里的问题。试图找到一种更好的方法来编写这个查询。
-
我个人只会将数据传送到您的服务器,然后开始操作它。先拆分成ID,Description,然后使用引用表或Lookup添加组。
标签: sql sql-server hive ssis union-all