[英]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.