2016-11-24 8 views
0

SQL Server 2016があり、ビュー内のjson列のインデックスを作成しようとしています。json列のインデックスを作成する方法SQL Server 2016

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 

を次のように

ビュー自体は、JSON上に構築された私は、_idと日時列の一部にインデックスを構築しようとしています。私はエラーを取得する:

Create failed for Index 'NonClusteredIndex-20161124-152652'. (Microsoft.SqlServer.Smo)

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

Cannot create index on view 'dbo.vTrades'. It does not have a unique clustered index. (Microsoft SQL Server, Error: 1940)

enter image description here

+0

ノンクラスタード・インデックスを作成するには、そのテーブルに一意のクラスタード・インデックスを作成する必要があります。それはエラーメッセージでそう言います。 –

答えて

0

ちょうどあなたのテーブル/ビューに独自のクラスタ化インデックスを作成します。

CREATE UNIQUE CLUSTERED INDEX cu_indx_ID ON vTrades (id); 

次に、ノンクラスタードインデックスを作成することができます。

更新:

貴重な追加的な詳細を認識することが私の答えのコメントを見てみるようにしてください。

+2

**警告:**ビュー**でクラスタ化インデックスを作成すると、(1)多数の前提条件が満たされなければなりません。(2)ビューを「実現」します。物理的にも永続的にも、ビューがディスク上に表示する行(それを実行しない「通常の」ビュー以外)が格納されるため、データベースのサイズが大幅に増加する可能性があります。それだけに気をつけてください! –

+1

'format'と' cast'は非決定論的なので、 'format'を削除し、' cast'の代わりに 'style'を使って' convert'を使わない限りインデックス付きビューを作成することはできません。 –

関連する問題