Być może ma to sens, aby odwrócić pytanie i znaleźć przypadki użycia, w których mogłyby zrobić tylko procedury składowane, co chcesz osiągnąć. Być może istnieją naprawdę przypadki użycia, w których wyróżniają się procedury przechowywane.
Jeśli to robi różnicę, używam MSSQL i Entity Framework.
Moja wiedza na temat EF jest ograniczona, ale o ile widzę, EF jest ( tylko ) ORM jak każda inna; i na szczęście jest w stanie używać surowego SQL .
Jeśli wezmę twoje dwa główne punkty:
Skomplikowany raport, którego uruchomienie zajęło kilka minut (była to strona w aplikacji internetowej). Odkryłem, że potrafię napisać SQL, który jest znacznie bardziej wydajny (zajmuje tylko kilka sekund), niż zapewnia LINQ.
Podczas sporządzania raportu LINQ / EF nie spełniał oczekiwań. I jak zauważyłeś, było SQL
znacznie szybsze niż używanie ORM. Ale czy to przemawia na korzyść procedur przechowywanych, czy tylko przeciwko wykorzystaniu ORM do wszystkiego?
Twój problem można oczywiście rozwiązać za pomocą SQL . Jeśli to zapytanie zostało zapisane, a wersja kontrolowana w twojej bazie kodu - zgodnie z twoim przykładem - przynajmniej nie ma różnicy .
Aplikacja internetowa musiała czytać i zapisywać w kilku tabelach w osobnej bazie danych, która zawierała wiele innych poufnych informacji, które nie były istotne dla aplikacji. Zamiast dać mu dostęp do wszystkiego, użyłem procedury składowanej, która robi tylko to, co jest potrzebne i zwraca tylko ograniczone informacje. Aplikacja internetowa mogłaby wówczas uzyskać dostęp tylko do tej procedury składowanej, bez dostępu do żadnych tabel itp.
To samo tutaj: prosty ciąg połączenia i AKTUALIZACJA, a Twój problem został zakończony. Ten problem można rozwiązać nawet za pomocą ORM :
wystarczy użyć usługi sieci Web przed drugą bazą danych i uzyskuje się taką samą kompartmentalizację / izolację .
Więc nie ma tu nic do zobaczenia.
Przyglądając się niektórym punktom inni:
Masz złożone jednostki pracy, być może obejmujące wiele tabel, których nie można łatwo zawrzeć w transakcji za pomocą funkcji EF.
Ale SQL
mogę to zrobić. Nie ma tu żadnej magii .
Twoja baza danych nie działa dobrze z EF
Ponownie: w razie potrzeby użyj EF .
Musisz pracować z danymi, które przekraczają granice serwerów z połączonymi serwerami
Nie rozumiem, w jaki sposób procedury przechowywane pomagają. Nie widzę więc przewagi procedur przechowywanych; ale może ktoś rzuci na to trochę światła.
Masz bardzo złożone scenariusze pobierania danych, w których SQL „bare metal” jest potrzebny w celu zapewnienia odpowiedniej wydajności
Ponownie: „Granice EF ”.
Twoja aplikacja nie ma pełnych uprawnień CRUD dla tabeli, ale można zezwolić na jej działanie w kontekście bezpieczeństwa, któremu ufa serwer
W porządku. Idę z może .
Do tej pory tylko połowa punktów była na korzyść procedur przechowywanych.
Być może istnieją względy wydajności, które przemawiają za procedurami przechowywanymi.
1) Zaletą przechowywania zapytań jest proste wywołanie procedury składowanej, która uwzględnia złożoność. Ponieważ narzędzie do planowania zapytań zna zapytanie, „łatwiej” je zoptymalizować. Ale zapisy są z obecnym zaawansowanym planerem zapytań _minimal.
Co więcej, nawet jeśli korzystanie z zapytań ad hoc wiąże się z niewielkimi kosztami , jeśli dane są dobrze ustrukturyzowane i starannie indeksowane, baza danych jest jedynie wąskim gardłem Twojej aplikacji. Więc nawet jeśli istnieje niewielka delta, można ją pominąć, biorąc pod uwagę inne czynniki.
2) Niemniej jednak argumentowano za przechowywaniem złożonych zapytań w bazie danych. Należy wziąć pod uwagę dwie rzeczy:
a) złożone zapytania masowo wykorzystują infrastrukturę DB, co wydłuża czas odpowiedzi dla każdego innego zapytania. Nie można równolegle uruchamiać wielu kosztownych zapytań . Nie mówi to ani o procedurach przechowywanych pro, ani przeciwnie , ale o złożone zapytania.
b) Jeśli zapytanie i tak wymaga czasu, dlaczego zawracać sobie głowę małą szybkością wygrywa procedurę przechowywaną.
tl; dr
Nic nie przemawia wprost przeciwko procedurom przechowywanym. Więc korzystanie z procedur przechowywanych jest w porządku - jeśli cię uszczęśliwia.
Ale z drugiej strony: nie mogłem sobie wyobrazić właściwego przypadku użycia, który mówi jednoznacznie za.
Kiedy powinienem korzystać z procedur przechowywanych?
Prawidłowa odpowiedź to: kiedy tylko chcesz . Ale są też inne opcje.