簡體   English   中英

視圖優化中的子查詢

[英]Sub-query within a view optimization

我有一個視圖,該視圖從兩個表CallCaller中讀取,這兩個表是並行的,因為它們在相同的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 ,它會告訴您是否需要創建一些索引。

無論如何,這是我要做的:

  • 驗證您在CALL.ID和CALLER.ID上是否確實有一個聚集索引(作為舊系統,也許您有PK但有人刪除了索引)
  • 在以下位置創建非聚集索引:
    • CALLER.PHONENUMBER
    • CALL.CALLDATE
    • CALL.STATUS
  • 重組/重建索引
  • 更新統計

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM