1、 優化前的視圖(執行select * from Query_NoEmployRegist用時127s)
代碼 1 SET ANSI_NULLS ON 2 GO 3 SET QUOTED_IDENTIFIER ON 4 GO 5 ALTER VIEW [dbo].[Query_NoEmployRegist] 6 AS 7 SELECT dbo.Person_BasicInfo.*, dbo.Graduater_GraduaterRegist.RegistNO AS RegistNO, 8 dbo.Graduater_GraduaterRegist.RegistTime AS BaoDaoTime, 9 dbo.Graduater_GraduaterRegist.RegistMan AS RegistMan, 10 dbo.Graduater_Business.ComeFrom AS ComeFrom, 11 dbo.Graduater_Business.Code AS Code, dbo.Graduater_Business.Status AS Status, 12 dbo.Graduater_Business.ApPRoveResult AS ApproveResult, 13 dbo.Graduater_Business.NewCorp AS NewCorp, 14 dbo.Graduater_Business.CommendNumber AS CommendNumber, 15 dbo.Graduater_Business.EmployStatus AS EmployStatus, 16 dbo.Graduater_Business.NewCommendTime AS NewCommendTime, 17 dbo.Graduater_Business.GetSource AS GetSource, 18 dbo.Graduater_Business.EmployTime AS EmployTime, 19 dbo.Graduater_Business.Job AS Job, dbo.Graduater_Business.FillMan AS FillMan, 20 dbo.Graduater_Business.FillTime AS FillTime, 21 dbo.Graduater_Business.IsCommendOK AS IsCommendOK, 22 dbo.Graduater_Business.ApproveUser AS ApproveUser, 23 dbo.Graduater_Business.ApproveTime AS ApproveTime, 24 dbo.Graduater_Business.RegistTime AS RegistTime, 25 dbo.Graduater_Business.EmployCorp AS EmployCorp, 26 dbo.Graduater_Business.JobRemark AS JobRemark, 31 dbo.Person_Contact.Address AS Address, dbo.Person_Contact.Zip AS Zip, 32 dbo.Person_Contact.Telephone AS Telephone, dbo.Person_Contact.Mobile AS Mobile, 33 dbo.Person_Contact.Email AS Email, dbo.Person_Contact.IM AS IM, 34 dbo.Person_Skill.ForeignLanguage AS ForeignLanguage, 35 dbo.Person_Skill.ForeignLanguageLevel AS ForeignLanguageLevel, 36 dbo.Person_Skill.CantoneseLevel AS CantoneseLevel, 37 dbo.Person_Skill.MandarinLevel AS MandarinLevel, 38 dbo.Person_Skill.Language AS Language, 39 dbo.Person_Skill.TechnicalTitle AS TechnicalTitle, 40 dbo.Person_Skill.ComputerLevel AS ComputerLevel, 41 dbo.Person_EmployPurpose.JobType AS JobType, 42 dbo.Person_EmployPurpose.Vocation AS Vocation, 43 dbo.Person_EmployPurpose.JobPlace AS JobPlace, 44 dbo.Person_EmployPurpose.Salary AS Salary, 45 dbo.Person_EmployPurpose.OnJobDate AS OnJobDate, 46 dbo.Person_EmployPurpose.CorpType AS CorpType, 49 dbo.Graduater_Business.EmployType AS EmployType, 50 dbo.Graduater_Business.EmployTypeCode AS EmployTypeCode, 51 dbo.Graduater_Business.EmployCorpType AS EmployCorpType 56 FROM dbo.Person_BasicInfo INNER JOIN 57 dbo.Graduater_Business ON 58 dbo.Person_BasicInfo.PersonID = dbo.Graduater_Business.PersonID LEFT OUTER JOIN 59 dbo.Graduater_GraduaterRegist ON 60 dbo.Graduater_Business.GradBusinessID = dbo.Graduater_GraduaterRegist.GraduaterGUID 61 INNER JOIN 62 dbo.Person_Contact ON 63 dbo.Person_BasicInfo.PersonID = dbo.Person_Contact.PersonID INNER JOIN 64 dbo.Person_Skill ON 65 dbo.Person_BasicInfo.PersonID = dbo.Person_Skill.PersonID INNER JOIN 66 dbo.Person_EmployPurpose ON 67 dbo.Person_BasicInfo.PersonID = dbo.Person_EmployPurpose.PersonID 68 GO 69 SET ANSI_NULLS OFF 70 GO 71 SET QUOTED_IDENTIFIER OFF 72 GO 2、 優化后的視圖(執行select * from Query_NoEmployRegist用時98s)
代碼 1 SET ANSI_NULLS on 2 GO 3 SET QUOTED_IDENTIFIER on 4 GO 5 ALTER VIEW [dbo].[Query_NoEmployRegist] 6 AS 7 SELECT 8 dbo.Person_BasicInfo.PersonID, 9 dbo.Person_BasicInfo.IdentityID, 10 dbo.Person_BasicInfo.Name, 11 dbo.Person_BasicInfo.Sex, 12 dbo.Person_BasicInfo.Folk, 13 dbo.Person_BasicInfo.Politics, 14 dbo.Person_BasicInfo.Birthday, 15 dbo.Person_BasicInfo.StudentSource, 16 dbo.Person_BasicInfo.StudentSourceCode, 17 dbo.Person_BasicInfo.EduLevel, 18 dbo.Person_BasicInfo.EduLevelCode, 19 dbo.Person_BasicInfo.EduNumber, 20 dbo.Person_BasicInfo.Stature, 21 dbo.Person_BasicInfo.Avoirdupois, 22 dbo.Person_BasicInfo.MarriageStatus, 23 dbo.Person_BasicInfo.College, 24 dbo.Person_BasicInfo.GraduatedDate, 25 dbo.Person_BasicInfo.Train, 26 dbo.Person_BasicInfo.Major, 27 dbo.Person_BasicInfo.Degree, 28 dbo.Person_BasicInfo.DegreeCertificate, 29 dbo.Person_BasicInfo.StudyMode, 30 dbo.Graduater_GraduaterRegist.RegistNO AS RegistNO, 31 dbo.Graduater_GraduaterRegist.RegistTime AS BaoDaoTime, 32 dbo.Graduater_GraduaterRegist.RegistMan AS RegistMan, 33 dbo.Graduater_Business.ComeFrom AS ComeFrom, 34 dbo.Graduater_Business.Code AS Code, dbo.Graduater_Business.Status AS Status, 35 dbo.Graduater_Business.ApproveResult AS ApproveResult, 36 dbo.Graduater_Business.NewCorp AS NewCorp, 37 dbo.Graduater_Business.CommendNumber AS CommendNumber, 38 dbo.Graduater_Business.EmployStatus AS EmployStatus, 39 dbo.Graduater_Business.NewCommendTime AS NewCommendTime, 40 dbo.Graduater_Business.GetSource AS GetSource, 41 dbo.Graduater_Business.EmployTime AS EmployTime, 42 dbo.Graduater_Business.Job AS Job, dbo.Graduater_Business.FillMan AS FillMan, 43 dbo.Graduater_Business.FillTime AS FillTime, 44 dbo.Graduater_Business.IsCommendOK AS IsCommendOK, 45 dbo.Graduater_Business.ApproveUser AS ApproveUser, 46 dbo.Graduater_Business.ApproveTime AS ApproveTime, 47 dbo.Graduater_Business.RegistTime AS RegistTime, 48 dbo.Graduater_Business.EmployCorp AS EmployCorp, 49 dbo.Graduater_Business.JobRemark AS JobRemark, 54 dbo.Person_Contact.Address AS Address, dbo.Person_Contact.Zip AS Zip, 55 dbo.Person_Contact.Telephone AS Telephone, dbo.Person_Contact.Mobile AS Mobile, 56 dbo.Person_Contact.Email AS Email, dbo.Person_Contact.IM AS IM, 57 dbo.Person_Skill.ForeignLanguage AS ForeignLanguage, 58 dbo.Person_Skill.ForeignLanguageLevel AS ForeignLanguageLevel, 59 dbo.Person_Skill.CantoneseLevel AS CantoneseLevel, 60 dbo.Person_Skill.MandarinLevel AS MandarinLevel, 61 dbo.Person_Skill.Language AS Language, 62 dbo.Person_Skill.TechnicalTitle AS TechnicalTitle, 63 dbo.Person_Skill.ComputerLevel AS ComputerLevel, 64 dbo.Person_EmployPurpose.JobType AS JobType, 65 dbo.Person_EmployPurpose.Vocation AS Vocation, 66 dbo.Person_EmployPurpose.JobPlace AS JobPlace, 67 dbo.Person_EmployPurpose.Salary AS Salary, 68 dbo.Person_EmployPurpose.OnJobDate AS OnJobDate, 69 dbo.Person_EmployPurpose.CorpType AS CorpType, 72 dbo.Graduater_Business.EmployType AS EmployType, 73 dbo.Graduater_Business.EmployTypeCode AS EmployTypeCode, 74 dbo.Graduater_Business.EmployCorpType AS EmployCorpType, 79 FROM dbo.Person_BasicInfo INNER JOIN 80 dbo.Graduater_Business ON 81 dbo.Person_BasicInfo.PersonID = dbo.Graduater_Business.PersonID LEFT OUTER JOIN 82 dbo.Graduater_GraduaterRegist ON 83 dbo.Graduater_Business.GradBusinessID = dbo.Graduater_GraduaterRegist.GraduaterGUID 84 INNER JOIN 85 dbo.Person_Contact ON 86 dbo.Person_BasicInfo.PersonID = dbo.Person_Contact.PersonID INNER JOIN 87 dbo.Person_Skill ON 88 dbo.Person_BasicInfo.PersonID = dbo.Person_Skill.PersonID INNER JOIN 89 dbo.Person_EmployPurpose ON 90 dbo.Person_BasicInfo.PersonID = dbo.Person_EmployPurpose.PersonID 91 GO 92 SET ANSI_NULLS OFF 93 GO 94 SET QUOTED_IDENTIFIER OFF 95 GO 3、 創建索引的視圖(執行select * from Query_NoEmployRegist用時51s)
代碼 1 SET ANSI_NULLS on 2 GO 3 SET QUOTED_IDENTIFIER on 4 GO 5 6 ALTER VIEW [dbo].[Query_NoEmployRegist] 7 WITH SCHEMABINDING AS 8 SELECT 9 dbo.Person_BasicInfo.PersonID, 10 dbo.Person_BasicInfo.IdentityID, 11 dbo.Person_BasicInfo.Name, 12 dbo.Person_BasicInfo.Sex, 13 dbo.Person_BasicInfo.Folk, 14 dbo.Person_BasicInfo.Politics, 15 dbo.Person_BasicInfo.Birthday, 16 dbo.Person_BasicInfo.StudentSource, 17 dbo.Person_BasicInfo.StudentSourceCode, 18 dbo.Person_BasicInfo.EduLevel, 19 dbo.Person_BasicInfo.EduLevelCode, 20 dbo.Person_BasicInfo.EduNumber, 21 dbo.Person_BasicInfo.Stature, 22 dbo.Person_BasicInfo.Avoirdupois, 23 dbo.Person_BasicInfo.MarriageStatus, 24 dbo.Person_BasicInfo.College, 25 dbo.Person_BasicInfo.GraduatedDate, 26 dbo.Person_BasicInfo.Train, 27 dbo.Person_BasicInfo.Major, 28 dbo.Person_BasicInfo.Degree, 29 dbo.Person_BasicInfo.DegreeCertificate, 30 dbo.Person_BasicInfo.StudyMode, 31 dbo.Graduater_GraduaterRegist.RegistNO AS RegistNO, 32 dbo.Graduater_GraduaterRegist.RegistTime AS BaoDaoTime, 33 dbo.Graduater_GraduaterRegist.RegistMan AS RegistMan, 34 dbo.Graduater_Business.ComeFrom AS ComeFrom, 35 dbo.Graduater_Business.Code AS Code, dbo.Graduater_Business.Status AS Status, 36 dbo.Graduater_Business.ApproveResult AS ApproveResult, 37 dbo.Graduater_Business.NewCorp AS NewCorp, 38 dbo.Graduater_Business.CommendNumber AS CommendNumber, 39 dbo.Graduater_Business.EmployStatus AS EmployStatus, 40 dbo.Graduater_Business.NewCommendTime AS NewCommendTime, 41 dbo.Graduater_Business.GetSource AS GetSource, 42 dbo.Graduater_Business.EmployTime AS EmployTime, 43 dbo.Graduater_Business.Job AS Job, dbo.Graduater_Business.FillMan AS FillMan, 44 dbo.Graduater_Business.FillTime AS FillTime, 45 dbo.Graduater_Business.IsCommendOK AS IsCommendOK, 46 dbo.Graduater_Business.ApproveUser AS ApproveUser, 47 dbo.Graduater_Business.ApproveTime AS ApproveTime, 48 dbo.Graduater_Business.RegistTime AS RegistTime, 49 dbo.Graduater_Business.EmployCorp AS EmployCorp, 50 dbo.Graduater_Business.JobRemark AS JobRemark, 51 dbo.Person_Contact.Address AS Address, dbo.Person_Contact.Zip AS Zip, 52 dbo.Person_Contact.Telephone AS Telephone, dbo.Person_Contact.Mobile AS Mobile, 53 dbo.Person_Contact.Email AS Email, dbo.Person_Contact.IM AS IM, 54 dbo.Person_Skill.ForeignLanguage AS ForeignLanguage, 55 dbo.Person_Skill.ForeignLanguageLevel AS ForeignLanguageLevel, 56 dbo.Person_Skill.CantoneseLevel AS CantoneseLevel, 57 dbo.Person_Skill.MandarinLevel AS MandarinLevel, 58 dbo.Person_Skill.Language AS Language, 59 dbo.Person_Skill.TechnicalTitle AS TechnicalTitle, 60 dbo.Person_Skill.ComputerLevel AS ComputerLevel, 61 dbo.Person_EmployPurpose.JobType AS JobType, 62 dbo.Person_EmployPurpose.Vocation AS Vocation, 63 dbo.Person_EmployPurpose.JobPlace AS JobPlace, 64 dbo.Person_EmployPurpose.Salary AS Salary, 65 dbo.Person_EmployPurpose.OnJobDate AS OnJobDate, 66 dbo.Person_EmployPurpose.CorpType AS CorpType, 67 dbo.Person_EmployPurpose.Job AS RequireJob, 68 dbo.Graduater_Business.EmployType AS EmployType, 69 dbo.Graduater_Business.EmployTypeCode AS EmployTypeCode, 70 dbo.Graduater_Business.EmployCorpType AS EmployCorpType, 71 FROM dbo.Person_BasicInfo INNER JOIN 72 dbo.Graduater_Business ON 73 dbo.Person_BasicInfo.PersonID = dbo.Graduater_Business.PersonID INNER JOIN 74 dbo.Graduater_GraduaterRegist ON 75 dbo.Graduater_Business.GradBusinessID = dbo.Graduater_GraduaterRegist.GraduaterGUID 76 INNER JOIN 77 dbo.Person_Contact ON 78 dbo.Person_BasicInfo.PersonID = dbo.Person_Contact.PersonID INNER JOIN 79 dbo.Person_Skill ON 80 dbo.Person_BasicInfo.PersonID = dbo.Person_Skill.PersonID INNER JOIN 81 dbo.Person_EmployPurpose ON 82 dbo.Person_BasicInfo.PersonID = dbo.Person_EmployPurpose.PersonID 83 GO 84 CREATE UNIQUE CLUSTERED INDEX Query_NoEmployRegist_Ind 85 ON Query_NoEmployRegist(GraduatedDate, StudentSourceCode,RegistTime,ApproveTime,PrintTime,ComeFrom) 86 SET ANSI_NULLS ON 87 GO 88 SET QUOTED_IDENTIFIER ON 89 GO
看來還得優化,希望各位博友指點一下!
二、索引視圖的學習總結
1、什么是索引視圖?
在視圖上創建唯一的聚集索引及非聚集索引,來提高最復雜的查詢的數據訪問性能。具有唯一的聚集索引的視圖即為索引視圖。從數據庫管理系統 (DBMS) 的角度看來,視圖是對數據(一種元數據類型)的一種描述。當創建了一個典型視圖時,通過封裝一個 SELECT 語句(定義一個結果集來表示為虛擬表)來定義元數據。當在另一個查詢的 FROM 子句中引用視圖時,將從系統目錄檢索該元數據,并替代該視圖的引用擴展元數據。視圖擴展之后,SQL Server 查詢優化器會為執行查詢編譯一個執行計劃。查詢優化器會搜索針對某個查詢的一組可能的執行計劃,并根據對執行每個查詢計劃所需的實際時間的估計,選擇所能找到的成本最低的計劃。
SQL Server 查詢優化器自動決定何時對給定的查詢執行使用索引視圖。不必在查詢中直接引用視圖以供優化器在查詢執行計劃中使用。所以,現有的應用程序可運用索引視圖,而不用更改應用程序本身;只是必須創建索引視圖。
優化器考慮事項
查詢優化器通過考慮幾個條件來決定索引視圖能否涵蓋整個或部分查詢。這些條件對應查詢中的一個 FROM 子句并由下列這幾個部分組成:
• 查詢 FROM 子句中的表必須是索引視圖 FROM 子句中的表的超集。
• 查詢中的聯接條件必須是視圖中的聯接條件的超集。
• 查詢中的聚合列必須可從視圖中的聚合列的子集派生。
• 查詢選擇列表中的所有表達式必須可從視圖選擇列表或未包含在視圖定義中的表派生。
• 如果與其他謂詞所匹配的行的超集相匹配,那么該謂詞將歸入另一個謂詞。例如,“T.a=10”歸入“T.a=10 and T.b=20”。任何謂詞都可歸入其自身。視圖中限 制表值的那部分謂詞必須歸入查詢中限制相同表的那部分謂詞。此外,必須以 SQL Server 可驗證的方式實現這一點。
• 屬于視圖定義中的表的查詢搜索條件謂詞的所有列必須出現在下列視圖定義的一項或多項中:
(1) 一個 GROUP BY 列表。
(2) 視圖選擇列表(如不存在 GROUP BY)。
(3) 視圖定義中相同或等價的謂詞。
情況 (1) 和 (2) 允許 SQL Server 對視圖的列應用查詢謂詞,以便進一步限制視圖的列。情況 (3) 比較特殊。在這種情況下,不需要對列進行篩選,因此該列不必出現在視圖中。 如果查詢不止包含一個 FROM 子句(子查詢、派生表、UNION),優化器可能選擇幾個索引視圖來處理查詢,并將它們應用到不同 FROM 子句。