2009-03-25 15 views
27

Ponieważ MySQL zaczął wspierać procedury składowane, nigdy tak naprawdę ich nie używałem. Częściowo dlatego, że nie jestem świetnym pisarzem zapytań, częściowo dlatego, że często pracuję z DBA, którzy dokonują tych wyborów dla mnie, częściowo dlatego, że jestem po prostu wygodny z tym, co wiem.MySQL: Widoki a procedury przechowywane

W zakresie dokonywania wyboru danych, szczególnie przy wyborze selekcji, która jest zasadniczo dezendralizacji (łączenia) i agregacji (średnia lub maksymalna, podzapytania w/zliczenia itp.) Wyboru danych, jaki jest właściwy wybór w MySQL 5.x? Widok? Lub procedura przechowywana?

Widoki Czuję się komfortowo - wiesz, jak powinno wyglądać zapytanie SELECT, więc po prostu utwórz je, upewnij się, że jest zindeksowane i co tam, a następnie po prostu wykonaj CREATE VIEW [View] AS SELECT [...]. Następnie w mojej aplikacji traktuję widok jako tabelę tylko do odczytu - reprezentuje ona znormalizowaną wersję moich znormalizowanych danych.

Jakie są wady - jeśli występują? A co by się zmieniło (zyski lub straty), gdybym przesunął dokładnie tę samą instrukcję SELECT do procedury przechowywanej?

Mam nadzieję, że uda mi się znaleźć dobre "pod maską" informacje, które trudno było znaleźć podczas googlowania w tym temacie, ale naprawdę z radością witam wszystkie komentarze i odpowiedzi.

+2

Dla wszystkich osób, które napotkają ten post i nie czują, że te odpowiedzi całkiem pasują do rachunku, istnieje świetny komentarz na temat [MSDN Social] (http://social.msdn.microsoft.com/Forums/en-US/sqlgetstarted/thread/64e834bc-c473-41dc-bb3c-6fd3bcfa0d57), które naprawdę pomagają zbudować solidniejsze zrozumienie podstaw. – Chiramisu

Odpowiedz

12

Moim zdaniem, Procedury składowane powinny być używane wyłącznie do manipulowania danymi, gdy ta sama procedura musi być używana w kilku różnych aplikacjach lub w przypadku ETL między bazami danych lub tabelami, nic ponadto. Zasadniczo, wykonuj tyle kodów, ile możesz, aż wpadniesz na zasadę DRY lub to, co robisz, to przenoszenie danych z jednego miejsca do drugiego w DB.

Widoki mogą służyć jako alternatywny lub uproszczony "widok" danych. W związku z tym chciałbym zobaczyć, ponieważ nie manipulujesz danymi tak bardzo, jak znajdujesz inną metodę ich wyświetlania.

+0

To wszystko dobrze i dobrze, dopóki nie napotkasz zestawu danych z> 100k rekordów i musisz użyć 'COUNT (*)' w swoim podzbiorze. Przechowywane procedury działają równie dobrze do gromadzenia danych, co czasami jest konieczne. –

3

Nie jestem pewien, czy to jest wybór. Procedury przechowywane mogą robić wiele różnych rzeczy, które widoki będą miały problemy (zapamiętaj dane w tabeli temp, a następnie uruchom kursor, a następnie wykonuj agregację i zwróć zestaw wyników).

Widoki z drugiej strony mogą ukrywać złożone prawa dostępu do plików i sql/i wyświetlać zmodyfikowany widok schematu.

Uważam, że oba mają swoje miejsce w planie rzeczy i oba są użyteczne dla udanego wdrażania schematów.

4

Używam widoków do deormalizacji lub formatowania wyjściowego i procedur przechowywanych w celu filtrowania i manipulowania danymi (rzeczy wymagające wprowadzania parametrów) lub iteracji (kursory).

Często uzyskuję dostęp do widoku wewnątrz procedury składowanej, gdy wymagana jest zarówno dezaktualizacja, jak i filtrowanie.

2

Jedna rzecz do zapamiętania, przynajmniej z wynikami mysql są przechowywane w tabeli tymczasowej i w przeciwieństwie do najbardziej przyzwoitych silników baz danych tabela ta nie jest indeksowana, więc jeśli chcesz uprościć zapytania, widok jest świetny, gdy twój program zamierza chwyć wszystkie wyniki z widoku, jednak jeśli przeszukujesz wyniki tego widoku, na podstawie parametrów jest niesamowicie wolny, szczególnie jeśli istnieją miliony rekordów do przeskoczenia, a jeszcze gorzej, jeśli widok jest zbudowany na innych widokach i tak dalej.

Procedura składowana umożliwia jednak przekazywanie tych parametrów wyszukiwania i uruchamianie kwerendy bezpośrednio względem tabel podkreślonych (indeksowanych). wadą jest to, że wyniki będą musiały być pobierane za każdym razem, gdy procedura jest uruchomiona, co może również wystąpić w widoku mimo to w zależności od konfiguracji serwera.

więc w zasadzie, jeśli za pomocą widoku próbujesz zminimalizować liczbę wyników (jeśli musisz przeszukać), użyj procedury przechowywanej.

Powiązane problemy