Symptomy
Załóżmy, że na komputerze zastosowano dodatek Service Pack 2 (SP2) dla programu Microsoft SQL Server 2012. Użytkownik dzwoni do cdc.fn_cdc_get_net_changes_<capture_instance> kwerenda Capture (resourceing) w procedurze składowanej sp_executesql , która może pochodzić ze źródła aplikacji, takiego jak program SQL Server Management Studio Server (SSMSE), Przechwyć sam lub pakiet SQL Server Integration Services (SSIS). W takiej sytuacji wydajność programu SQL Server 2012 jest niska.UwagaSpadek wydajności może być duży. Na przykład kwerenda może zakończyć się w ciągu kilku sekund w programie SQL Server 2012 SP1. Jednak uruchomienie tego samego zapytania może trwać kilka godzin w programie SQL Server 2012 z dodatkiem SP2. Ponadto aktualizacja statystyki nie pomoże rozwiązać problemu.
Przyczyna
Ten problem występuje z powodu problemu z szacowaniem kardynalności, który poważnie wpływa na wydajność cdc.fn_cdc_get_net_changes_<capture_instance> Query.
Rozwiązanie
Ten problem został po raz pierwszy rozwiązany w poniższej zbiorczej aktualizacji programu SQL Server.
Zbiorcza aktualizacja 3 dla programu SQL Server 2012 z dodatkiem SP2 /en-us/help/3002049
Każda nowa Zbiorcza aktualizacja programu SQL Server zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji zbiorczej. Zapoznaj się z najnowszymi aktualizacjami zbiorczymi dla programu SQL Server:
Obejście
Aby obejść ten problem, użyj wskazówki dotyczącej kwerendy opcji (RECOMPILE) w zapytaniu. Na wypadek, gdyby kwerenda została wyzwolona przy użyciu składników usług wyszukiwania danych SSIS, Wskazówka opcji (RECOMPILE) może zostać wymuszona przez utworzenie przewodnika planu, tak jak w poniższym przykładzie:Exec sp_create_plan_guide @name = N'CDC_Query1_PlanGuide', @stmt = N'select [__$start_lsn],[__$operation],[__$update_mask],[Column1],[Column2],[Column3] from [cdc].[fn_cdc_get_net_changes_dbo_Table1](CONVERT(binary(10), @cs, 1), CONVERT(binary(10), @ce, 1), @mode)',@type = N'SQL',@module_or_batch = NULL, @params = N'@ce nvarchar(22),@mode nvarchar(14),@cs nvarchar(22)', @hints = N'OPTION (RECOMPILE)'; UwagaKonieczne jest zastąpienie kwerendy przykładem kwerendą, z którą jest skierowany problem. Można go poszukać w śledzeniu profilera , więc nie jest przypadkowo dodawany żaden dodatkowy znak. Ponadto upewnij się, że kwerenda wybierająca jest umieszczona w pojedynczym wierszu (na przykład nie powinna zawierać żadnych znaków powrotu karetki lub linii pomocniczych), aby plan mógł działać prawidłowo. Być może trzeba również użyć polecenia DBCC FREEPROCCACHE , aby wycinać stary plan z pamięci podręcznej.
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".