【发布时间】:2018-09-19 09:58:41
【问题描述】:
我写了一个查询来获取 NULL DAYS (Occasion,weekoff,emergency holiday) 的记录,后来我在 GUI 中实现了同样的功能,所以我的管理员可以看到列表,加载数据需要几分钟,甚至在我的 SQL 开发人员中。
如何减少执行时间?
这里是查询
SELECT *
FROM
(SELECT s.null_id ,
STRING_AGG(DISTINCT s.city) city_id ,
STRING_AGG(DISTINCT c.name) cityName ,
STRING_AGG(DISTINCT s.location) location_id ,
STRING_AGG(DISTINCT l.name) locationName ,
STRING_AGG(DISTINCT s.sublocation) sublocation_id ,
STRING_AGG(DISTINCT sl.name) sublocationName ,
s.department ,
s.fromtodate ,
s.todate ,
s.remark ,
s.status ,
s.update_date ,
s.update_by ,
s.delete_status ,
s.update_by_name ,
uu.name updatedBy ,
row_number() OVER(ORDER BY s.null_id) rnum
FROM nullday s
LEFT OUTER JOIN userdetail uu
ON s.update_by = uu.user_id
LEFT OUTER JOIN city c
ON ','
|| s.city
|| ',' LIKE '%,'
||c.CITY_ID
||',%'
LEFT OUTER JOIN location l
ON ','
|| s.location
|| ',' LIKE '%,'
||l.LOCATION_ID
||',%'
LEFT OUTER JOIN sublocation sl
ON ','
|| s.sublocation
|| ',' LIKE '%,'
||sl.SUBLOCATION_ID
||',%'
WHERE s.null_id = s.null_id
GROUP BY s.null_id,
s.location,
s.sublocation,
s.department,
s.fromtodate,
s.todate,
s.remark ,
s.status,
s.update_date,
s.update_by,
s.delete_status,
s.update_by_name,
uu.name
ORDER BY s.fromtodate ASC
) mytbl
WHERE rnum < :max_val
AND rnum > :min_val
我无法弄清楚,joins 或 LISTAGG 是否需要时间来加载查询。
NULLDAY 表数据格式
【问题讨论】:
-
第一个问题是您的数据充满了 CSV 列表,然后您根据 CSV 列表中是否存在值来连接其他表。正确规范您的数据库..
-
与当前查询相关的任何其他建议,因为我们的数据库非常庞大,我们无法对其进行规范化,这将对我们的项目产生严重影响
-
显示一些数据,但我全部选择“不;通过将逗号分隔的城市 ID 列表放在nullday 记录。如果 nullday 和 city 之间的关系是多:多,那么应该有一个中间人表 nullday_city 将关系分解为两个多:一关系。整理你的数据,否则它会一次又一次地回来咬你。您可以附加地执行此操作(制作中间人表,从 CSV 列填充它,同时维护两者,逐步淘汰 CSV)
-
ps; “这是一个糟糕的设计决定”的批评并不止于 nullday:city - 看起来你到处都这样做了。太可怕了 :o 如果你决心坚持下去,帮你的数据库一个忙,让前端解压这些数据;不要让数据库去做
-
附加了一个 png 文件,我在其中捕获了 NULLDAY 表数据
标签: sql oracle query-performance