我检查,我经常遇到一个缓慢的执行查询的执行。它显示了一张大桌子的表扫描。表扫描和索引
下面是查询:
declare @DateAdded datetime
set @DateAdded = '5/1/2011'
SELECT tblHero.fldHeroName,players.Alliance,
tblHero.fldHeroOwner, players.ActIndex, players.fldPlayerCities,
tblHero.fldHeroLevel, tblHero.fldHeroPower,
players.fldPlayerPrestige, players.fldPlayerName
FROM tblHero INNER JOIN
(
SELECT MAX(fldPlayerCities) AS fldPlayerCities, MAX(fldPlayerAlliance) AS Alliance,
MAX(fldPlayerPrestige) AS fldPlayerPrestige, fldPlayerName,
MAX(fldPlayerPrestige) - AVG(fldPlayerPrestige) AS ActIndex
FROM tblPlayer WHERE (fldPlayerDateAdded >= DATEADD(dd, - 4, @DateAdded)) GROUP BY fldPlayerName
) players
ON tblHero.fldHeroOwner = players.fldPlayerName
WHERE (tblHero.fldHeroIsHistoric = 1 or fldHeroLevel = 100) and
fldHeroDateAdded = @DateAdded
ORDER BY players.ActIndex, players.fldPlayerCities, players.fldPlayerPrestige
从表扫描的谓词是:
[DBO] [tblHero] [fldHeroDateAdded] = [@ DateAdded] AND([DBO]。 [tblHero] [fldHeroIsHistoric] =(1)或[DBO] [tblHero] [fldHeroLevel] =(100))
以下指数在桌子上:。
CREATE NONCLUSTERED INDEX IX_tblHero_2 ON dbo.tblHero
(
fldHeroDateAdded DESC,
fldHeroIsHistoric DESC
) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX IX_tblHero_3 ON dbo.tblHero
(
fldHeroDateAdded DESC,
fldHeroLevel DESC
) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
最后,问题:
我要补充哪些索引摆脱表扫描和速度这件事的?
与OP的问题无关,你能否详细说明'日期范围查询也适用于聚簇索引,(一般范围)''?也就是说,除了一个简单的事实,即所有索引在聚集时都会获得更高的性能增益? – MatBailie 2011-05-02 01:11:20
任何范围查询更适合聚簇,因为聚簇索引是有序的。因此,当您在[日期]和[日期2]之间查找10到200之间的日期或日期之前的日期时,由于它们是有序的(索引数据是连续的) ,因此执行速度更快。 – 2011-05-02 02:59:37
问题是肯定的位字段,IsHistoric。如果我从查询中删除它,表扫描就会消失。即使单个索引每个字段似乎也没有什么区别。 – Darthg8r 2011-05-02 22:17:49