繁体   English   中英

SQL查询速度慢,如何提高?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM