加速这个查询

时间:2013-09-24 11:46:15

标签: sql sql-server tsql sql-server-2012

这是我的查询大约需要1.5秒。我可以降低这个吗?

SELECT * 
FROM 
    (SELECT 
        ROW_NUMBER() OVER (ORDER BY NAME asc) peta_rn, 
        peta_query.* 
     FROM 
         (SELECT 
              BOOK, PAGETRIMMED, NAME, TYPE, PDF 
         FROM 
              CCWiseDocumentNames2 cdn
         INNER JOIN 
              CCWiseInstr2 cwi ON cwi.ID = cdn.ID) as peta_query) peta_paged 
WHERE 
    peta_rn > 1331900 AND peta_rn <= 1331950

这些是我的表结构:

CREATE TABLE [dbo].[CCWiseDocumentNames2](
    [ID] [int] NULL,
    [BK_PG] [varchar](50) NULL,
    [NAME] [varchar](100) NULL,
    [OTHERNAM] [varchar](100) NULL,
    [TYPE] [varchar](50) NULL,
    [INDEXNAME] [varchar](50) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[CCWiseInstr2](
    [ID] [int] NULL,
    [BK_PG] [varchar](50) NULL,
    [DATE] [datetime] NULL,
    [ITYPE] [varchar](50) NULL,
    [BOOK] [int] NULL,
    [PAGE] [varchar](50) NULL,
    [NOBP] [varchar](50) NULL,
    [DESC] [varchar](240) NULL,
    [TIF] [varchar](50) NULL,
    [INDEXNAME] [varchar](50) NULL,
    [CONFIRM] [varchar](50) NULL,
    [PDF] [varchar](50) NULL,
    [PAGETRIMMED] [varchar](10) NULL,
    [PageINT] [int] NULL,
    [PageCHAR] [varchar](2) NULL,
    [IdAuto] [int] NOT NULL
) ON [PRIMARY]

这是我的执行计划:

enter image description here

正如您所看到的,它是97%聚簇索引搜索和3%索引扫描。有进一步改进此查询的方法吗?

2 个答案:

答案 0 :(得分:4)

您无法动态添加行号超过一百万行,并且期望where子句会立即识别具有新生成的行号的行。

答案 1 :(得分:0)

因为我没有那么大量的数据,所以只能提供一些供您考虑的选项:

为Name列专用聚集索引(ID除外) 在获取row_number over name之后进行连接。 将CCWiseInstr2中的三列包含在ID列的非聚集索引中。这可以节省一些硬盘主轴的运动。只有大量数据才能观察到性能增益。

CREATE NONCLUSTERED INDEX  [idx2_ID_include] ON [dbo].[CCWiseInstr2] ([ID] ASC) INCLUDE ( [BOOK], [PDF], [PAGETRIMMED]) 
GO

With a as (
    Select * 
    from (  SELECT  ROW_NUMBER() OVER (ORDER BY NAME asc) as  peta_rn, ID, 
                    type 
            from    CCWiseDocumentNames2) as Temp 
            where   peta_rn > 1331900 AND peta_rn <= 1331950
) 
select  a.peta_rn, 
        a.type, 
        b.book, 
        b.PAGETRIMMED, 
        b.PDF
from    a 
join    CCWiseInstr2 as b on a.id = b.id