【问题标题】:SQL Server 2016 JSON IndexSQL Server 2016 JSON 索引
【发布时间】:2016-08-23 18:36:00
【问题描述】:

我有一张包含数千行的表格,并且每天都会不断增长。一列有一个 JSON 对象,我需要对其运行大量查询。最好的方法是什么?

这是一个查询的示例:

SELECT
    PersonId,
    AccountNumber,
    JSON_VALUE(M.message, '$.PID.PID_5.PID_5_1') as FirstName,
    JSON_VALUE(M.message, '$.PID.PID_5.PID_5_2') as LastName,
    JSON_VALUE(M.message, '$.PID.PID_7.PID_7_1') as DOB,
    JSON_VALUE(M.message, '$.PID.PID_8.PID_8_1') as Gender,
    JSON_VALUE(M.message, '$.PV1.PV1_44.PV1_44_1') As ArrivalTs, 
    JSON_VALUE(M.message, '$.PV2.PV2_3.PV2_3_2') as Reason
FROM 
    dbo.Messages M

为每一列创建索引的最佳选择是什么?

例子:

CREATE UNIQUE CLUSTERED INDEX PK_PersonView ON PersonView
(
    PersonId, FirstName, LastName, DOB, Gender, ArrivalTs, Reason
);

或者我应该创建单独的索引

CREATE INDEX idx_Person_FirstName
    ON Messages(FirstName)

我正在尝试构建可能的快速查询返回,但目前运行速度非常慢。

【问题讨论】:

    标签: json sql-server-2016


    【解决方案1】:

    如果您有 compound 索引,则可能在查询中使用了最左侧的 n 列(在WHERE 子句)。

    因此,如果您有 WHERE DOB = ....WHERE Gender = .... 或类似的东西,您的示例肯定会没有有帮助 - 只有 如果使用了最左边的 n 列。

    如果您的查询几乎总是将您的结果限制在 PersonIdFirstNameLastName 以及可能更多 - 那么一个复合索引 可能 有帮助 .... 否则,较小索引可能是要走的路(在具有高选择性的列上,例如为给定值返回少量行 - Gender 是典型的非高度选择性列,因为任何一个值都是男性或女性将平均返回一半的行 ---> 很可能永远不会被使用 ....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多