Udostępnij za pośrednictwem


Najważniejsze wskazówki dla filtrów czasu na podstawie wiersza

Użytkownicy aplikacji często wymagają od czas podzbiór danych z tabela.Na przykład, sprzedawca może wymagać danych zamówień w ostatnim tygodniu lub zdarzenie planowania mogą wymagać danych dla zdarzenie s w nadchodzących tygodnia.W wielu przypadkach aplikacji za pomocą kwerendy zawierającej GETDATE() Funkcja do wykonania tej czynności. Rozważmy następującą instrukcję filtr wiersza:

WHERE SalesPersonID = CONVERT(INT,HOST_NAME()) AND OrderDate >= (GETDATE()-6)

Za pomocą filtru tego typu jest zazwyczaj zakłada że dwie rzeczy zawsze występuje po uruchomieniu Agent korespondencji seryjnej: wiersze, które spełniają ten filtr są replikowane do subskrybentów; i wierszy, które nie spełniają tego filtru są czyszczone przy subskrybentów. (Aby uzyskać więcej informacji na temat filtrowania z HOST_NAME(), zobacz Sparametryzowana filtry wierszy.) Jednak replikacja łączenia replikacja i tylko dane, które uległy zmianie od czasu ostatniej synchronizacji, niezależnie od tego, jak zdefiniować filtr wiersza dla tych danych, które utraciły.

Do replikacja łączenia do przetworzenia wiersza dane w wierszu musi spełniać filtr wiersza, a musi on uległy zmianie od czasu ostatniej synchronizacji.przypadek braku SalesOrderHeader tabela, DataZamówienia. jest wprowadzany podczas wstawiania wiersza.Wiersze są replikowane do subskrybent zgodnie z oczekiwaniami, ponieważ insert jest zmiana danych.Jednak w przypadku wierszy przez subskrybent, które nie spełniają filtru (są one dla zamówienia starsze niż siedem dni), te nie są usuwane z abonenta, chyba że zostały one aktualizowane innego powodu.

Wielkość terminarz zdarzeń do dalszego wyróżnia problem z ten typ filtrowania.Należy wziąć pod uwagę następujące filtr dla Zdarzenia tabela:

WHERE EventCoordID = CONVERT(INT,HOST_NAME()) AND EventDate <= (GETDATE()+6)

Dla tabela, która zawiera zdarzenie wstawia mogą być dokonywane również przed data.Wstawianie zdarzenie w nadchodzącym tygodniu dokonano miesiąc temu innego powodu nie został zaktualizowany w wierszu, w wierszu nie są replikowane na abonenta, nawet wtedy, gdy spełnia on filtr wiersza.

Ponadto w zależności od tego, jak publikacja jest skonfigurowana, replikacja łączenia ocenia filtrów w różnym czasie:

  • Jeśli w publikacja używane partycje precomputed (ustawienie domyślne), filtry są wyznaczane wiersza jest wstawiany lub aktualizowany.

  • Jeśli publikacja nie będzie używać precomputed partycje, filtry są obliczane po uruchomieniu Agent korespondencji seryjnej.

Aby uzyskać więcej informacji na temat precomputed partycji zobacz Optymalizacja sparametryzowana wydajności filtr z Precomputed partycji. Czas, w którym filtr jest oceniany wpływa na dane, które spełnia filtru.Na przykład użytych precomputed partycji i synchronizowania danych co dwa dni, podzbiór danych, sprzedawcy, może zawierać wiersze do oczekiwanych starsze niż dwa dni.

Zalecenia dotyczące używania filtrów na podstawie czas wiersz

Następująca metoda dostarcza bezpośrednie i niezawodne rozwiązanie do filtrowania na podstawie czas:

  • Dodawanie kolumna do tabela typu danych bit. Ta kolumna jest używana do wskazania, czy wiersz powinien być replikowany.

  • Użyj filtru wiersz, który odwołuje się do nowej kolumny, a nie od czas kolumna.

  • Tworzenie zadanie agenta programu SQL Server (lub zadanie zaplanowane za pomocą innego mechanizmu), aktualizuje kolumna, zanim agent korespondencji seryjnej jest zaplanowane do uruchomienia.

Takie podejście dotyczy braków użycia GETDATE() lub inną metodą od czas i pozwala uniknąć tego problemu, trzeba określić, kiedy zostaną obliczone filtry dla partycji. Proszę rozważyć następujący przykład Zdarzenia tabela:

Identyfikator EventID

EventName

EventCoordID

EventDate

Replikowanie

1

Odbiór

112

2006-10-04

1

2

Obiad

112

2006-10-10

0

3

Strona

112

2006-10-11

0

4

Wedding

112

2006-10-12

0

Filtr wiersza w tej tabela następnie wyglądałby następująco:

WHERE EventCoordID = CONVERT(INT,HOST_NAME()) AND Replicate = 1

Można wykonać zadanie agenta programu SQL Server Transact-SQL Uruchomienie instrukcji podobny do następującego przed każdego agenta korespondencji seryjnej:

UPDATE Events SET Replicate = 0 WHERE Replicate = 1
GO
UPDATE Events SET Replicate = 1 WHERE EventDate <= GETDATE()+6
GO

W pierwszym wierszu resetuje Replikowanie kolumna0Ustawia kolumna do , a drugi wiersz1 dla zdarzenia występujące w ciągu następnych siedmiu dni.Jeśli ta Transact-SQL Instrukcja jest uruchamiane w 07/10/2006, tabela zostanie zaktualizowana tak, aby:

Identyfikator EventID

EventName

EventCoordID

EventDate

Replikowanie

1

Odbiór

112

2006-10-04

0

2

Obiad

112

2006-10-10

1

3

Strona

112

2006-10-11

1

4

Wedding

112

2006-10-12

1

Zdarzenia dla następnego tygodnia teraz są oznaczane jako gotowy do replikacji.Następnym razem, Agent korespondencji seryjnej jest uruchamiany za subskrypcję tego zdarzenie koordynatora 112 używa, wiersze, 2, 3 i 4 są pobierane do subskrybent i wierszu 1 zostanie usunięta z subskrybent.