SQL Server:简单选择上极慢的表

时间:2017-01-05 14:27:54

标签: sql-server azure query-optimization

我正在处理Azure上的一个SQL Server,我发现了一个罕见的情况,即单个表上的查询非常慢,对于一个有大约一千行的表超过10-12秒,而类似的表响应较少那1秒钟。

表定义(脚本创建)是:

CREATE TABLE [dbo].[Content] 
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Content_ID] [int] NOT NULL,
    [CultureCode] [nvarchar](50) NOT NULL,
    [Version] [int] NOT NULL,
    [UserID] [int] NOT NULL,
    [Timestamp] [datetime] NOT NULL,
    [Title] [nvarchar](max) NOT NULL,
    [Subtitle] [nvarchar](max) NULL,
    ... 14 more [nvarchar](max) FIELDS...
    [NotesPlainText] [nvarchar](max) NULL,

    CONSTRAINT [PK_dbo.Content] 
         PRIMARY KEY CLUSTERED ([ID] ASC)
                     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                           IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                           ALLOW_PAGE_LOCKS = ON)
)

(列Content_IDCultureCodeVersion似乎是一个独特的组合,甚至未在表格中设置。[ID]仅用作行标识符)

除了17列所有nvarchar(max)之外,没有别的奇怪。

正如我所说,没有唯一的定义,没有索引...

所以我调整为

CREATE TABLE [dbo].[Content_optimized]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Content_ID] [int] NOT NULL,
    [CultureCode] [nvarchar](50) NOT NULL,
    [Version] [int] NOT NULL,
    [UserID] [int] NOT NULL,
    [Timestamp] [datetime] NOT NULL,
    [Title] [nvarchar](max) NOT NULL,
    [Subtitle] [nvarchar](max) NULL,
    ... 14 more [nvarchar](max) FIELDS...
    [NotesPlainText] [nvarchar](max) NULL,
)

CREATE INDEX IDX_dbo_Content_optimized__Content_ID 
       ON [dbo].[Content_optimized]([Content_ID])
CREATE INDEX IDX_dbo_Content_optimized__CultureCode 
       ON [dbo].[Content_optimized]([CultureCode])
CREATE INDEX IDX_dbo_Content_optimized__Version 
       ON [dbo].[Content_optimized]([Version])
CREATE INDEX IDX_dbo_Content_optimized__UserID 
       ON [dbo].[Content_optimized]([UserID])

ALTER INDEX ALL ON [dbo].[Content_optimized] REBUILD WITH (FILLFACTOR=90, ONLINE=ON) 

在这里,事情变得奇怪,我甚至没有保存一秒钟的执行。

确实是这样的代码:

select * 
from [Content]  
where Content_ID <> 1049 
order by Content_ID, Version

select * 
from [Content_optimized]  
where Content_ID <> 1049 
order by Content_ID, Version

给出了执行计划的53%和47%(因为INDEXs只增加了11%)

当然我对SQL优化比较陌生,所以我在这里看到的东西可能很明显,但我现在却迷失了它。

任何帮助?

0 个答案:

没有答案