使用LIKE'前缀%'过滤两个nvarchar列时SQL改进计数(*)

时间:2015-10-05 15:04:43

标签: sql sql-server performance entity-framework

我正在尝试提高简单查询的性能,该查询返回nvarchar(64)列FromNumber或列ToNumber以给定前缀开头的行数(' 1002&# 39;,在这种情况下)。

这是当前的SQL查询(由Entity Framework生成):

exec sp_executesql N'SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        COUNT_BIG(1) AS [A1]
        FROM [dbo].[SMDR_Call] AS [Extent1]
        WHERE ([Extent1].[FromNumber] LIKE @p__linq__0 ESCAPE N''~'') 
           OR ([Extent1].[ToNumber] LIKE @p__linq__1 ESCAPE N''~'') 
    )  AS [GroupBy1]',
       N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',
       @p__linq__0=N'1002%',@p__linq__1=N'1002%'

FWIW,FromNumberToNumber列是(持久的)计算列。他们有索引:

CREATE NONCLUSTERED INDEX IX_Call_FromNumber ON dbo.Call ( FromNumber ) 
    WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
        ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

对于具有200万条记录的表,我获得此查询的时间约为800毫秒。

有什么建议可以加快速度吗?

1 个答案:

答案 0 :(得分:0)

最明显的建议是自己编写查询。期望Entity Framework编写最快的SQL是不现实的。

例如

  • 您知道FromNumber是nvarchar(64)而不是nvarchar(4000),
  • 双重SELECT无用,
  • 通配符表达式不使用〜

也许这会更快:

  SELECT COUNT_BIG(*) 
  FROM [dbo].[SMDR_Call]
  WHERE [FromNumber] LIKE '1002%'