jakie są różnice między „procedurami przechowywanymi” a „funkcjami przechowywanymi”?
<p>tak więc komentarz <a href="https://dba.stackexchange.com/questions/127/does-stored-procedure-prevent-sql-injection">to pytanie</a> wspomina, że ​​istnieje niewielka różnica w „zapisanych procedurach” i „zapisanych funkcjach” w postgresql.</p><p>komentarz prowadzi do <a href="http://en.wikipedia.org/wiki/stored\_procedure#comparison\_with\_functions">artykuł na wikipedii</a> , ale niektóre z nich wydają się nie mieć zastosowania (np. że można ich użyć w instrukcji <code>select</code>).</p><p>sam <a href="http://www.postgresql.org/docs/current/interactive/plpgsql-trigger.html">składnia</a> wydaje się nieco mylący:</p><pre><code>create function emp\_stamp() returns trigger as $emp\_stamp$ begin [...] end; $emp\_stamp$ language plpgsql; create trigger emp\_stamp before insert or update on emp for each row execute procedure emp\_stamp(); </code></pre><p>tworzysz <code>function</code>, ale nazywaj to <code>procedure</code>.</p><p>jaka jest różnica między tymi dwoma?</p>
<p>oficjalnie postgresql ma tylko „funkcje”. funkcje wyzwalające są czasami nazywane „procedurami wyzwalającymi”, ale użycie to nie ma wyraźnego znaczenia. wewnętrznie funkcje są czasami nazywane procedurami, na przykład w katalogu systemowym <code>pg\_proc</code>. to pozostałość po postquel. wszelkie funkcje, które niektóre osoby (prawdopodobnie z doświadczeniem w różnych systemach baz danych) mogą skojarzyć z procedurami, takie jak ich znaczenie w zapobieganiu wstrzyknięciom sql lub wykorzystaniu parametrów wyjściowych, mają również zastosowanie do funkcji istniejących w postgresql.</p><p>teraz, gdy ludzie ze społeczności postgresql mówią o „procedurach przechowywanych” lub „prawdziwych procedurach przechowywanych”, często mają one na myśli hipotetyczną funkcję obiektu podobnego do funkcji, który może uruchamiać i zatrzymywać transakcje w jego ciele, coś, czego obecne funkcje nie mogą zrobić. w tym kontekście wydaje się, że termin „procedura składowana” jest analogiczny do innych produktów bazodanowych. zobacz <a href="http://archives.postgresql.org/pgsql-hackers/2011-04/msg01149.php">ta lista mailingowa</a> wątek dla niejasnego pomysłu.</p><p>w praktyce jednak to rozróżnienie funkcji i procedury pod względem ich możliwości kontrolowania transakcji nie jest powszechnie akceptowane, a na pewno wielu programistów bez stronniczości bazy danych przyjmie interpretację procedury podobną do pascala jako funkcję bez wartości zwracanej. (wydaje się, że standard sql ma pośredni charakter, ponieważ procedura według <em> domyślnie </em> ma inne zachowanie transakcyjne niż funkcja, ale można to skorygować według obiekt.) tak więc w każdym przypadku, a zwłaszcza patrząc na pytania na stack exchange z bardzo zróżnicowaną publicznością, powinieneś unikać przyjmowania zbyt wielu założeń i używania jaśniejszych terminów lub definiowania oczekiwanych właściwości.</p>
Ok. Znalazłem to w czym problem.


Na początku myślałem, że to problem z DataProvided, ale to nie było. Odkryłem ten sam problem w SQLServer 2000 ....


Wyszukiwanie w google dowiedziałem się czegoś o plan wykonania. Biorąc w ten sposób, że zapytania zwiększyło wydajność 50%.


Krótki życiorys tego problemu jest to, że podczas wykonywania SP kodem, DBMS ma pewne problemy z planu wykonania, a nie korzystać z indeksów ...


Lepszą odpowiedź jest w tym poście:
 [Parametr Wąchania (lub Fałszowanie) w SQL Server](https://stackoverflow.com/questions/211355/parameter-sniffing-or-spoofing-in-sql-server)


Mam nadzieję, że to Ci pomoże. Zapisz - zapisujesz zmiany naniesione w danym dokumencie.
  
Zapisz jako - cały dokument, razem ze wprowadzonymi zmianami zostanie zapisany jako nowy plik, całkiem osobny. Replikacja [works by reading the transaction log](https://technet.microsoft.com/en-us/library/ms151706%28v=sql.105%29.aspx) .

Ten rodzaj „aktualizacji bez aktualizacji” często nie generuje żadnych rekordów dziennika transakcji.

Więcej informacji na ten temat można znaleźć w artykule Paula White'a [The Impact of Non-Updating Updates](http://sqlblog.com/blogs/paul_white/archive/2010/08/11/the_2D00_impact_2D00_of_2D00_update_2D00_statements_2D00_that_2D00_don_2D00_t_2D00_change_2D00_data.aspx) . Obie alternatywy, które zostały wskazane ma wady i zalety, decyzja zależy od tego jak to plusy i minusy wpływa na aplikację:



> 
> Pobrać wszystkie wartości z bazy danych przy użyciu zwykłego PHP następnie przechowywać je w zmiennej JavaScript, później szukać sekund rozwijanej listy (jeśli wartość pierwszej rozwijanej liście na zmiany wartości) w zmiennej JavaScript (array).
> 
> 
> 


Plusy:


* Minimalizuje petycje http, trzeba tylko jedną prośbę, aby odzyskać całość danych.
* Minimalizuje kwerenda jest potrzebne w bazie danych, na ogół tylko wykonać jedno zapytanie.


Cons:


* Zwiększa ilość pamięci używanej jeśli masz duże ilości danych.
* Jeśli dane zmienia się nieustannie, użytkownicy nie widzą zmian aż odświeżyć całą stronę.



> 
> Jeśli pierwszy rozwijanej liście zmian wartości jest następnie pobrać wartości dla drugiej listy rozwijanej z bazą danych za pomocą technologii AJAX (jQuery).
> 
> 
> 


Plusy:


* Nie trzeba do przechowywania wszystkich danych w pamięci całych jedynie dane, które zostaną wykorzystane, co zmniejsza ilość potrzebnej pamięci.
* Twoje dane są aktualizowane za każdym razem, bez konieczności przeładowania strony tylko zmieniając wybór.


Cons:


* Trzeba wykonać kilka petycji HTTP i biegnie querys z bazą danych przy każdej zmianie wyboru.


Osobiście preferuję metodę 2, jeśli ilość danych jest stosunkowo duża i wydajność nie jest koniecznością. Jest to dość szerokie, ale dam ci tak ogólną odpowiedź, jak tylko mogę.

**CTE ...**

* Są niezindeksowalne (ale mogą używać istniejących indeksów na obiektach, do których istnieją odwołania)
* Nie można mieć ograniczeń
* Są zasadniczo jednorazowe `VIEW` s
* Trwać tylko do momentu uruchomienia następnego zapytania
* Może być rekurencyjny
* Nie masz dedykowanych statystyk (polegaj na statystykach dotyczących podstawowych obiektów)

**#Temp Tables ...**

* Są prawdziwe zmaterializowane tabele, które istnieją w tempdb
* Może być indeksowany
* Może mieć ograniczenia
* Trwaj w życiu obecnego POŁĄCZENIA
* Może odwoływać się do innych zapytań lub podprocedur
* Masz dedykowane statystyki generowane przez silnik

Jeśli chodzi o użycie każdego z nich, mają bardzo różne przypadki użycia.Jeśli masz bardzo duży zestaw wyników lub musisz odwołać się do niego więcej niż raz, umieść go w tabeli `#temp` .Jeśli ma być rekurencyjny, jednorazowy lub po prostu dla uproszczenia logicznego, preferowany jest `CTE` .

Ponadto należy `CTE`**nigdy nie używaj do wykonania**.Prawie nigdy nie przyspieszysz przy użyciu CTE, ponieważ znowu jest to widok jednorazowy.Możesz zrobić z nimi kilka fajnych rzeczy, ale przyspieszenie zapytania nie jest jednym z nich. Właściwie znalazłem problem. Moduł obsługi zdarzeń było wewnątrz innej funkcji! druga pewnie jest dla sprawdzenia poprwanosci odpowiedzi, kucze nie pamietam dokladnie tych komend ale sprobuj skopjowac je z tej gotowej tabelki i ewentualnie cos pozmieniaj- a dokladniej t wspolrzedne pol zeby sie zgadzaly (wstaw tylko w pierwszych ramkach a reszte zlap za jeden rog i przeciagnij to ci sie skopiuje dla innych wynikow) Dokładne definicje `vsize`, `rss`, `rprvt`, `rshrd`, i inne skróty niejasne wyglądzie różnią się od systemu operacyjnego do systemu operacyjnego. Strony podręcznika dla `top`i `ps`komend będzie mieć jakiś opis, ale wszystkie te opisy są znacznie uproszczone (lub są oparte na długo wymarłych implementacje jądra).   

„Rozmiar Proces” jako pojęcie to fiendishly trudne do styku w ogólnym przypadku. Odpowiedzi w konkretnych przypadkach uzależniona od rzeczywistego wdrożenia zarządzania pamięcią w systemie operacyjnym, a rzadko są tak satysfakcjonujące jak schludny „wielkości procesowej” koncepcji, która istnieje w umysłach większości użytkowników (i najbardziej programistów).


Na przykład, żadna z tych liczb (ani też, prawdopodobnie, każda kombinacja z nich) może być używany, aby powiedzieć dokładnie, ile takie procesy mogą działać jednocześnie w danej ilości wolnej pamięci. Ale tak naprawdę, najlepiej jest przyjść na nią z tym koniec: dlaczego chcesz ten numer, a co będzie go używać? Biorąc pod uwagę, że informacje, myślę, że dostaniesz więcej użytecznych odpowiedzi. ja w kompie mam konta np. jest administrator i tak dalej.  
no i ja mam swoje konto i tam w operze nie działa.  
a na innym koncie w operze działa ;) i tak będziesz z każdym zadaniem przychodzić tutaj? :stuck\_out\_tongue:

po każdej zmiennej powpisuj sobie czytelne komunikaty w print'ach z aktualną wartością zmiennej i będziesz wszystko wiedzieć jak program się wykonuje.

tutaj akurat masz pętlę while z warunkiem x < 5, i w niej zagnieżdżoną drugą…