视图的输出可以简化为以下内容:
PID (int), Kind (int), Date (date), D1,D2..DN
PID、日期和种类字段不是唯一的(可能有多行具有相同的pid、kind、date组合),但这些字段将用于像这样的联接
left join ComplexView mkcs on mkcs.PID=q4.PersonID and mkcs.Date=q4.date and mkcs.Kind=1
left join ComplexView mkcl on mkcl.PID=q4.PersonID and mkcl.Date=q4.date and mkcl.Kind=2
left join ComplexView mkco on mkco.PID=q4.PersonID and mkco.Date=q4.date and mkco.Kind=3
现在,如果我只是这样做,执行查询需要很长时间,因为复杂视图被运行了三次,我认为,它的大量行中只有一些实际使用(比如,40000个中只有2000个被使用)。
我所做的是声明@temptable,并插入select * from ComplexView where Date...到@temptable中 - 每次查询时我只选择我要使用的行,并将其加入@temptable中,然后再连接这个@temptable。这显著减少了执行时间。
但是,我注意到,如果我在我的数据库中创建一个表,并在PID、Kind、Date上添加一个聚集索引(非唯一聚集),然后从这个表中获取数据,然后执行delete * from这个表并从复杂视图中插入数据需要几秒钟(3或4秒),然后在我的查询中使用这个表(左连接它三次)将查询时间缩短了一半,从1分钟缩短到30秒!
那么,我的问题是,首先 - 是否可以在声明的@temptables上创建索引。 然后 - 我看到人们谈论“create #temptable”语法。也许这就是我需要的?我在哪里可以阅读关于declare @temptable和create #temptable之间区别的内容?对于像我这样的查询应该使用什么?(这个查询是用于MS Reporting Services报告,如果有关系的话)。