編輯:我已經閱讀了一些關於這個主題,並已經意識到,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)
,以及Gloss
和Glosslen
上的索引。這是由我正在爲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數據庫是從安裝文件夾以只讀方式打開的。
不,如果索引需要重建,你會得到一個錯誤。索引問題涉及Windows Mobile,而不是Phone – ErikEJ