【问题标题】:Slow SQL query, how to improve?SQL查询慢,如何改善?
【发布时间】:2013-05-24 15:32:39
【问题描述】:

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

<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 声明。我需要转换成某种prepared语句吗?

【问题讨论】:

    标签: java html sql jsp jstl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      乍一看,您的查询没有错,“或”也没有错。与数据库所有者交谈以调查数据库中的哪些列和列组合被索引。查询优化器可能会在数据库表中使用滚动。

      我知道的答案比较平淡,但没什么好说的。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          通常我注意到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
              )
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-01-04
            • 2021-04-03
            • 2010-10-10
            • 1970-01-01
            • 2020-10-26
            • 2022-01-02
            • 1970-01-01
            相关资源
            最近更新 更多