使用 CTE 索引视图

2024-01-11

所以,我刚刚发现 SQL Server 2008 不允许您在定义中使用 CTE 索引视图,但它允许您alter要添加的查询with schemabinding在视图定义中。这有充分的理由吗?出于某种我不知道的原因,这是否有意义?我的印象是WITH SCHEMABINDING的主要目的是允许您为视图建立索引

新增并改进了更多查询操作

;with x
as
(
    select   rx.pat_id
            ,rx.drug_class
            ,count(*) as counts
            from rx
            group by rx.pat_id,rx.drug_class

)
select   x.pat_id
        ,x.drug_class
        ,x.counts
        ,SUM(c.std_cost) as [Healthcare Costs]
    from x
    inner join claims as c
    on claims.pat_id=x.pat_id
    group by x.pat_id,x.drug_class,x.counts

以及创建索引的代码

create unique clustered index [TestIndexName] on [dbo].[MyView]
( pat_id asc, drug_class asc, counts asc)

  1. 您无法使用 CTE 为视图建立索引。尽管景色can have SCHEMABINDING。这样想吧。为了对视图建立索引,它必须满足两个条件(以及许多其他条件):(a) 它已被创建WITH SCHEMABINDING(b) 它不包含 CTE。为了模式绑定视图,它确实not需要满足不包含CTE的条件。

  2. 我不相信存在视图具有 CTE 的情况and将受益于被索引。这与您的实际问题无关,但我的直觉是您正在尝试索引此视图以神奇地使其更快。索引视图不一定比针对基表的查询快——存在限制是有原因的,并且只有在特定的用例中它们才有意义。请注意,不要盲目地将您的所有视图索引为神奇的“更快”按钮。另请记住,索引视图需要维护。因此,它将增加工作负载中影响基表的所有 DML 操作的成本。

  3. 模式绑定是not仅用于索引视图。也可以用 诸如 UDF 之类的东西可以帮助说服决定论,可以用于 视图和函数以防止更改底层架构,以及 在某些情况下,它可以提高性能(例如,当 UDF 不受模式限制,优化器可能必须创建一个表假脱机 处理任何底层 DDL 更改)。所以请不要认为它是 奇怪的是,您可以架构绑定视图,但无法对其建立索引。 索引视图需要它,但这种关系不是相互的。


对于您的具体场景,我建议这样做:

CREATE VIEW dbo.PatClassCounts
WITH SCHEMABINDING
AS
  SELECT pat_id, drug_class, 
      COUNT_BIG(*) AS counts
    FROM dbo.rx
    GROUP BY pat_id, drug_class;
GO
CREATE UNIQUE CLUSTERED INDEX ON dbo.PatClassCounts(pat_id, drug_class);
GO
CREATE VIEW dbo.ClaimSums
WITH SCHEMABINDING
AS
  SELECT pat_id, 
    SUM(c.std_cost) AS [Healthcare Costs], 
    COUNT_BIG(*) AS counts
  FROM dbo.claims
  GROUP BY pat_id;
GO
CREATE UNIQUE CLUSTERED INDEX ON dbo.ClaimSums(pat_id);
GO

现在您可以创建一个非索引视图,该视图仅在这两个索引视图之间进行联接,并且它将利用索引(您可能必须使用NOEXPAND在较低版本上,不确定):

CREATE VIEW dbo.OriginalViewName
WITH SCHEMABINDING
AS
    SELECT p.pat_id, p.drug_class, p.counts, c.[Healthcare Costs]
      FROM dbo.PatClassCounts AS p
      INNER JOIN dbo.ClaimSums AS c
      ON p.pat_id = c.pat_id;
GO

现在,这一切都假设值得预先聚合这些信息 - 如果您不经常运行此查询,但数据修改很多,那么最好不要创建索引视图。

另请注意,SUM(std_cost)来自ClaimSums每个视图的视图都是相同的pat_id + drug_class组合,因为它仅聚合到pat_id。我想可能有一个drug_class in the claims表也​​应该是连接标准的一部分,但我不确定。如果是这样的话,我认为这可以折叠为单个索引视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CTE 索引视图 的相关文章

  • T-SQL:用最新的非空值替换 NULL 的最佳方法?

    假设我有这张表 id value 1 5 2 4 3 1 4 NULL 5 NULL 6 14 7 NULL 8 0 9 3 10 NULL 我想编写一个查询来替换任何NULL值与表中最后一个不为空的值在那一栏里 我想要这个结果 id va
  • Oracle:如何获取刚刚插入的行的序列号?

    如何获取刚刚插入的行的序列号 插入 返回 declare s2 number begin insert into seqtest2 x values aaa returning seq into s2 dbms output put lin
  • 检查两个“select”是否相等

    有没有办法检查两个 非平凡的 选择是否等效 最初我希望两个选择之间有形式上的等价 但是答案在证明 sql 查询等价性 https stackoverflow com questions 56895 proving sql query equ
  • 根据日期顺序排名

    我的数据如下 Heading Date A 2009 02 01 B 2009 02 03 c 2009 02 05 d 2009 02 06 e 2009 02 08 我需要如下排名 Heading Date Rank A 2009 02
  • Sequelize.js 中的自定义或覆盖连接

    我需要使用创建自定义连接条件Sequelize js http sequelizejs com使用 MSSQL 具体来说 我需要加入TableB基于一个COALESCE中的列的值TableA and TableB并最终得到这样的连接条件 L
  • 意外的查询结果

    为什么我从 sql server 得到以下结果 SELECT 12 C1 CONVERT int C2 CASE WHEN THEN equal ELSE not equal END C3 Sql Server Fiddle 演示 http
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 内置函数将每个单词的第一个字母大写

    如果 SQL Server 中已存在此类函数 我不想为此创建自定义函数 输入字符串 This is my string to convert预期输出 This Is My String To Convert SET ANSI NULLS O
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • SQL Server 数据库架构版本控制和更新

    对于我的应用程序 我必须支持更新方案 并且数据库可能会受到影响 我希望能够从旧版本更新到最新版本 而无需安装中间版本 例如 假设我有版本 A 最旧的版本 B 中间版本 和 C 新版本 我希望能够将版本 A 直接更新到版本 C 对于应用程序文
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • 如何通过SQL查询检查是否有JSON函数?

    有SQL 2016 中的 JSON 函数 https learn microsoft com en us sql t sql functions json functions transact sql例如 JSON VALUE JSON Q
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR

随机推荐

  • 将 À 等特殊字符与常规 A 进行比较

    在某些语言中 有类似的字母 我看到对于表视图部分 本机 iOS 将 在同一部分下A 我想做同样的事情 我通过比较第一个字母来构建我的部分 所以我需要那个 将等于 A 我尝试使用localizedCompare但我仍然不知道这两者是相等的 有
  • 使用 CustomAttributes 与 GetCustomAttributes() 的优点

    今天我注意到我的智能感知中出现了一些新属性System Type我的 NET 4 5 项目的对象 其中有一个叫做CustomAttributes 我对此很感兴趣 因为我之前就明白GetCustomAttributes是最昂贵的反射调用之一
  • C 编程自动八进制解释

    Code 1 int a 0987654321 printf d a Code 2 int a scanf d a printf d a 在这里 如果我们输入 0987654321 那么它会打印相同的内容 但在第一个代码片段中 它会给出一个
  • 基本PHP MySQL数组分组问题

    快速问题 我认为对于像我一样拥有最基本的 PHP MySQL 知识的人来说 这是一个非常简单的解决方案 我有一个存储在数据库中的各个州的城市列表 其中包含城市 州和一些其他变量 现在 它们被提取为按城市名称排序的列表 阿拉斯加安克雷奇 马里
  • DataGridView显示行标题单元格

    我正在尝试显示链接到 DataTable 的简单 DataGridView 并且最终我希望 DataTable 中的第一列成为 DataGridView 的行标题单元格 此时 我将满足于在行标题单元格中包含任何值 我可以显示带有所有行和列以
  • 标识符未定义

    我使用 VS2012 Express 用 C 编写了以下代码 void ac search uint num patterns uint pattern length const char patterns uint num records
  • 卷曲远程图像并调整其大小

    我使用此脚本来下载远程图像并调整其大小 在调整大小部分出现问题 它是什么
  • Android 使用自签名证书连接到服务器

    编辑 下面的代码工作正常 没有错误 没有异常 我知道关于这个主题的大量问题 以及谷歌想到的许多博客 我已通读它们并设法想出我将要解释的内容 我的疑问在于 我的方法正确吗 它有副作用吗 以及在我解释我的方法时最好提出的另一个问题 我基于此方法
  • NIO getParentFile().mkdir() [重复]

    这个问题在这里已经有答案了 有没有一种方法可以一次性创建文件和目录 如下所示 使用 Java 7 和 NIO 路径和文件静态方法 在哪里您不必键入路径 然后将文件分成单独的行 代码 File file new File Library te
  • 当调用clock_gettime()时返回的tv_nsec字段实际上可能超过一秒吗?

    当你调用clock gettime 它返回一个 timespec 结构 struct timespec time t tv sec seconds long tv nsec nanoseconds 我在手册页中没有找到 tv nsec 不会
  • 从连续的字序列中提取任意范围的位的最有效方法是什么?

    假设我们有一个std vector 或任何其他序列容器 有时它是一个双端队列 它存储uint64 t元素 现在 让我们将该向量视为一个序列size 64连续的位 我需要找到由给定的位组成的单词 begin end 范围 鉴于end begi
  • UItableVIew 中的效果或动画

    当我单击 tableView 时 它会显示类似这样的内容以显示详细信息 我怎样才能做到这一点 我认为你需要的是一个类似于手风琴的实现 以下是一些示例参考 您可以从这里开始 如何为 iPhone SDK 应用程序实现手风琴视图 https s
  • 一个由两个弹性项目组成的弹性盒网格,其中一个弹性项目旁边有一个[重复]

    这个问题在这里已经有答案了 我想在左侧放置一个 div 在右侧放置两个 div 这bottomright应始终低于topRight分区这topRight是唯一一个高度可变的 div 我目前正在尝试使用flexbox你可以在我下面的代码中看到
  • OpenCV 上的 Libpng 冲突?

    我正在尝试使用以下代码在 XCode 4 4 Mountain Lion 上打开 png 文件 适用于 jpg 文件 Mat image imread Users user name Desktop result png imshow im
  • Kafka Connect 不支持主题策略

    Context 我编写了几个小代码卡夫卡连接 https docs confluent io current connect index html连接器 一个每秒生成随机数据 另一个将其记录在控制台中 它们集成了一个模式注册表 https
  • 单击后退按钮两次以使用 rxjava 退出活动

    寻找一种微妙的接收方法来退出活动 同时按两次后退按钮 boolean doubleBackToExitPressedOnce false Override public void onBackPressed if doubleBackToE
  • content.select() 不适用于 元素

    我正在尝试制作一个按钮来选择 a 的内容 code 元素 但是 它不起作用 我得到了 content select 不是一个函数 div div code
  • 基于输入的变量

    Python版本 3 5 所以我想知道如何根据用户的输入设置变量 例如 如果用户要回答7对此 居民 输入 你家有多少人住 编辑 如果他们输入7 我怎样才能询问每个人的名字 Thanks def get int prompt while Tr
  • 如何进行 FST(有限状态换能器)组合

    考虑以下 FST T1 0 1 a b 0 2 b b 2 3 b b 0 0 a a 1 3 b a T2 0 1 b a 1 2 b a 1 1 a d 1 2 a c 如何对这两个 FST 即 T1 o T2 执行组合操作 我看到了一
  • 使用 CTE 索引视图

    所以 我刚刚发现 SQL Server 2008 不允许您在定义中使用 CTE 索引视图 但它允许您alter要添加的查询with schemabinding在视图定义中 这有充分的理由吗 出于某种我不知道的原因 这是否有意义 我的印象是W