0

編集:このトピックについてもう少し読んだところ、提案されていることとは反対に、デスクトップアプリケーション用に生成した同じ .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 用に開発しているクロス プラットフォーム アプリケーションで使用されます。GlossGlosslen

次に、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 データベースがインストール フォルダーから読み取り専用として開かれることです。

4

1 に答える 1

0

あなたは何も悪いことをしていませんが、WP7 != Windows. インデックスが広すぎるために同様の問題が発生したため、最初の12文字のみの列を作成し、インデックスを作成して検索しました。

于 2012-06-04T11:23:07.583 に答える