2015-10-05 38 views
0

我正在嘗試改進一個簡單查詢的性能,該查詢返回nvarchar(64)列FromNumber或列ToNumber以給定前綴(在這種情況下爲'1002')。當使用LIKE'前綴%'篩選兩個nvarchar列時,SQL改進了count(*)

這是當前的SQL查詢(由實體框架所產生):

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] 

的時候,我得到這個查詢是〜800毫秒,2萬條記錄的表。

任何建議使這個更快?

回答

0

最明顯的建議是自己寫查詢。期望Entity Framework編寫最快的SQL是不現實的。

例如

  • 你知道FromNumber數據類型爲nvarchar(64),而不是爲nvarchar(4000),
  • 雙SELECT也是沒有用處的,
  • 通配符表達不使用〜

也許這會更快:

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

我剛試過。性能差異很小,可歸因於實驗誤差。有*是* perf的好處,但是,運行只是SQL查詢,而不是運行參數化的SP(不知道爲什麼) –

+0

很高興你發現了一個加速:-) – buffjape