[英]Slow SQL query, how to improve?
我认为,此查询非常有效。 除此之外,它是如此缓慢。 我究竟做错了什么? 一般而言,如何提高代码的速度?
<sql:query var="UserQuery" dataSource="jdbc/UBWT">
SELECT top 100
dbo.v_r_system.Name0 as PC,
dbo.v_computer_owners_preferred.User_ID as UBOCUBID,
dbo.v_r_user.User_Name0 as UBID,
dbo.v_r_user.ResourceID as ResID,
dbo.v_r_user.displayName0 as FoolName,
dbo.v_r_user.givenName0 as FirstName,
dbo.v_r_user.sn0 as LastName,
dbo.v_r_user.mail0 as eMail,
dbo.v_computer_owners_preferred.Recent_Login_TimeStamp as InFor,
dbo.v_r_user.departmentNumber0 as DeptNum,
dbo.v_r_user.department0 as Dept,
dbo.v_r_user.telephoneNumber0 as Phone
FROM
dbo.v_r_system
inner join dbo.v_computer_owners_preferred on dbo.v_r_system.name0 = dbo.v_computer_owners_preferred.computer_name
inner join dbo.v_r_user on dbo.v_computer_owners_preferred.user_id = dbo.v_r_user.unique_user_name0
where dbo.v_r_system.Name0 = ? <sql:param value="${param.ubid}" />
or dbo.v_computer_owners_preferred.User_ID = ? <sql:param value="${param.ubid}" />
or dbo.v_r_user.User_Name0 = ? <sql:param value="${param.ubid}" />
or dbo.v_r_user.displayName0 = ? <sql:param value="${param.ubid}" />
or dbo.v_r_user.telephoneNumber0 = ? <sql:param value="${param.ubid}" />
order by dbo.v_computer_owners_preferred.Recent_Login_TimeStamp desc;
我真的不喜欢所有的OR
语句。 我需要转换为某种准备好的语句吗?
使用EXPLAIN PLAN可以查看查询速度缓慢的原因。 如果看到TABLE SCAN,请消除它们。 或者通过重新排列WHERE子句来减小扫描集的大小。
索引可能会有所不同。 对于WHERE子句中出现的每一列,您都应该有一个。
乍一看,您的查询没有问题,而'or'也没有问题。 与数据库所有者交谈,以调查数据库中哪些列和列的组合已建立索引 。 查询优化程序可能正在通过数据库表来回拖。
我知道的答案比较简单,但没有更多要说的。
如果查询返回大量结果而不将其限制为100,则可能是您遇到的问题。
由于您有一个ORDER BY
语句,因此如果您在查询中返回10,000,000行,它将在获取前100行并将其返回给您之前对所有行进行排序,但是,如果您忽略该行,则只会返回它遇到的前100个结果。
我能想到的唯一方法是在表上获取正确的索引,或者返回所有结果,如果“ Recent_Login_Timestamp
在合理范围内(即如果有很多条目,则返回一天)。
通常,我注意到JSTL SQL taglib比Java代码要慢得多,因为它将所有结果集放入HashMap
。 我认为应该仅将其用于原型制作。
无论如何,您可以尝试通过以下方式简化您的从句,并查看是否有帮助:
where ? <sql:param value="${param.ubid}" /> in (
dbo.v_r_system.Name0,
dbo.v_computer_owners_preferred.User_ID,
dbo.v_r_user.User_Name0,
dbo.v_r_user.displayName0,
dbo.v_r_user.telephoneNumber0
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.