小编EBa*_*arr的帖子

选择索引视图的聚集索引的因素有哪些?

简而言之,
哪些因素会影响查询优化器对索引视图索引的选择?

对我来说,索引视图似乎违背了我对优化器如何选择索引的理解。我之前看过这个问题,但 OP 并没有得到很好的接受。 我真的在寻找 guideposts,但我会编造一个伪示例,然后发布带有大量 DDL、输出、示例的真实示例。

假设我使用的是 Enterprise 2008+,理解 with(noexpand)

伪示例

以这个伪示例为例:我创建了一个包含 22 个连接、17 个过滤器和一个跨越 1000 万行表的马戏团小马的视图。这种观点实现起来很昂贵(是的,大写 E)。我将对视图进行 SCHEMABIND 和索引。然后一个 SELECT a,b FROM AnIndexedView WHERE theClusterKeyField < 84. 在我不知道的优化器逻辑中,执行了底层连接。

结果:

  • 无提示:4825 次读取 720 行,47 个 cpu 超过 76 毫秒,估计子树成本为 0.30523。
  • 使用提示:17 次读取,720 行,4 毫秒内 15 个 cpu,估计子树成本为 0.007253

那么这里发生了什么?我已经在Enterprise 2008、2008-R2 和 2012 中尝试过。根据我能想到的每个指标,使用视图索引的效率要高得多。我没有参数嗅探问题或倾斜的数据,因为这是临时的。

一个真实(长)的例子

除非你是一个受虐狂,否则你可能不需要或不想阅读这部分。

是的
,企业

Microsoft SQL Server 2012 - 11.0.2100.60 (X64) 2012 年 2 月 10 日 19:39:15 …

sql-server clustered-index materialized-view index-tuning

19
推荐指数
1
解决办法
2506
查看次数

设计模式 - 许多父表之一

我经常在数据库中遇到一种情况,其中给定的表可以 FK 到许多不同的父表中的一个。我已经看到了这个问题的两种解决方案,但都不是个人满意的。我很好奇你在那里看到了什么其他模式?有没有更好的方法来做到这一点?

一个人为的例子
假设我的系统有Alerts. 可以接收各种对象的警报——客户、新闻和产品。一个给定的警报可以只针对一个项目。无论出于何种原因,客户、文章和产品都在快速移动(或本地化),因此在创建警报时无法将必要的文本/数据拉入警报。鉴于此设置,我看到了两种解决方案。

注意:下面的 DDL 是针对 SQL Server 的,但我的问题应该适用于任何 DBMS。

解决方案 1 -- 多个可空 FKey

在此解决方案中,链接到多个表之一的表具有多个 FK 列(为简洁起见,下面的 DDL 不显示 FK 创建)。 好处- 在这个解决方案中,我有外键很好。FK 的空优化使得添加准确数据变得方便且相对容易。THE BAD Querying 不是很好,因为它需要N LEFT JOINS 或N UNION 语句来获取关联数据。在 SQL Server 中,特别是 LEFT JOINS 阻止创建索引视图。

CREATE TABLE Product (
    ProductID    int identity(1,1) not null,
    CreateUTC    datetime2(7) not null,
     Name        varchar(100) not null
    CONSTRAINT   PK_Product Primary Key CLUSTERED (ProductID)
)
CREATE TABLE Customer (
    CustomerID  int identity(1,1) …
Run Code Online (Sandbox Code Playgroud)

database-design

13
推荐指数
1
解决办法
2928
查看次数