我檢查,我經常遇到一個緩慢的執行查詢的執行。它顯示了一張大桌子的表掃描。表掃描和索引
下面是查詢:
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