Per pastarąsias dvi dienas susidūriau su problema, kuri yra gana varginanti, saugoma maždaug 120 eilučių procedūra vykdoma SQL Server 2012 užklausų analizatoriuje, Greitis yra labai idealus, o apie 500 duomenų įrašų galima filtruoti ir užfiksuoti greičiau nei per 1 sekundę. Tačiau iškviečiant C# programos kodą, paraginamas ryšio skirtasis laikas. Nustatykite "CommandTimeout" į 300 ir tai užtruks apie 3 minutes. Kelis kartus patikrinau kodą ir neradau klaidų. Problema išlieka.
Priežasties analizė: 1. Kadangi užklausų analizatoriaus vykdymo greitis yra greitas, o duomenų kiekis nėra didelis. 2. Tik skambutis programoje yra lėtas. 3. Nustatykite parametrą CommandTimeout ir rezultatas gali būti rodomas, tačiau tai užtruks ilgai.
Apibendrinant daroma preliminari išvada, kad problema slypi C# kode. Tačiau po patikrinimo nebuvo jokios naudos.
Patikrinkite šią informaciją Baidu. Pagaliau radau panašų informacinį įrašą CSDN forume. Vienas iš internautų atsakyme sakė: "Gali būti, kad įgyvendinimo planas pasibaigė", Tai tikrai pažadino mane sapne.
Nedelsdami atlikite užklausų analizatorių:
Dar kartą išbandžius programą, šį kartą ji pagaliau suveikė. Greitis yra labai patenkinamas.
Priežasties analizė: Kadangi saugomos procedūros yra iš anksto kompiliuojamos, vykdymo planas generuojamas pirmojo vykdymo metu, ir šis vykdymo planas naudojamas vėlesniems vykdymams (nebent saugoma procedūra nurodyta perkompiliuoti), o ne generuoti vykdymo planą kiekvieną kartą, kai ji vykdoma. Kai objekto struktūra, susijusi su saugoma procedūra, yra koreguojama arba susiję duomenys labai pasikeičia, todėl pradinis planas gali būti netinkamas dabartinei situacijai (vykdymo plano galiojimo laikas), saugoma procedūra turi būti kompiliuojama iš naujo.
Galiausiai pridėkite saugomos procedūros kodą:
|