繁体   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