【发布时间】:2013-02-23 14:06:54
【问题描述】:
我在数据库中定义了以下表
购物桌
- 店铺编号
- 店名
- 所有者
- 横幅
- 标题
- 城市标识
- ShopImageId
- 活动
城市表
- 城市标识
- 城市名称
- 国家标识
- 区域标识
国家/地区表
- 国家标识
- 国名
- 区域标识
地区
- 区域标识
- 地区名称
商店图片
- 身份证
- 图片
- 店铺编号
这是我的选择查询
SELECT ShopName, Owner, CityName, CountryName,RegionName
FROM Shop S
INNER JOIN City CT ON CT.CityId=S.CityId
INNER JOIN Country CO ON CO.CountryId=CT.CountryId
INNER JOIN Region R ON CT.RegionId=R.RegionId
LEFT OUTER JOIN ShopImages SI ON S.ShopImageId=SI.Id
WHERE S.Banner like '%restaurant%' OR S.Description like '%restaurant%'
AND S.CityId=10 AND S.Active=1
截至目前,city table 有大约 3,000,000 条记录,Shop 有 40,000,000 + 条记录。
获取记录需要时间。所有聚簇索引(主键)都已定义。
我正在尝试在 DTA(Database Tuning Advisor)的帮助下进行优化。 它建议我添加以下索引
CREATE NONCLUSTERED INDEX
[_dta_index_CITY_9_2098106515__K9_K20_K1_K2] ON [dbo].[CITY]
(
[COUNTRYID] ASC,
[REGIONID] ASC,
[CITYID] ASC,
[CITYNAME] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF)
ON [PRIMARY]
是否值得添加此索引?我可以接受 DTA 的所有建议吗?它还建议添加一些统计信息。
如何改进我的上述查询?
【问题讨论】:
-
INNER JOIN Region R ON Region.RegionId=R.RegionId?你确定这是正确的吗? -
@JoachimIsaksson,谢谢。我现在更新了。错字:)
-
不过,我会假设
INNER JOIN Region R ON CT.RegionId=R.RegionId:) -
@JoachimIsaksson,似乎 CT 代表 CITY,它没有映射 RegionId。只有 Country 已映射。所以他是对的!
-
@Murali 是的,我很惊讶 DTA 建议包含 CITY.REGIONID 的索引,如果它甚至不在查询中。
标签: sql sql-server performance sql-server-2008 indexing