我有个视图,去年是0秒,今年变慢了要3-5秒。请大侠小爱和各路大侠帮忙看看啊。
我写的视图很烂,还请大侠们费心看看。
SELECT dbo.Today.Task AS TaskDescr, dbo.Today.No, dbo.Today.Downno,
dbo.Today_2.time4 AS time4, dbo.Today.Via AS bypass, dbo.Today.Hos AS Hos,
dbo.Today.time1 AS time1, dbo.Today.time2 AS time2,
dbo.Today.time5 AS Time5, dbo.Today.time3 AS time3,
dbo.Today.Area AS area, '出' AS io, dbo.Today.Status,
CASE WHEN dbo.Today.ber < 0 THEN '' WHEN dbo.Today.ber IN (1) THEN '南' + CONVERT(varchar,
dbo.Today.ber) WHEN dbo.Today.ber > 17 THEN '北' + CONVERT(varchar, dbo.Today.ber)
ELSE CONVERT(varchar, dbo.Today.ber) END AS Ber, dbo.Today.Gate AS Gate,
dbo.Today.Pla AS Pla, dbo.Today.type,
dbo.Reason.ReasonCN AS DisplayReason, CASE WHEN ltrim(rtrim(dbo.Today.Memo)) = '' AND
ltrim(rtrim(dbo.Today.StatMemo)) <> '' THEN dbo.TodayD.StatMemo WHEN ltrim(rtrim(dbo.Today.Memo))
<> '' AND ltrim(rtrim(dbo.Today.StatMemo))
= '' THEN dbo.Today.Memo WHEN ltrim(rtrim(dbo.Todays.Memo)) <> '' AND
ltrim(rtrim(dbo.Today.StatMemo))
<> '' THEN dbo.Today.Memo + ',' + dbo.Today.StatMemo WHEN ltrim(rtrim(dbo.Today.Memo)) = '' AND
ltrim(rtrim(dbo.Today.StatMemo)) = '' THEN '' END AS Remark, ISNULL(dbo.f_MergeVipName(dbo.Today.No,
N'出', dbo.Today.Opday), N'') AS vipinfo, dbo.Today.lines
FROM dbo.Today LEFT OUTER JOIN
dbo.Reason ON dbo.Today.PublishReason = dbo.Reason.ReasonID LEFT OUTER JOIN
dbo.Today_2 ON dbo.Today.Downno = dbo.Today_2.no
WHERE (dbo.Today.Task NOT IN ('货A', '货B'))
一般情况下是100多个客户端,高峰时可能有200以上,客户端程序30秒刷新一次该视图。
跪求各路大侠分析一下,变慢的可能的原因在哪里呢?
[解决办法]
SORRY,应该是:
create index test_vip_idx on vip([Date],[No],[io]) INCLUDE(NAME,CLASS)
你可以把非聚集索引理解成是,另外一张表,与原来的数据表没有关系。唯一的关系是在索引的每行记录最后,存储了一个rowid字段,指向原来的数据表的相应记录。
想了解INCLUDE,得首先知道索引的存储结构。不管是聚集还是非聚集索引,都是平衡树结构。
没有INCLUDE的非聚集索引,叶子结点只包含索引键([Date],[No],[io]);
有INCLUDE的非聚集索引,除了索引键,还包含了另外的数据(NAME,CLASS);
当索引查找时,只会根据索引键查找,当查找到需要的数据后,就可以从INCLUDE的数据中直接取出想要的数据;否则,还要再去和数据表关联,从中取出NAME,CLASS字段。
[解决办法]
标记下,明天看看