|
|
Publicerad på 2018-05-21 13:55:48
|
|
|

Under de senaste två dagarna har jag stött på ett problem som är ganska frustrerande, en lagrad promotor på cirka 120 rader körs i frågeanalysatorn i SQL Server 2012. Hastigheten är mycket idealisk, och cirka 500 dataposter kan filtreras och fångas in på mindre än 1 sekund. Men när man anropar i C#-programkoden anges anslutningstidsavbrottet. Ställ in CommandTimeout på 300, och det tar ungefär 3 minuter att visa. Jag kollade koden flera gånger och hittade inga fel. Problemet kvarstår.
Orsaksanalys: 1. Eftersom exekveringshastigheten i frågeanalysatorn är hög och datamängden inte är stor. 2. Endast samtal i programmet är långsamt. 3. Sätt parametern CommandTimeout, och resultatet kan visas, men det tar lång tid.
Sammanfattningsvis dras det preliminärt slutsatsen att problemet ligger i C#-koden. Men det fanns ingen vinst efter inspektionen.
Kolla denna information om Baidu. Till slut hittade jag ett liknande informationsinlägg på CSDN-forumet. En av nätanvändarna svarade: "Det är möjligt att genomförandeplanen har löpt ut". Det väckte mig verkligen i min dröm.
Utför direkt på frågeanalysatorn:
Jag testade programmet igen, den här gången fungerade det äntligen. Hastigheten är mycket tillfredsställande.
Orsaksanalys: Eftersom lagrade procedurer är förkompilerade genereras en exekveringsplan vid första exekveringen, och denna exekveringsplan används vid efterföljande exekveringar (om inte den lagrade proceduren specificeras att kompileras om), istället för att generera en exekveringsplan varje gång den exekveras. När objektstrukturen som ingår i den lagrade proceduren justeras, eller den relaterade datan ändras avsevärt, vilket kan göra att den ursprungliga planen blir olämplig för det aktuella status quo (exekveringsplanens utgång), bör den lagrade proceduren kompileras om.
Slutligen, bifoga koden för den lagrade proceduren:
|
Föregående:Dela en enda APP-kampanjsida, källkod, adaptiv, mycket vacker och generös!Nästa:C# Open Source-ramverk (Återtryck)
|