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

Jak przekonwertować wykonanie wiersza po wierszu na podejście oparte na SET w SQL?

Dopóki struktura tabeli i oczekiwanych danych przykładowych wyników nie zostaną dostarczone, oto kilka szybkich rzeczy, które widzę, które można poprawić (niektóre z nich zostały już wspomniane przez innych powyżej):

  1. GDY Pętla jest również kursorem. Tak więc przejście na pętlę do while nie przyspiesza działania.
  2. Użyj kursora LOCAL FAST_FORWARD, chyba że musisz prześledzić rekord. To znacznie przyspieszyłoby wykonanie.
  3. Tak, zgadzam się, że podejście oparte na SET byłoby najszybsze w większości przypadków, jednak jeśli musisz gdzieś przechowywać pośrednie wyniki, sugerowałbym użycie tabeli tymczasowej zamiast zmiennej tabeli. Tabela temp jest „mniejszym złem” między tymi dwiema opcjami. Oto kilka powodów, dla których powinieneś unikać używania zmiennej tabeli:

    • Ponieważ SQL Server nie miałby żadnych wcześniejszych statystyk dotyczących zmiennej tabeli podczas budowania planu wykonania, zawsze będzie brał pod uwagę, że tylko jeden rekord zostanie zwrócony przez zmienną tabeli podczas konstruowania planu wykonania. W związku z tym Storage Engine przydzieli tylko tyle pamięci RAM do wykonania zapytania. Ale w rzeczywistości mogą istnieć miliony rekordów, które zmienna tabeli może przechowywać podczas wykonywania. Jeśli tak się stanie, SQL Server będzie zmuszony rozlać dane na dysk twardy podczas wykonywania (i zobaczysz wiele PAGEIOLATCH w sys.dm_os_wait_stats), co spowoduje spowolnienie zapytań.
    • Jednym ze sposobów na pozbycie się powyższego problemu jest podanie wskazówki na poziomie instrukcji OPTION (RECOMPILE) na końcu każdego zapytania, w którym używana jest wartość tabeli. Zmusiłoby to SQL Server do konstruowania planu wykonania tych zapytań za każdym razem w czasie wykonywania i można by uniknąć problemu z mniejszą alokacją pamięci. Jednak wadą jest to, że SQL Server nie będzie już mógł korzystać z już buforowanego planu wykonania dla tej procedury składowanej i będzie wymagał ponownej kompilacji za każdym razem, co w pewnym stopniu pogorszyłoby wydajność. Tak więc, o ile nie wiesz, że dane w tabeli bazowej zmieniają się często lub sama procedura składowana nie jest często wykonywana, takie podejście nie jest zalecane przez Microsoft MVP.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę przyspieszyć to zapytanie Sql Server Spatial?

  2. Generuj skrypty — tylko dane — znaleziono cykliczne zależności

  3. utwórz partycję na podstawie różnicy między kolejnymi indeksami wierszy w serwerze sql 2012

  4. SQL Server 2016:Utwórz użytkownika bazy danych

  5. Jak uzyskać datę w formacie RRRR-MM-DD z pola datetime TSQL?