編集:このトピックについてもう少し読んだところ、提案されていることとは反対に、デスクトップアプリケーション用に生成した同じ .sdf ファイルをモバイル用に含めるだけであることに気付きました。デスクトップ/モバイル間でインデックス形式が異なるようです (ここで行うとインデックスが再構築されるため、最初のデータベース接続に時間がかかるという警告を読みました)、インストール フォルダーから読み取り専用としてデータベースを開いています。エンジンがインデックスを変換できないため、インデックスを完全に無視しているのでしょうか?
Entities
私は、約 146,000 行とこれらの列を持つ単一のテーブルを持つ SQL Server CE 3.5 データベースを持っています: 、およびId (int, primary key), Gloss (nvarchar(4000)), GlossLen (int), Meaning (nvarchar(4000)
と のインデックス。これは、Windows (WPF) および WP7.5 用に開発しているクロス プラットフォーム アプリケーションで使用されます。Gloss
Glosslen
次に、LINQ to SQL を使用してデータベースに対して次のクエリを実行します。
(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)
私が直面している問題は、クエリが Windows では妥当な速度 (2 秒以下) で実行される一方で、実際の WP7 デバイス (エミュレーターは WPF とほぼ同じ速度) では非常に遅くなる (6 秒以上) ことです。
私が見る限り、生成された 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 から報告されたクエリの実行プランは次のとおりです。Index Seek->Filter->Sort->Select であるため、テーブル スキャンは実行していません。
CompiledQuery.Compile
また、LINQ クエリで使用して、生成された Func を保存して再利用しようとしましたが、改善は見られませんでした。
私は何を間違っていますか?WP7 と WPF のコード パスの唯一の違いは、WP7 データベースがインストール フォルダーから読み取り専用として開かれることです。