Udostępnij za pośrednictwem


Najważniejsze wskazówki dotyczące filtrów opartych na czasie wiersza

Użytkownicy aplikacji często wymagają czas-na podstawie podzbiór danych z tabela.Dla wystąpienie, sprzedawca może wymagać danych zamówień w ostatnim tygodniu lub planowanie zdarzeń może wymagać danych dla zdarzeń w nadchodzącym tygodniu.W wielu przypadkach aplikacje używają kwerend zawierających GETDATE() funkcja, aby osiągnąć ten cel.Rozważmy następujący filtr wiersza instrukcja:

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

Filtr tego typu zwykle założyć że dzieją się dwie rzeczy zawsze podczas uruchamiania agenta scalania: wiersze, które spełniają ten filtr są replikowane do subskrybentów; i wiersze, które nie spełniają już tego filtru są czyszczone przy subskrybentów.(Aby uzyskać więcej informacji dotyczących filtrowania z HOST_NAME(), see Filtry parametrami wiersza.) Jednakże replikacja scalająca tylko replikuje i czyści danych, które uległy zmianie od czasu ostatniej synchronizacji, niezależnie od tego, jak zdefiniować filtr wiersza danych.

replikacja scalająca do przetwarzania wiersza danych w wierszu musi spełniać filtr wiersza i musi uległy zmianie od czasu ostatniej synchronizacji.W przypadek z SalesOrderHeader tabela, DataZamówienia wprowadzić podczas wstawiania wiersza.Wiersze są replikowane do subskrybenta zgodnie z oczekiwaniami, ponieważ wstawianie jest zmiana danych.Jednakże w przypadku wierszy przez subskrybenta, które nie spełniają już filtr (są one starsze niż siedem dni zamówień) one nie są usuwane z subskrybenta chyba że zostały one zaktualizowane innych przyczyn.

Sprawa zdarzenie dalsze terminarza wyróżnia problem z ten typ filtrowania.Rozważmy następujący filtr dla zdarzenia tabela:

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

Dla tabela, która zawiera zdarzenie może być dokonywane wstawia również z wyprzedzeniem data zdarzenie.Wstaw zdarzenie w nadchodzącym tygodniu dokonano miesiąc temu wiersza nie zostało zaktualizowane innego powodu, wiersz nie jest replikowana do subskrybenta, nawet, jeśli spełnia on filtr wiersza.

Ponadto w zależności od sposobu skonfigurowania publikacja replikacja scalająca ocenia filtrów w różnym czasie:

  • Jeśli publikacja precomputed partycji (ustawienie domyślne), filtry są wyznaczane wiersza jest wstawiany lub aktualizowany.

  • Jeśli publikacja nie używać partycji precomputed, filtry są wyznaczane scalić Agent jest uruchamiany.

Aby uzyskać więcej informacji o partycjach precomputed, zobacz Optymalizacja sparametryzowana wydajności filtr partycji Precomputed.Czas, w którym filtr jest oceniany dotyczy, jakie dane spełniają warunki filtru.Na przykład jeśli publikacja używa wstępnie obliczone partycje i synchronizowania danych co dwa dni, podzbiór danych dla sprzedawcy mogą obejmować wierszy w górę do dwóch dni starsze niż oczekiwano.

Zalecenia dotyczące korzystania z filtrów wierszy od czasu

Poniższa metoda zapewnia niezawodne i proste podejście do filtrowania na podstawie czas:

  • Dodawanie kolumna do tabela typ danych bit.To kolumna służy do wskazywania, czy wiersz powinien być replikowany.

  • Filtr wiersza odwołujący się do nowej kolumna zamiast czas-na podstawie kolumna.

  • Tworzenie zadania agenta programu SQL Server (lub zadanie zaplanowane przy użyciu innego mechanizmu), aktualizuje kolumna przed zaplanowaniem uruchamiania agenta scalania.

To podejście dotyczy braków za pomocą GETDATE() lub innej metoda opartej na czas i pozwala uniknąć problemu z konieczności określenia, kiedy filtry zostaną obliczone dla partycji.Rozważmy następujący przykład z zdarzenia tabela:

Identyfikator_zdarzenia

EventName

EventCoordID

EventDate

Replikuj

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 dla tej tabela następnie wyglądałby następująco:

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

wykonać zadanie agenta programu SQL Server Transact-SQL instrukcji podobny do następującego przed każdego uruchomienia agenta scalania:

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

Resetuje pierwszy wiersz replikowania kolumna do 0, i drugi wiersz ustawia kolumna 1 dla zdarzenia występujące w następnych siedmiu dni.Jeśli to Transact-SQL instrukcja działa na 07/10/2006, tabela jest aktualizowany do:

Identyfikator_zdarzenia

EventName

EventCoordID

EventDate

Replikuj

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 w następnym tygodniu teraz są oznaczane jako gotowe do replikacji.Następnego czas scalania Agent działa subskrypcja że Koordynator wydarzeń 112 zastosowań, będą pobierane wiersze, 2, 3 i 4 do subskrybenta i wiersz 1 zostaną usunięte z subskrybenta.