-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 句に表示される列ごとに 1 つ必要です。

于 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、妥当な範囲内にあるすべての結果を返すことです (つまり、多くのエントリがある場合は 1 日)。

于 2013-05-24T15:55:40.967 に答える