0
我是SQL新手,並且遇到非常慢的視圖,應該爲特定的人員返回最新的事件。這個視圖並不使用PERSON實體(但它可以)。關係Person-> Event是oneToMany。SQL - 查看速度很慢或不返回任何結果
結構
PERSON:
ID
NAME
EVENT:
PERSON_ID
EVENT_DESC
EVENT_TYPE
IDX
下面是很慢的觀點,其工作速度太慢(上PERSON_ID和ID索引創建的,但它仍然是非常慢)
select * from V_CURRENT_EVENT_FOR_PERSON where person_id = 123456
查看(太慢)
create or replace force view "V_CURRENT_EVENT_FOR_PERSON" ("PERSON_ID",
"EVENT_DESC", "EVENT_TYPE") as
select * from (SELECT EVENT.PERSON_ID AS PERSON_ID,
EVENT.EVENT_DESC AS EVENT_DESC,
EVENT.EVENT_TYPE AS EVENT_TYPE
FROM PERSON_EVENT_DATA EVENT
WHERE EVENT.ID =
(SELECT EVENT2.ID
FROM PERSON_EVENT_DATA EVENT2
WHERE EVENT2.PERSON_ID = EVENT.PERSON_ID
GROUP BY EVENT2.PERSON_ID,
EVENT2.IDX,
EVENT2.ID
HAVING EVENT2.IDX =
(SELECT MAX(EVENT3.IDX)
FROM PERSON_EVENT_DATA EVENT3
WHERE EVENT3.PERSON_ID = EVENT2.PERSON_ID
)
))
我試圖將其更改爲:
create or replace force view "V_CURRENT_EVENT_FOR_PERSON" ("PERSON_ID",
"EVENT_DESC", "EVENT_TYPE") as
select * from (SELECT EVENT.PERSON_ID AS PERSON_ID,
EVENT.EVENT_DESC AS EVENT_DESC,
EVENT.EVENT_TYPE AS EVENT_TYPE
FROM PERSON_EVENT_DATA EVENT order by EVENT.idx desc
) where rownum = 1
但這裏select * from V_CURRENT_EVENT_FOR_PERSON where person_id = 123456
從未retures因爲rownum = 1
工作速度提高一倍,謝謝。我將它包裝在VIEW中。它在實踐中如何運作?當我選擇* from V_CURRENT_EVENT_FOR_PERSON where person_id = 123456 ...它會搜索所有人的所有事件,然後爲person_id應用條件,或者它只搜索人員123456的事件? – michealAtmi
@michealAtmi:檢查執行計劃。我會假設Oracle將'where person_id ='的條件推入視圖中,並且不對所有行進行評估。但是隻有執行計劃才能告訴你。 –
新問題發生:當我做分頁(每頁10個元素,關於page2的qyery)查詢如下:select p。* from person p left outer join V_CURRENT_EVENT_FOR_PERSON vv on p.id = vv.person_id where rownum> 10,then nothing返回.. – michealAtmi