我们是否需要在SQL Server视图上创建索引以获得更好的查询性能?

问题描述 投票:0回答:1

我有一个具有以下结构的 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 视图上创建索引

sql sql-server t-sql query-optimization sql-view
1个回答
0
投票

不。为了在这里获得良好的性能,您停止滥用 json 列并实际定义您的架构。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.