我正在尝试提高简单查询的性能,该查询返回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,FromNumber
和ToNumber
列是(持久的)计算列。他们有索引:
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毫秒。
有什么建议可以加快速度吗?
答案 0 :(得分:0)
最明显的建议是自己编写查询。期望Entity Framework编写最快的SQL是不现实的。
例如
也许这会更快:
SELECT COUNT_BIG(*)
FROM [dbo].[SMDR_Call]
WHERE [FromNumber] LIKE '1002%'