asp.net-mvc - 程序执行时间过长
问题描述
我正在使用存储过程来获取数据。我在其中使用了多个连接和内部查询,这就是让它太慢的原因。是否有任何替代方法可以避免对主从表进行内部查询?
实际上,早些时候我使用 LINQ 查询来获取数据,但执行时间也太长,然后我选择了存储过程,但执行时间也相同。那么我怎样才能让它更快呢?
这是我的存储过程:
ALTER PROCEDURE USP_GetUserDetailByID
@id INT
AS
BEGIN
SELECT TOP 1
uinfo.ID ID,
uinfo.UniqueUserID UniqueUserID,
uinfo.ID UserInfoID,
uinfo.ReferredID ReferredID,
uinfo.UserTypeID UserTypeID,
uinfo.GroomBrideName GroomBrideName,
uinfo.EmailID EmailID,
uinfo.[Password] [Password],
uinfo.ProfileCreatedFor ProfileCreatedFor,
uinfo.DateOfBirth DateOfBirth,
uinfo.Gender Gender,
uinfo.Age Age,
uinfo.Height Height,
uinfo.City City,
uinfo.Country Country,
uinfo.Phone Phone,
uinfo.Mobile Mobile,
uinfo.RegisteredMobileNumber RegisteredMobileNumber,
uinfo.About About,
uinfo.[Status] [Status],
rel.Religion Religion,
rel.MotherTongue MotherTongue,
rel.Section Section,
rel.Division Division,
edu.EducationLevel EducationalLevel,
edu.EducationFeild EducationalField,
edu.GraduationDegree GraduationDegree,
edu.MasterDegree MasterDegree,
edu.WorkWith WorkWith,
edu.WorkingGroup WorkingGroup,
edu.WorkingAs WorkingAs,
edu.AnnualIncome AnnualIncome,
edu.InterestedInSettlingAbroad InsertedInSettingAbroad,
hob.Hobbies Hobbies,
hob.DressStyle,
hob.SportsFitness SportsFitness,
hob.FavouriteCuisine FavouriteCuisine,
hob.FavouriteVacationDestination FavouriteVacationDestination,
hob.FavouriteMusic FavouriteMusic,
hob.FavouriteBooks FavouriteBooks,
hob.PreferredMovies PreferredMovies,
life.Diet Diet,
life.Smoke Smoke,
life.Drink Drink,
life.SkinTone Complexion,
life.BodyType BodyType,
life.BloodGroup BloodGroup,
life.[Weight] [Weight],
life.ResidentialStatus ResidentialStatus,
life.OwnHouse OwnHouse,
life.OwnCar OwnCar,
life.LanguageKnown LanguageKnown,
fd.FamilyValue FamilyValue,
(SELECT DetailData FROM MasterDetails WHERE ID = fd.FamilyValue) FamilyValueText,
fd.FamilyType FamilyType,
(SELECT DetailData FROM MasterDetails WHERE ID = fd.FamilyType) FamilyTypeText,
fd.FamilyStatus FamilyStatus,
(SELECT DetailData FROM MasterDetails WHERE ID = fd.FamilyStatus) FamilyStatusText,
fd.Father Father,
(SELECT DetailData FROM MasterDetails WHERE ID = fd.Father) FatherText,
fd.Mother Mother,
(SELECT DetailData FROM MasterDetails WHERE ID = fd.Mother) MotherText,
fd.Brothers Brothers,
fd.MarriedBrothers MarriedBrothers,
fd.Sisters Sisters,
fd.MarriedSisters MarriedSisters,
fd.LivingWithParents LivingWithParents,
rel.ReligiousValues ReligiousValues,
uinfo.HightLightUserAbout HightLightUserAbout,
uinfo.FbUserDetail FbUserDetail,
(SELECT DetailData FROM MasterDetails WHERE ID = uinfo.ProfileCreatedFor) ProfileCreatedText,
(SELECT DetailData FROM MasterDetails WHERE ID = uinfo.Height) HeightText,
(SELECT ID FROM MasterDetails WHERE ID = uinfo.MaritalStatus) MaritalStatus,
(SELECT DetailData FROM MasterDetails WHERE ID = uinfo.MaritalStatus) MaritalStatusText,
(SELECT ID FROM MasterDetails WHERE ID = uinfo.[State]) [State],
CASE WHEN uinfo.City IS NULL THEN '' ELSE (SELECT DetailData FROM MasterDetails WHERE ID = uinfo.City) END as CityText,
CASE WHEN uinfo.[State] IS NULL THEN '' ELSE (SELECT DetailData FROM MasterDetails WHERE ID = uinfo.[State]) END as StateText,
(SELECT MasterCategoryID FROM MasterDetails WHERE ID = uinfo.Country) CountryId,
(SELECT DetailData FROM MasterDetails WHERE ID = uinfo.Country) CountryText,
(SELECT DetailData FROM MasterDetails WHERE ID = rel.MotherTongue) MotherTongueText,
(SELECT DetailData FROM MasterDetails WHERE ID = rel.Section) SectionText,
(SELECT DetailData FROM MasterDetails WHERE ID = rel.Division) DivisonText,
(SELECT DetailData FROM MasterDetails WHERE ID = edu.EducationLevel) EducationalLevelText,
(SELECT DetailData FROM MasterDetails WHERE ID = edu.EducationFeild) EducationalFeildText,
(SELECT DetailData FROM MasterDetails WHERE ID = edu.GraduationDegree) GraduationDegreeText,
(SELECT DetailData FROM MasterDetails WHERE ID = edu.MasterDegree) MasterDegreeText,
(SELECT DetailData FROM MasterDetails WHERE ID = edu.WorkWith) WOrkingWithText,
(SELECT DetailData FROM MasterDetails WHERE ID = edu.WorkingGroup) WorkingGroupText,
(SELECT DetailData FROM MasterDetails WHERE ID = edu.WorkingAs) WorkingAsText,
(SELECT DetailData FROM MasterDetails WHERE ID = edu.AnnualIncome) AnnualIncomeText,
(SELECT DetailData FROM MasterDetails WHERE ID = hob.Hobbies) HobbiesText,
(SELECT DetailData FROM MasterDetails WHERE ID = hob.DressStyle) DressStyleText,
(SELECT DetailData FROM MasterDetails WHERE ID = hob.SportsFitness) SportsFitnessText,
(SELECT DetailData FROM MasterDetails WHERE ID = hob.FavouriteCuisine) FavouriteCuisineText,
(SELECT DetailData FROM MasterDetails WHERE ID = hob.FavouriteMusic) FavouriteMusicText,
(SELECT DetailData FROM MasterDetails WHERE ID = hob.PreferredMovies) PreferredMoviesText,
(SELECT DetailData FROM MasterDetails WHERE ID = life.Diet) DietText,
(SELECT DetailData FROM MasterDetails WHERE ID = life.SkinTone) ComplexionText,
(SELECT DetailData FROM MasterDetails WHERE ID = life.BodyType) BodyTypeText
FROM
UsersInfo uinfo
LEFT JOIN
EducationAndOccupation edu on uinfo.ID = edu.UserID
LEFT JOIN
ReligionAndEthinicity rel on uinfo.ID = rel.UserID
LEFT JOIN
HobbiesAndInterests hob on uinfo.ID = hob.UserID
LEFT JOIN
LifestyleAndAttributes life on uinfo.ID = life.UserID
LEFT JOIN
FamilyDetails fd on uinfo.ID = fd.UserID
WHERE
uinfo.ID = @id
END
解决方案
您应该做的第一件事是通过 EXPLAIN 运行该语句以查看您的查询在做什么。
在 SSMS 中,确保您选择了数据库并打开一个新的查询窗口。将您的 SQL 粘贴到窗口中,然后选择查询 -> 显示估计的执行计划 (Ctrl + L)
查询计划显示在底部的窗口中。查看计划,它会告诉您事情在哪里花费时间(相对于批次的百分比)如果您不熟悉计划,请看这里...
http://www.simple-talk.com/sql/performance/execution-plan-basics/[^ ]
您还可以通过优化顾问运行查询,以查看是否推荐了任何索引。但是,如果表 titlefee 是记录最多的表,则需要考虑对它执行的操作。
1) 您正在通过字段 dtIssue 限制此表的结果。该字段是索引的一部分,还是导致表扫描(查看您的执行计划)
2)您正在按字段 curAmount 进行汇总 - 这可能会被索引。
使用执行计划 + 查询调优顾问,您应该能够索引您的表以获得最佳性能。
但是,通过引入索引,您必须权衡表的更新频率\更新数据的过程(例如用户应用程序?通宵 ETL?)。在 READ 与 WRITE 性能之间取得正确的平衡可能是一门黑暗的艺术:)
推荐阅读
- python-3.x - 在 python 计算器中处理负整数输入的最佳方法是什么?
- python-3.x - 使用字典值在for循环中生成数据框后如何查找数据框?
- java - 如何在 JPA 中修复生成的表中的排序。我们是否有一些没有任何框架的解决方法?
- python - 以下代码中的未知缩进错误
- node.js - Heroku 产生错误 H10 并导致应用程序崩溃
- javascript - javascript iframe 播放视频
- android - ViewPager2 - 如何使用 registerOnPageChangeCallback 检查查看寻呼机项目位置
- html - 如何将粘性 div 定位在屏幕右侧?
- python - Django:使用来自 url 的 ForeignKey 创建对象
- azure - 在 Azure 中使用托管标识进行服务到服务身份验证