-1

我认为这个查询非常有效。除了它是如此缓慢。我究竟做错了什么?一般来说,如何提高代码的速度?

<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陈述。我是否需要转换为某种准备好的语句?

4

4 回答 4

3

使用 EXPLAIN PLAN 查看查询缓慢的原因。如果您看到 TABLE SCAN,请消除它们。或者通过重新排列 WHERE 子句来缩小您扫描的集合的大小。

索引可能会有所作为。WHERE 子句中出现的每一列都应该有一个。

于 2013-05-24T15:35:53.413 回答
1

乍一看,您的查询没有错,“或”也没有错。与数据库所有者交谈,调查数据库中的哪些列和列组合已编入索引。查询优化器可能会通过数据库表进行滚动。

我知道相当平淡的答案,但没有太多要说的。

于 2013-05-24T15:35:21.763 回答
0

如果查询返回大量结果而不将其限制为 100,则可能是您遇到的问题。

由于您有一个ORDER BY语句,这意味着如果您在查询中返回 10,000,000 行,它将在获取前 100 行并将它们返回给您之前对所有行进行排序,但是如果您忽略它,它只会返回第一个它遇到了 100 个结果。

我能想到的唯一方法是在表上获得适当的索引,或者返回Recent_Login_Timestamp合理范围内的所有结果(即,如果有很多条目,则返回一天)。

于 2013-05-24T15:55:40.967 回答
0

一般来说,我注意到JSTL SQL taglib比 Java 代码慢得多,因为它将所有结果集放入一个HashMap. 我认为它应该仅用于原型设计。

无论如何,您可以尝试通过以下方式简化您的 where 子句,看看它是否有帮助:

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
    )
于 2017-02-21T10:25:53.123 回答