2014-03-06 138 views
0

美好的一天,我在优化数据库查询方面是一个新手......实际上这是我第一次......我已经完成了我的研究并发现使用临时表可以帮助我提高查询性能..除了像使用索引等其他解决方案,但虽然他们有很多关于它的博客,但我还没有找到关于它的详细教程......我希望如果你可以提供帮助。鉴于这种示例表...在sql server 2008中使用临时表优化表的性能r2

表模式::

StudentInfo: 
    StudentID 
    LAstname 
    FirstName 
    YearCode 
    SectionCode 

    TeacherInfo: 
    SectionCode 
    TeacherID 
    TeacherName 


    GradeInfo: 
    StudentID 
    AverageGrade 

    CashierRecord: 
    StudentID 
    EnrolledDate 
    ModeOfPayment 
    AmountDue 

查询我已经试过......

Select 
     s.StudentID, 
     s.FirstName, 
     s.LastName, 
     t.Teacher, 
     g.AverageGrade, 
     c.EnrolledDate 
    From StudentInfo s 
    LEFT JOIN TeacherInfo t ON s.StudentID= t.StudentID 
    LEFT JOIN GradeInfo g ON s.StudentID= g.StudentID 
    LEFT JOIN GradeRecords c ON s.StudentID= c.StudentID 

如果给定的查询将检索大量数据(前。 100,000条记录),查询的性能肯定会降低......可能您会解释我怎样才能利用临时表来存储多个表中的数据,以便检索可能会更容易...

+1

您是否检查过所有比较列(StudentID)上的索引?你能提供一些exampledata吗? – wumpz

+0

检索是什么意思?你想处理所有返回的数据或过滤集? – wumpz

+0

耶我几乎忘了,因为我刚刚构造了一个示例问题......他们实际上都有PK,它被视为聚集索引..但索引放在一边...我读的是1)创建一个临时表2)填充它来自旧表的数据(具有来自不同表的数据)3.从临时表中选择数据4.删除表......如何在提取大量数据时真正提高选择查询的性能? –

回答

1

要从SQL Server中的选择结果创建表,您可以使用select into

Select 
    s.StudentID, 
    s.FirstName, 
    s.LastName, 
    t.Teacher, 
    g.AverageGrade, 
    c.EnrolledDate 
into TEMPTABLE 
From StudentInfo s 
LEFT JOIN TeacherInfo t ON s.StudentID= t.StudentID 
LEFT JOIN GradeInfo g ON s.StudentID= g.StudentID 
LEFT JOIN GradeRecords c ON s.StudentID= c.StudentID 

那么你可以使用TEMPTABLE,然后使用

drop table TEMPTABLE 

随着你收集你的数据到一个表这个放弃它。 TEMPTABLE还不是真正的临时桌子。看看这里找到更多(Is it necessary to use # for creating temp tables in SQL server?)。它写下来写#TEMPTABLE

但是为了建立这个表格,你仍然有选择的处理时间。

+0

非常感谢我一直这样做,但我脑海中有另一个问题..我实际上有大量JOINS约20个,使得处理我的查询真的很长,尽管我使用临时表来检索它们..你能告诉我如何进一步提高我的查询性能... –

+0

再次我的建议检查索引。如果我理解正确,你有PK,但是是一个索引例如在TeacherInfo.StudentID?这里(s.StudentID = t.StudentID)如果查询计划按发生顺序评估你的表,则不使用TeacherInfo的PK。 – wumpz