[英]Sub-query within a view optimization
我有一個視圖,該視圖從兩個表Call
和Caller
中讀取,這兩個表是並行的,因為它們在相同的ID上進行鍵控(即,要獲取Call的Caller信息,請在Call.id = Caller.id上加入)。 我有一個橫跨這兩個表的視圖,以返回有關任何特定呼叫或一組呼叫的復合信息。
但是我在該視圖中有一個子查詢,用於確定呼叫者是否已被回叫(定義為存在另一個呼叫,該呼叫在此呼叫之后以相同的狀態進行,狀態為完成)。 該子查詢使視圖的查詢變得極其緩慢,但是我不確定哪種更好的方式包含此信息。 以下是相關的DDL,您有何想法?
編輯:此查詢是否可以添加一些索引,還是會有一種更有效的方法來構造查詢本身?
CREATE TABLE [CALL]
(
ID VARCHAR(64) PRIMARY KEY, --this is a legacy system, I know varchar(64) isn't an efficient primary key
CALLDATE DATETIME,
STATUS BIT --1 = Complete, 0 = Incomplete
)
CREATE TABLE [CALLER]
(
ID VARCHAR(64) PRIMARY KEY,
PHONENUMBER VARCHAR(10),
FIRSTNAME VARCHAR(50),
LASTNAME VARCHAR(50)
)
CREATE VIEW [CALLVIEW] AS
SELECT
CALL.ID AS CALLID,
CALL.CALLDATE AS CALLDATE,
CALL.STATUS AS CALLSTATUS,
CALLER.PHONENUMBER AS PHONENUMBER,
CALLER.FIRSTNAME AS FIRSTNAME,
CALLER.LASTNAME AS LASTNAME,
CAST(CASE WHEN EXISTS (SELECT TOP 1 1
FROM [CALL] CALL2
INNER JOIN [CALLER] CALLER2 ON CALL2.ID = CALLER2.ID
WHERE CALLER2.PHONENUMBER = CALLER.PHONENUMBER
AND CALL2.CALLDATE > CALL.CALLDATE
AND CALL2.STATUS = 1) THEN 1 ELSE 0 END AS BIT) AS CALLEDBACK
FROM
[CALL]
INNER JOIN [CALLER] ON [CALL].ID = [CALLER].ID
編輯:從執行計划中,我注意到到目前為止,查詢中最昂貴的組件如下:
聚集索引搜尋
謂詞:CALL2.CALLDATE> CALL.CALLDATE AND CALL2.STATUS = 1
對象:[CALL]。[PK_CALL] CALL2(因此使用主鍵索引)
輸出列表:[CALL] .CALLDATE,[CALL] .STATUS
尋求謂詞:[CALL] .id =標量運算符([CALLER] .id)
索引搜尋
對象:[CALLER]。[IX_PHONENUMBER] CALLER2(因此它使用了正確的索引,但仍然昂貴嗎?)
輸出列表:[CALLER] .ID
尋求謂詞:[CALLER] .PHONENUMBER =標量運算符([CALLER] .PHONENUMBER)
首先,嘗試使用Database Engine Tuning Advisor ,它會告訴您是否需要創建一些索引。
無論如何,這是我要做的:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.