【问题标题】:how to create a index for json column SQL Server 2016如何为 json 列 SQL Server 2016 创建索引
【发布时间】:2017-04-09 06:37:16
【问题描述】:

我有 SQL Server 2016,我正在尝试为视图中的 json 列创建索引。

视图本身是建立在json之上的,如下

SELECT        
    _id, 
    JSON_VALUE(trade, '$.direction') AS direction, 
    JSON_VALUE(trade, '$.entryprice') AS entryprice, 
    JSON_VALUE(trade, '$.exitprice') AS exitprice, 
    JSON_VALUE(trade, '$.potentialtarget') AS potentialtarget, 
    FORMAT(CAST(JSON_VALUE(trade, '$.entrytime') AS datetimeoffset), 'yyyy-MM-dd HH:mm:ss') AS entrytime, 
    FORMAT(CAST(JSON_VALUE(trade, '$.exittime') AS datetimeoffset), 'yyyy-MM-dd HH:mm:ss') AS exittime, 
    JSON_VALUE(trade, '$.maxfavourable') AS maxfavourable, 
    JSON_VALUE(trade, '$.maxagainst') AS maxagainst, 
    JSON_VALUE(trade, '$.signal') AS signal, 
    JSON_VALUE(trade, '$.instrument') AS instrument, 
    JSON_VALUE(trade, '$.account') AS account, 
    JSON_VALUE(trade, '$.quantity') AS quantity, 
    JSON_VALUE(trade, '$.gains') AS gains, 
    JSON_VALUE(trade, '$.hitedge') AS hitedge, 
    JSON_VALUE(trade, '$.RealizedProfitLoss') AS RealizedProfitLoss, 
    JSON_VALUE(trade, '$.CashValue') AS CashValue, 
    JSON_VALUE(trade, '$.BuyingPower') AS BuyingPower, 
    JSON_VALUE(trade, '$.maxagainst1ATR') AS maxagainst1ATR, 
    JSON_VALUE(trade, '$.maxagainst2ATR') AS maxagainst2ATR, 
    JSON_VALUE(trade, '$.Powerbars') AS powerbars, 
    JSON_VALUE(trade, '$.PowerbarsTime[0]') AS PowerbarsTime1, 
    JSON_VALUE(trade, '$.PowerbarsTime[1]') AS PowerbarsTime2, 
    JSON_VALUE(trade, '$.PowerbarsTime[2]') AS PowerbarsTime3, 
    JSON_VALUE(trade, '$.PowerbarsTime[3]') AS PowerbarsTime4, 
    JSON_VALUE(trade, '$.PowerbarsTime[4]') AS PowerbarsTime5, 
    JSON_VALUE(trade, '$.Powerbarsdetails') AS Powerbarsdetails, 
    JSON_VALUE(trade, '$.entrysignal') AS entrysignal, 
    JSON_VALUE(trade, '$.exitsignal') AS exitsignal
FROM            
    dbo.Trades

我正在尝试在 _id 和一些日期时间列上建立索引。我收到一个错误:

索引“NonClusteredIndex-20161124-152652”的创建失败。 (Microsoft.SqlServer.Smo)

执行 Transact-SQL 语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)

无法在视图“dbo.vTrades”上创建索引。它没有唯一的聚集索引。 (Microsoft SQL Server,错误:1940)

【问题讨论】:

  • 您需要在该表上创建唯一的聚集索引,然后才能创建非聚集索引。它在错误消息中这么说。

标签: sql-server


【解决方案1】:

只需在您的表/视图上创建一个唯一的聚集索引。

CREATE UNIQUE CLUSTERED INDEX cu_indx_ID ON vTrades (id);

那么你应该可以创建你想要的非聚集索引了。

更新:

请务必查看我的答案中的 cmets,以了解有价值的其他详细信息。

【讨论】:

  • 警告:视图 上创建聚集索引 (1) 受限于必须满足的大量先决条件,并且 ( 2)将“物化”视图,例如物理和持久地存储视图在磁盘上显示的行(除了不这样做的“普通”视图),因此您可能会显着增加数据库的大小!请注意这一点!
  • formatcast 是不确定的,因此您无法创建索引视图,除非您删除 format 并将 convertstyle 一起使用而不是 cast
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多