2012-06-04 119 views
0

編輯:我已經閱讀了一些關於這個主題,並已經意識到,contrary to what is suggested,我只是包括我爲移動的桌面應用程序生成相同的.sdf文件。由於似乎桌面/移動設備上的索引格式不同(我已經閱讀了有關第一次數據庫連接的警告,因爲索引已重建,如果這樣做已完成here)並且我將數據庫作爲只讀從安裝文件夾打開,可能會這是引擎完全忽略我的指數,因爲它不能轉換它們?WP7 SQL Server CE查詢優化

我有一個SQL Server CE 3.5數據庫,其中有一個表Entities,它有大約146,000行,這些列是:Id (int, primary key), Gloss (nvarchar(4000)), GlossLen (int), Meaning (nvarchar(4000),以及GlossGlosslen上的索引。這是由我正在爲Windows(WPF)和WP7.5開發的跨平臺應用程序使用的。在Windows

(from d in Entities 
where d.Gloss.StartsWith("searchstring") 
orderby d.GlossLen ascending 
select new 
     { Id = d.Id, WrittenForms = d.Gloss, MeaningsString = d.Meaning, 
      MatchString = d.Gloss, MatchStringLen = d.GlossLen }).Take(200) 

的問題是現在面臨的是,儘管在執行查詢以合理的速度(2秒或更少),它:

然後我使用LINQ to SQL對數據庫運行下面的查詢在實際的WP7設備上變得痛苦地慢(6+秒)(仿真器幾乎和WPF一樣快)。

就我所見,生成的SQL似乎是合理的:以下是LINQPad返回的內容。

SELECT TOP (200) 
    [t0].[Id], [t0].[Gloss] AS [WrittenForms], [t0].[Meaning] AS [MeaningsString], 
    [t0].[GlossLen] AS [MatchStringLen] 
FROM [Entities] AS [t0] 
WHERE [t0].[Gloss] LIKE @p0 
ORDER BY [t0].[GlossLen] 

查詢的報道由Visual Studio執行計劃是:指數Seek->過濾器 - >排序 - >選擇,所以我沒有做一個表掃描。

我也已經嘗試在LINQ查詢中使用CompiledQuery.Compile,存儲生成的Func以供重用,但沒有看到任何改進。

我在做什麼錯? WP7和WPF代碼路徑唯一的區別在於WP7數據庫是從安裝文件夾以只讀方式打開的。

+0

不,如果索引需要重建,你會得到一個錯誤。索引問題涉及Windows Mobile,而不是Phone – ErikEJ

回答

0

你沒有做錯任何事,但WP7!= Windows。我有類似的問題,由索引過寬造成,我創建了一個只有前12個字符的列,並對其進行索引和搜索。

+0

Ouch。不知道爲什麼電話不直接訪問SQLCE引擎,因爲通過避免查詢處理器和直接進入表格,可以將該查詢提高一個數量級。 – ctacke

+0

那麼索引文本列的大小是多少?我可以避開nvarchar(100),還是會變得太大? – lollercoaster

+1

測試,測試,測試.... Ctake:對於插入,更新和刪除,如果您使用rowversion列,查詢處理器將被繞過 - 請參閱我的博客 – ErikEJ