2013-01-07 13 views
20

Na początku rozwoju naszej aplikacji dość mocno stosowaliśmy SQLDache do buforowania wyników db, dopóki powiadomienia nie powiedziały naszej aplikacji o pobranie nowej kopii.Korzystanie z SQLDependency vs. okresowe pobieranie z tabeli (wpływ na wydajność)

Podczas testów zauważyliśmy, że wydajność sql db została zwiększona przez usługę powiadamiania sqldependency. Zredukowaliśmy liczbę stołów, w których używaliśmy sqldependency i zauważyliśmy duży wzrost wydajności. Więc pomyśleliśmy, że właśnie skończyliśmy używać tego i ruszyliśmy dalej. Przechodzimy teraz tylko do kilku stołów.

Później odkryliśmy, że nie możemy przeskalować poziomu zabezpieczeń dla nazwy użytkownika, która ustanowi zależność. Możemy mieć więcej niż jeden ciąg połączenia dla każdego db (jeden dla zależności i jeden dla reszty aplikacji), ale z wieloma dbami i db mirroringiem, to jest ból (z punktu widzenia sql db admin i rozwoju aplikacji)

w tym momencie jesteśmy na samą myśl o odejście od SQLDependency całkowicie opiera się na następującej logice:

  1. nie potrzebujemy „instant” powiadomienie, że dane zostały zmienione. Gdybyśmy wiedzieli w ciągu 1 sekundy, byłoby to wystarczająco szybkie.
  2. Przy odrobinie re-faktoringu, możemy dostać to do zaledwie 1 tabeli i odpytywać ten stół raz na sekundę.

Czy ktoś widzi błąd w tej logice?

Czy odpytywanie jednej tabeli raz na sekundę powoduje mniejsze lub większe obciążenie bazy danych niż zależności SQL?

Czy ktoś miał podobny problem z wydajnością w SQLDependency?

+0

W jaki sposób Twoje ankiety wykryją zmiany? Wyzwalacze? –

+0

Tak - wyzwalacze. – SLoret

+0

Jako pasek boczny; Nigdy nie używałem tej technologii, ale może się okazać, że jest ona przydatna: http://msdn.microsoft.com/en-us/library/ms130764(v=sql.105).aspx – MarkD

Odpowiedz

9

Ja odważę się spróbować odpowiedzieć na twoje pytanie. Ale nie jestem pewien, czy dostaniesz odpowiedź, na którą miałeś nadzieję ...

Pamiętam, jak wspominałem na początku lat 90., kiedy Borland promował tę nową, wielką funkcję "wywołań zwrotnych" w bazie danych Interbase, która dawała dzwoniącemu (Delphi) "powiadomienia" za pośrednictwem całkiem sprytnej nowej technologii, gdzie złożono obietnice, że baza danych może być "aktywna".

To było później znane jako "waste of time theory".

I wydaje mi się, że nigdy nie wzięło się tego pod uwagę, chociaż koncepcja DBMS wyglądała bardzo obiecująco, baza danych to jedna z twoich poziomów, którą można rozbudować, a nie poziomo.

Tak więc języki programowania na ratunek. A raczej pomysł architektury zorientowanej na usługi (SOA). Wiele zmyliło SOA za "Webservices", który był rzeczywiście zawarty w tej nowej koncepcji.

Ale jeśli sprawdzisz wzór projektu Fiefdom/Emissary (lub przemianowany wzorzec Master/Agent, aby brzmiał bardziej cool i profesjonalnie), odkryjesz, że głównym pomysłem jest wyłączna kontrola jego zasobów (czytaj bazy danych) oraz że wszystkie połączenia są kierowane za pośrednictwem jednego adaptera danych.

Oczywiście taki projekt nie działa w ogóle z wyzwalaczami ani żadnymi ramami zwrotnymi.

Ale myślę, że powinieneś przemyśleć cały swój projekt.Jeśli kierujesz wszystkimi akcjami i wszystkimi połączeniami za pomocą pojedynczej "DataLayer", być może za pomocą Entity Framework, a może na górze, na mechanizmie buforowania, nie będziesz musiał polegać na bazie danych, aby przekazywać wiadomości z powrotem do łańcucha żywnościowego.

Aby pokazać, jak dziwne rzeczy, które można uzyskać, gdy będąc na „baza-centric”, tutaj jest skrajnym rzeczywisty przykład na żywo, jak nie należy wysłać e-mail, napisany dawno dawno temu, przez koder nie było tak dużo pod wrażeniem:

Fakt 1: Serwer Sql może wysyłać wiadomości e-mail.

Fakt 2: Koder Asp3 nie wie, czy i jak można tego dokonać w VbScript.

Asp3: czytaj pole tekstowe adres email, wyślij do COM + warstwy

Com +: wziąć adres email i przekazania do dataLayer

dataLayer: wziąć adres email i przekazania do procedury przechowywanej

Sproc: przyjmij adres e-mail i prześlij do funkcji sql

funkcja: wykonaj dziwne czynności podłańcuchowe, aby sprawdzić, czy adres e-mail ma @. w tym. return true lub false.

sproc: zwraca zestaw rekordów z jednej kolumny oraz jeden rząd zawierający 0 lub 1

dataLayer: powrotu stołu postaci.

Com +: konwersja pierwszą kolumnę i wiersz o wartości 1 lub 0 do prawdziwej lub fałszywej

Asp3: Jeśli to prawda, wysłać adres mailowy z tematem e-mail i tekst e-mail do COM +

Com +: wysyła dokładne informacje na dataLayer

dataLayer: wywołuje procedurę przechowywaną ..

sproc: nazywa sql-function ...

fu nction: używa serwera poczty e-mail serwera SQL do wysłania wiadomości e-mail

Jeśli czytasz tak daleko, moja rada jest taka, aby serwer SQL zarządzał tabelami, relacjami, indeksami i transakcjami. W tym jest bardzo dobrze. Wszystko, co wykracza poza te zadania, a także to, że włączam kursory w procedurach przechowywanych, jest lepiej obsługiwane za pomocą odpowiedniego kodu.

+2

Czy możesz być bardziej konkretny? –

Powiązane problemy