SQL Server中的"WITH SCHEMABINDING"的缺点是什么?

Sql*_*yan 58 sql sql-server query-optimization schemabinding

我有一个包含数百个笨拙命名表的数据库(CG001T,GH066L等),我对每个人都有"友好"名称的观点(例如,"CUSTOMERS"视图是"SELECT*FROM GG120T") .我想在我的视图中添加"WITH SCHEMABINDING",以便我可以获得与之相关的一些优点,例如能够索引视图,因为少数视图已经计算了动态计算成本昂贵的列.

SCHEMABINDING这些观点是否存在缺点?我发现一些文章含糊地暗示了缺点,但从未详细介绍过它们.我知道一旦视图是模式绑定的,你就不能在没有先删除视图的情况下改变任何会影响视图的内容(例如,列数据类型或排序规则),所以这是一个,但除此之外?似乎索引视图本身的能力远远超过了更仔细地规划模式修改的缺点.

Dan*_*n S 44

您将无法更改/删除表,除非您先删除视图.

  • 您不需要删除视图本身,只需更改它以使其不受架构限制,然后将其更改为ALTER. (18认同)
  • 这在我看来是个大问题,特别是如果你想在没有原始DDL语句的情况下修改数据库结构.在这些情况下,您必须尝试使用​​SCHEMABINDING为视图/函数生成完整的DDL语句,删除它们然后重新创建它们.要改变列的大小,这是一项非常重要的任务. (3认同)

use*_*674 31

哦,使用SCHEMABINDING 确实存在明显的下降 - 这些来自实际的SCHEMABINDING,特别是当与COMPUTED列结合"LOCKS"时,关系并使得一些"微不足道的变化"几乎不可能.

  1. 创建一个表.
  2. 创建一个SCHEMABOUND UDF.
  3. 创建一个引用UDF的COMPUTED PERSISTED列.
  4. 在所述列上添加INDEX.
  5. 尝试更新UDF.

祝一切顺利!

  1. 无法删除或更改UDF,因为它是SCHEMABOUND.
  2. COLUMN无法删除,因为它在INDEX中使用.
  3. COLUMN无法更改,因为它是COMPUTED.

好吧,特朗克.真..!?!我的日子刚刚变成了PITA.(现在,像ApexSQL Diff这样的工具可以在提供修改的模式时处理这个问题,但问题是我甚至无法修改模式开始!)

我并不反对SCHEMABINDING,在这种情况下(在这种情况下它需要UDF),但我反对那里没有(我能找到)"临时禁用"SCHEMABINDING的方法.

  • "1. UDF不能删除或更改,因为它是SCHEMABOUND." 不,这与架构绑定的作用相反."3. COLUMN无法更改,因为它是COMPUTED." 咦?你什么意思? (2认同)

gbn*_*gbn 27

一个都没有.它更安全.我们到处都用它.

  • 如果没有缺点,而且更安全(这是我最初的印象),那么为什么人们不会使用它呢?似乎保护您的视图免受意外破坏将是一个优先事项,或者它应该是相反的方式 - WITH是默认设置,如果您想要这种行为,则必须声明您的视图. (5认同)
  • 我在一个月前就已经发生了这种情况 - 我更改了一个基础表,并且视图被完全归结为结果.事实证明,使用SELECT*FROM的视图,我必须先刷新视图,然后才意识到底层架构已经改变:) (3认同)
  • @Triynko:这有充分的理由.不允许对需要影响整个索引视图的基表进行任何更改.例如,仅对已更改的行很容易计算SUM.另外,我不认为盲桌娱乐是一个好主意:高级SQL和这种开发不混合 (3认同)
  • 懒惰,过多的纪律(例如合格的专栏等) (2认同)

Tri*_*nko 6

一个缺点是,如果您架构绑定一个视图,它只能引用其他架构绑定视图。

我知道这一点是因为我试图对视图进行架构绑定,但遇到了一条错误消息,告诉我它不能被架构绑定,因为它引用的其他视图之一也不是架构绑定的。

这样做的唯一后果是,如果您突然想要更新架构绑定视图以引用某个新视图或现有视图,您可能还必须架构绑定该新视图或现有视图。在这种情况下,您将无法更新视图,您最好希望您的数据库开发人员知道如何使用模式绑定视图。