検索ボックスに入力した文字で始まる地名を検索したい。一部の地名には、他の言語での代替名があります。これらの代替名は別のテーブルに格納されます。
GN_Name 1 - 0:N GN_AlternateName
(PK)GN_Name.GeoNameId == (FK)GN_AlternateName.GeoNameId
最初に GN_AlternateName.AlternateName で名前を検索し、それが存在しない場合は、対応する GN_Name.Name を使用します。
次のLINQクエリを書きました:
return (from name in db.GN_Name
where name.CountryCode == "se"
join alt in db.GN_AlternateName
on name.GeoNameId equals alt.GeoNameId into outer
from alt in outer.DefaultIfEmpty()
where ((alt.IsoLanguage == "sv" &&
alt.AlternateName.StartsWith(query)) ||
name.Name.StartsWith(query))
select new GeoNameModel {
Language = alt.IsoLanguage,
Name = (alt == null ? name.Name : alt.AlternateName),
FeatureClass = name.FeatureClass,
FeatureCode = name.FeatureCode,
GeoNameId = name.GeoNameId,
UniqueName = name.UniqueName,
UniqueCount = name.UniqueCount}).Take(HB.AutoCompleteCount);
これは、次の SQL に変換されます。
exec sp_executesql N'SELECT
[Limit1].[GeoNameId] AS [GeoNameId],
[Limit1].[IsoLanguage] AS [IsoLanguage],
[Limit1].[C1] AS [C1],
[Limit1].[FeatureClass] AS [FeatureClass],
[Limit1].[FeatureCode] AS [FeatureCode],
[Limit1].[UniqueName] AS [UniqueName],
[Limit1].[UniqueCount] AS [UniqueCount]
FROM ( SELECT TOP (5)
[Extent1].[GeoNameId] AS [GeoNameId],
[Extent1].[FeatureClass] AS [FeatureClass],
[Extent1].[FeatureCode] AS [FeatureCode],
[Extent1].[UniqueName] AS [UniqueName],
[Extent1].[UniqueCount] AS [UniqueCount],
CASE WHEN ([Extent2].[AlternateNameId] IS NULL) THEN [Extent1].[Name] ELSE [Extent2].[AlternateName] END AS [C1],
[Extent2].[IsoLanguage] AS [IsoLanguage]
FROM [dbo].[GN_Name] AS [Extent1]
LEFT OUTER JOIN [dbo].[GN_AlternateName] AS [Extent2] ON [Extent1].[GeoNameId] = [Extent2].[GeoNameId]
WHERE (''se'' = [Extent1].[CountryCode]) AND (((''sv'' = [Extent2].[IsoLanguage]) AND ([Extent2].[AlternateName] LIKE @p__linq__0 ESCAPE N''~'')) OR ([Extent1].[Name] LIKE @p__linq__1 ESCAPE N''~''))
) AS [Limit1]',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=N'ja%',@p__linq__1=N'ja%'
何が問題なのかよくわかりませんが、完了するまでに約 5 秒かかります。
インデックスを追加する必要がありますか?たぶん、インデックス付きビューを設定しますか? 私の SQL サーバーの知識は限られているので、実際のコーディングに戻りたいと思っています ;)
どんな提案でも大歓迎です!
UPDATE
私はSQLサーバー2008を使用しています.taylonrの指示に従って、次の結果を得ました。
全体の100%を占める「パーツ」は3つ。ただし、これらの統計をどのように使用するかについての手がかりはありません。
更新 2
SSMS 実行計画は、次のインデックスを推奨しました。
CREATE NONCLUSTERED INDEX IX_GN_Name_CountryCode
ON [dbo].[GN_Name] ([CountryCode])
INCLUDE ([GeoNameId],[Name],[FeatureClass],[FeatureCode],[UniqueName],[UniqueCount])
それを追加したところ、クエリの実行が大幅に改善されました。
UPDATE 3 taylonr は、LIKE 句を 1 つだけ使用することを提案しています。これを達成する方法がわかりません。挑戦する人はいますか?