Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Parametr nie działa tak dobrze, jak twarde kodowanie wartości

EDYTUJ PODSUMOWANIE Na prośbę Damiena_The_Unbeliever

Celem jest uzyskanie najlepszych/najwięcej informacji o wartości zmiennej do SQL PRZED utworzeniem planu, zazwyczaj robi to sniffing parametrów. Może być powód, dla którego podsłuchiwanie parametrów było w tym przypadku „wyłączone”. Bez zobaczenia lepszej reprezentacji rzeczywistego kodu nie możemy tak naprawdę powiedzieć, jakie jest rozwiązanie lub dlaczego istnieje problem. Wypróbuj poniższe rozwiązania, aby zmusić dotknięte obszary do generowania planów przy użyciu rzeczywistych wartości.

*DŁUGA WERSJA Z WIĘKSZYMI SZCZEGÓŁAMI *

Czy to twój rzeczywisty przechowywany proces? Czy masz domyślne wartości dla swoich parametrów? Jeśli tak, jakie one są?

Wąchanie parametrów może pomóc - ale musi mieć typowe wartości parametrów, aby dobrze utworzyć plan, a jeśli nie, tak naprawdę nie pomoże lub stworzy zły plan oparty na nietypowej wartości parametru. Jeśli więc zmienna ma domyślną wartość null lub wartość, która nie jest typową wartością przy pierwszym uruchomieniu i skompilowaniu planu - tworzy to zły plan.

Jeśli ktoś inny napisał ten sproc - mógł celowo "wyłączyć" parametr sniffing z lokalnymi zmiennymi z jakiegoś powodu. Reguły biznesowe mogą wymagać tych zmiennych struktur.

Celem jest uzyskanie najlepszych/najwięcej informacji o wartości zmiennej do SQL PRZED utworzeniem planu i generalnie robi to Wykrywanie Parametrów. Ale są rzeczy, które mogą negatywnie wpłynąć na wydajność i być może dlatego jest „wyłączone”. Nadal wygląda na to, że plan jest tworzony z nietypowymi wartościami parametrów lub z niewystarczającą ilością informacji - przy użyciu funkcji sniffingu lub nie.

Spróbuj wywołać zapytanie wewnątrz sproc z Użyj sp_executesql do wykonania zapytań, których dotyczy problem, zmuszając je do wygenerowania planu dla tego obszaru z rzeczywistymi zmiennymi i sprawdź, czy jest lepszy. To może być twoje rozwiązanie, jeśli musisz mieć tego rodzaju nieregularną wartość parametru - utwórz przechowywane procedury, które uruchamiają zaatakowane części i wywołuj je później z procedury składowanej - po tym, jak zmienna otrzyma typową wartość.

Bez zobaczenia lepszej reprezentacji rzeczywistego kodu, trudno jest dostrzec, na czym polega problem. Mam nadzieję, że te informacje pomogą -



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Scalanie nieużywanych przedziałów czasowych

  2. Jak sys.dm_exec_describe_first_result_set_for_object działa w programie SQL Server

  3. Sprawdź, czy istnieje tabela tymczasowa i usuń, jeśli istnieje przed utworzeniem tabeli tymczasowej

  4. Nie można połączyć się z bazą danych z pliku

  5. Jak uzyskać ostatni rekord na grupę w SQL?