我有一个具有以下结构的 SQL Server 表:
CREATE TABLE [dbo].[MyTable]
(
[Row_Id] [bigint] NOT NULL,
[Year_Code] [varchar](100) NOT NULL,
[Row_Values] [text] NULL,
[Date_Refreshed] [datetime] NOT NULL,
CONSTRAINT [PK_MyTable_Row_Id]
PRIMARY KEY CLUSTERED([Row_Id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF
) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[MyTable]
ADD CONSTRAINT [DF_MyTable_Date_Refreshed]
DEFAULT (getdate()) FOR [Date_Refreshed]
GO
CREATE NONCLUSTERED INDEX [IX_MyTable_Code]
ON [dbo].[MyTable] (Year_Code ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
我在此表的顶部创建了一个视图
CREATE VIEW [dbo].[vw_MyTable]
AS
SELECT
JSON_VALUE(CAST([Row_Values] AS varchar(8000)), '$."id"') AS id,
JSON_VALUE(CAST([Row_Values] AS varchar(8000)), '$."year"') AS year_code,
JSON_VALUE(CAST([Row_Values] AS varchar(8000)), '$."emp_id"') AS emp_id,
JSON_VALUE(CAST([Row_Values] AS varchar(8000)), '$."emplocalid"') AS emplocalid,
JSON_VALUE(CAST([Row_Values] AS varchar(8000)), '$."firstname"') AS firstname,
JSON_VALUE(CAST([Row_Values] AS varchar(8000)), '$."lastname"') AS lastname,
JSON_VALUE(CAST([Row_Values] AS varchar(8000)), '$."middlename"') AS middlename,
JSON_VALUE(CAST([Row_Values] AS varchar(8000)), '$."dateofbirth"') AS dateofbirth,
JSON_VALUE(CAST([Row_Values] AS varchar(8000)), '$."race"') AS race,
JSON_VALUE(CAST([Row_Values] AS varchar(8000)), '$."gender"') AS gender
FROM
[dbo].[MyTable]
当我尝试像这样查询视图时:
SELECT
[id], [year_code], [emp_id],
[emplocalid], [firstname], [lastname], [middlename],
[dateofbirth], [race], [gender]
FROM
[dbo].[vw_MyTable]
WHERE
[year_code] = 'yr2023'
我的问题是:正如你所看到的,我在基表上有索引,所以为了获得更好的查询性能,我是否还需要在 SQL Server 视图上创建索引?我没有在 SQL Server 视图上创建索引
不。为了在这里获得良好的性能,您停止滥用 json 列并实际定义您的架构。