繁体   English   中英

视图优化中的子查询

Sub-query within a view optimization

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个视图,该视图从两个表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)

1 个回复

首先,尝试使用Database Engine Tuning Advisor ,它会告诉您是否需要创建一些索引。

无论如何,这是我要做的:

  • 验证您在CALL.ID和CALLER.ID上是否确实有一个聚集索引(作为旧系统,也许您有PK但有人删除了索引)
  • 在以下位置创建非聚集索引:
    • CALLER.PHONENUMBER
    • CALL.CALLDATE
    • CALL.STATUS
  • 重组/重建索引
  • 更新统计
1 使用子查询的MySQL视图优化

我在优化MySQL中的此SQL语句时遇到困难。 我有两个独立填充的表,因此每个表的列中记录的时间将不同。 我想要的是一个表格(视图),该表格列出了sensor_history中的所有记录,以及传感器的measurement_time上存在的当前过程信息。 如果没有过程日志时间,则可以在该特 ...

3 MySQL中的子查询如何优化?

我的问题很长,但很简单。 我有以下几种查询: 此查询需要很长时间。 恐怕MySQL以以下方式执行此查询(为简单起见,我们仅考虑一个子查询): MySQL遍历表1的行。如果满足condition1 ,它将从子查询获得的集合中开始循环对象。 如果存在考虑的对象,则将其添加到对象 ...

4 优化查询中的子选择

我有一个MySQL查询,该查询从不同的表中挑选不同的数据来构建报告。 例: 在实际代码中,大约有20个子选择从不同的表中提取统计信息。 此查询的速度也很慢。 有没有更好的方法来用JOIN或UNION之类的东西来组织上述查询? ...

5 优化 SELECT 中的子查询

我的表架构如下: 索引: products.id 主键 products.description 唯一 费用.id 主键 费用.product_id 外键到 product.id 我的目标是加载 当月每个产品的成本(AS cost_november) 上月各产品成 ...

6 优化联接中的子查询

我有以下查询: 有没有一种简单的方法可以对此进行优化,以便可以直接进行JOIN并利用索引? 更新 created字段是GROUP BY语句的一部分,因为由于我们的MySQL版本和所使用的ORM的限制,可能有多个记录具有相同的created时间戳值。 结果,我需要找到borr ...

7 优化Sqlite查询:子查询中的分组

我有一个非常简单的Sqlite模式,用于按用户操作记录每日计数,并按天和操作记录各种用户操作延迟百分比: 这里所有日期都存储为每天午夜的Unix时间戳(如果有帮助,我可以更改)。 现在,这是一个我在苦苦挣扎的查询:显示上周按平均交易量降序排列的操作,包括平均延迟百分位分别为50%, ...

9 在MySQL中优化查询-联接和子查询?

我有几个表:一个用户表和一个记录他们可以执行的各种操作(即下载,阅读,测验等)的表。 我正在尝试生成一个表格,列出每个用户以及他们迄今为止采取的行动数量。 我在每个子查询中加入了用户记录表,因为我发现它使行数减少了大约一半。 但是,查询仍然花费太多时间。 如何进一步优化此查询,或创 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM