【问题标题】:Not able to create index on schema binding view无法在模式绑定视图上创建索引
【发布时间】:2019-08-23 16:37:13
【问题描述】:

无法在以下架构绑定视图上创建索引。它是从另一个视图 (v_prod_manu_sub) 创建的。它显示以下错误消息:

无法在视图“dbo.V_PROD_MANU”上创建索引,因为它引用派生表“X”(由 FROM 子句中的 SELECT 语句定义)。考虑删除对派生表的引用 或不索引视图。

如何更改以下查询以创建索引

ALTER VIEW [dbo].[V_PROD_MANU] WITH SCHEMABINDING AS
SELECT X.PRODUCT, CAST(RIGHT(TEXT_CODE,LEN(F_TEXT_CODE)-1) AS VARCHAR(30)) AS TEXT_CODE,
    CAST(SUBSTRING(RIGHT(PHRASE,LEN(F_PHRASES)-1),9,LEN(F_PHRASE)-3) AS varchar(700)) AS PHRASE
    FROM (
    SELECT V1.PRODUCT,
    (SELECT ',' + V2.TEXT_CODE FROM dbo.V_PROD_MANU_SUB V2 WHERE V1.PRODUCT = V2.PRODUCT ORDER BY V2.F_COUNTER  FOR XML PATH('')) AS TEXT_CODE,
    (SELECT ' |par|par ' + V3.F_PHRASE FROM dbo.V_PROD_MANU_SUB V3 WHERE V1.PRODUCT = V3.PRODUCT ORDER BY V3.F_COUNTER FOR XML PATH('')) AS PHRASE
FROM dbo.V_PROD_MANU_SUB  V1 GROUP BY V1.PRODUCT)X

输出:

Product         TEXT_CODE                PHRASE 
00-021      MANU0043,MANU0050     Inc |par  Pharmaceuticals Group |par  235 East 5nd Street |par usa |par 1-800-123-000

【问题讨论】:

标签: sql-server-2012 subquery indexed-view


【解决方案1】:

通常人们使用STUFF() 删除前导逗号,而不是这些混乱的转换和LEN() 计算。例如:

SELECT V1.PRODUCT,
    TEXT_CODE = STUFF
    (
      (
        (SELECT ',' + V2.TEXT_CODE 
           FROM dbo.V_PROD_MANU_SUB AS V2 
           WHERE V1.PRODUCT = V2.PRODUCT 
           ORDER BY V2.F_COUNTER  
           FOR XML PATH, TYPE).value('.[1]','nvarchar(max)')
      ),
    1,1,N'')
FROM dbo.V_PROD_MANU_SUB AS V1 
GROUP BY V1.PRODUCT;

-- much easier in SQL Server 2017 with STRING_AGG()

但这似乎与您首先需要具体化逗号分隔列表的原因无关,无论它是否有前导逗号。

索引视图通常是过早优化的一种形式。本质上,您是在说,“查询这些数据的成本将远远高于维护它的成本。”你知道吗?如何?您的工作负载平衡(读:写)是多少?现在查询有多慢?它多久运行一次?更新需要多长时间?

如果您确实知道这一点,那么您会更幸运地通过触发器手动将其具体化到您自己的表中。由于各种原因,索引视图很可能会成为死胡同。

【讨论】:

  • 是的。我在上面创建了查询。它工作正常。但无法在上面的视图上创建索引。因为这个视图包含子查询。没有子查询是否可以实现上述逻辑?
  • @Ram 不,我想不出一种可以让您避免子查询的方法,除非您按照我在回答结尾处的建议首先具体化数据。在 SQL Server 2017 中,您可以使用 STRING_AGG() 来避免子查询,但您仍然无法索引这样的视图。我仍然认为这是一个奇怪的问题。您在问“如何避免在此视图中使用子查询,以便在其上创建索引?”相反,您应该询问您认为索引可以解决的实际问题。除了索引视图之外,可能还有其他解决方案。
猜你喜欢
  • 2014-02-04
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多