Udostępnij za pośrednictwem


Guidelines for Disabling Indexes and Constraints

Wyłączenie indeksu uniemożliwia użytkownikowi dostęp do indeksu, a dla indeksów klastrowanych tabela źródłowa danych.The SQL Server Database Engine may automatically disable an index during a upgrade of SQL Server, or you can manually disable an index.Aby uzyskać więcej informacji zobaczDisabling Indexes.

Można wyłączyć dla dowolnego typu indeksu.Gdy indeks jest wyłączona, obowiązują następujące reguły:

  • Jeśli indeks jest unikatowy, ograniczenia klucz podstawowy lub UNIQUE i wszystkie ograniczenia klucz obcy, które odwołują się do kolumn indeksowanych z innych tabel są wyłączone.Wyłączanie indeksu użytkownik musi mieć uprawnienia ALTER te tabele lub instrukcja ALTER DISABLE indeks nie powiedzie się.Jeżeli indeks jest klastrowany, są wyłączone, wszystkie przychodzące i wychodzące ograniczenia klucz obcy dla tabela podstawowej.

    Warunek ograniczający nazwy są wymienione w komunikat ostrzegawczy, gdy indeks jest wyłączony.Po przebudowywanie indeksu, ograniczenia muszą być włączone ręcznie przy użyciu instrukcja ALTER tabela Sprawdź CONSTRAINT.

  • Indeks nie jest zachowywane, gdy jest ona wyłączona.

  • optymalizator kwerendy nie bierze pod uwagę indeksu podczas tworzenia planów wykonania kwerendy.Ponadto kwerendy, które odwołują się do wyłączonego indeksu z tabela wskazówkę się nie powieść.

  • Nie można utworzyć indeks, który używa tej samej nazwy jak istniejące wyłączony indeks, ponieważ definicja indeksu nadal istnieje metadane.

  • Może być odrzucone, wyłączony indeks.

Wyłączenie ponownego zbudowania indeksów nie klastrowanych

Wyłączanie indeks nieklastrowany fizycznie powoduje usunięcie danych indeksu.Jednak definicja indeksu pozostaje metadane.Następujące dodatkowe wskazówki dotyczą wyłączenie ponownego zbudowania indeksów nie klastrowanych:

  • Statystyki dotyczące indeksu pozostają na miejscu i są automatycznie aktualizowane w razie potrzeby.

  • Ponownego zbudowania indeksów nie klastrowanych są automatycznie wyłączane, gdy skojarzony indeks klastrowany jest wyłączona.Nie może być one włączone aż indeksem klastrowanym dla tabela lub widoku jest włączona albo indeksem klastrowanym dla tabela zostanie usunięte.Ponownego zbudowania indeksów nie klastrowanych musi być jawnie włączone, chyba że indeks klastrowany zostało włączone przy użyciu instrukcja ALTER ALL ODBUDOWAĆ indeks.Aby uzyskać więcej informacji zobaczGuidelines for Enabling Indexes and Constraints.

Wyłączanie indeksów klastrowanych

Następujące dodatkowe wskazówki dotyczą wyłączenie indeksów klastrowanych:

  • Nie można uzyskać dostępu do wierszy danych indeks klastrowany zostanie wyłączone, z wyjątkiem sytuacji, aby upuścić lub ponownie utwórz indeks klastrowany.Oznacza to, że następujące czynności:

    • Te czynności nie powiedzie się: SELECT, UPDATE, DELETE, INSERT, CREATE INDEX, CREATE STATISTICS, aktualizacja statystyki (w indeksie) i modyfikowania kolumn w tabela lub ograniczenia instrukcji ALTER tabela.

    • Te operacje powiedzie: CREATE VIEW, DROP VIEW, CREATE TRIGGER, DROP TRIGGER, DROP indeks, ALTER tabela TRIGGER ENABLE/DISABLE, SKRÓCIĆ tabela i DROP tabela.

    • Nie można utworzyć ponownego zbudowania indeksów nie klastrowanych, w czasie, gdy indeks klastrowany jest wyłączona.

  • Istniejące ponownego zbudowania indeksów nie klastrowanych i indeksów XML skojarzony z tabela są automatycznie wyłączane i nie można uzyskać do niego dostępu.

  • Wszystkie indeksy klastrowane i nieklastrowany widoków, które odwołują się do tabela są wyłączone.Indeksy te muszą być ponownie zbudowana tak samo jak w tabela, do którego istnieje odwołanie.

Wyłączanie ograniczenia

Te dodatkowe wskazówki dotyczą wyłączenie klucz podstawowy, klucz obcy i ograniczeń UNIQUE:

  • Ograniczenia klucz podstawowy i unikatowy są wyłączone, wyłączając indeksu skojarzona przy użyciu instrukcja ALTER indeks wyłączona.

  • Gdy ograniczenia klucz podstawowy jest wyłączona, wszystkie skojarzone ograniczenia klucz obcy także są wyłączone.Jest to równoważne z ustawieniem opcji CONSTRAINT NOCHECK na ograniczenie.

  • W tabelach, do którego istnieje odwołanie, musi mieć uprawnienia ALTER lub sterowania.

  • Jeśli CASCADE UPDATE lub akcja DELETE zadeklarowano na odwołanie do klucz obcy oraz że odwołanie jest wyłączona, nie wszystkie aktualizacje i usuwanie instrukcji, które mogłoby spowodować ograniczenie do propagowania modyfikacji odwołujący się tabelą.

  • Zduplikowane wartości mogą być przypadkowo dodawane do tabela podczas klucz podstawowy lub indeks unikatowy jest wyłączony lub w SQL Server Uaktualnij przez zmianę, która spowodowała indeksu, który ma zostać wyłączona. Należy ręcznie usunąć zduplikowane wiersze przed indeks może być włączona pomyślnie.Możliwe są następujące rozwiązania:

    • Ręcznie usuń lub zmień wartości zduplikowanych.

    • Nie można utworzyć UNIKATOWEGO indeksu w wyniku tworzenia ograniczenia typu UNIQUE, należy użyć CREATE INDEX WITH DROP_EXISTING ponowne utworzenie indeksu bez określenia unikatowa.

    • Jeśli indeks został utworzony jako byproduct klucz podstawowy lub ograniczenia UNIQUE, należy usunąć ograniczenie.Indeks zostanie następnie usunięte.Ograniczenia klucz podstawowy musi również usunięte wszystkie ograniczenia klucz obcy.

  • klucz obcy i sprawdź ograniczenia, które są wyłączone, są oznaczone is_not_trusted.These jest wyświetlana w sys.check_constraints and sys.foreign_keys widoki wykazu.Oznacza to, że ograniczenie to nie jest już sprawdzanym przez system dla wszystkich wierszy w tabela.Nawet wtedy, gdy użytkownik ponownie włączyć ograniczenie, go będą nie reverify istniejące wiersze przed tabela o ile nie wybierzesz opcji WITH Sprawdź w instrukcji ALTER tabela.Specifying WITH Sprawdź ponownie oznacza ograniczenie jako zaufane.

    Następujący przykład wyłącza ograniczenie, które ogranicza wynagrodzenia, akceptowane w danych.CONSTRAINT NOCHECK jest używane z instrukcji ALTER tabela, aby wyłączyć ograniczenie i umożliwić wstawiania, które zazwyczaj czy naruszenie ograniczenia.WITH Sprawdź Sprawdź ograniczenia ponownie włącza ograniczenie, a następnie sprawdza też poprawność istniejących danych, w stosunku do ponownego włączenia ograniczeń.

    CREATE TABLE cnst_example 
    (id INT NOT NULL,
        name VARCHAR(10) NOT NULL,
        salary MONEY NOT NULL
        CONSTRAINT salary_cap CHECK (salary < 100000);
    )
    
    -- Disable the constraint.
    ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap;
    
    -- Reenable the constraint.
    ALTER TABLE cnst_example WITH CHECK CHECK CONSTRAINT salary_cap;
    

Wyłączanie indeksy na widoki

Wyłączanie indeks klastrowany z widokiem fizycznie powoduje usunięcie danych indeksu.Następujące dodatkowe wskazówki dotyczą wyłączenie indeksów w widokach:

  • Wyłączanie indeks klastrowany w widoku nie zapobiega zmian w tabela podstawowej.

  • Wyłączanie indeksem klastrowanym dla widoku wyłącza także wszelkie nieklastrowany indeksy w tym widoku.

  • Usuwane są wiersze danych indeksu dla indeksów klastrowanych i nieklastrowany.Jednak definicji widoku i indeks pozostają metadane i mogą być ponownie utworzony przez odbudowy, indeks lub indeksy.

  • Instrukcja ALTER ALL ODBUDOWAĆ indeks odbudowania i włącza wszystkie indeksy wyłączony na tej tabela, z wyjątkiem dla niepełnosprawnych indeksów w widokach.Indeksy w widoku musi być włączony w oddzielnych instrukcja ALTER ALL ODBUDOWAĆ indeks.

  • Przebudowywanie indeks klastrowany w widoku nie powoduje automatycznego włączenia ponownego zbudowania indeksów nie klastrowanych w widoku.

  • Ponownego zbudowania indeksów nie klastrowanych muszą być włączone ręcznie po ponownym utworzeniu będącego po przebudowywanie indeks klastrowany.

Wykonywanie operacji indeks online na indeksy wyłączone

Wyłączone indeks nieklastrowany online można odbudować wówczas, gdy w tabela nie ma wyłączoną indeks klastrowany.Jednak należy ponownie zawsze utworzyć indeks klastrowany wyłączone tryb offline, jeśli można użyć instrukcja ALTER ODBUDOWAĆ indeks lub CREATE INDEX WITH DROP_EXISTING.Aby uzyskać więcej informacji na temat operacji indeksu online zobacz Wykonywanie operacji indeks w trybie online.

Statystyki dotyczące indeksy wyłączone

Obowiązują następujące ograniczenia do statystyk indeksu po wyłączeniu indeksu:

  • Nie można pomyślnie wykonać instrukcja CREATE STATISTICS dla tabela, która ma wyłączoną indeks klastrowany.

  • Opcja bazy danych AUTO_CREATE_STATISTICS tworzy nowe statystyki kolumna, gdy indeks jest wyłączony, a w następujących warunkach:

    • AUTO_CREATE_STATISTICS jest ustawiona na ON

    • Nie ma żadnych istniejących statystyk dla kolumna.

    • Statystyki są wymagane podczas optymalizacji kwerendy.

  • sp_autostats kończy się niepowodzeniem, jeśli określona tabela ma wyłączoną indeks klastrowany.

  • sp_updatestats nie aktualizuje dane statystyczne dotyczące wyłączonych indeksów klastrowanych.

  • sp_createstats tworzy statystyki kolumn, które mogą być prowadzące kolumny wyłączony indeks.Kiedy indexonly zostanie określona, statystyki nie są tworzone na kolumny w indeksie wyłączone, chyba że kolumna jest również używany w innym włączonego indeksu.

Polecenia DBCC

Jeżeli indeks klastrowany jest wyłączony, DBCC CHECKDB nie może zwrócić informacji o tabela podstawowej.Zamiast tego w instrukcja zgłasza, że indeks klastrowany jest wyłączona.DBCC INDEXDEFRAG nie można zdefragmentować wyłączony indeks.Instrukcja nie powiedzie się komunikat o błędzie.Można użyć DBCC DBREINDEX odbudować wyłączony indeks.

Wyświetlanie stanu wyłączony indeks

Jeśli indeks lub ograniczenia klucz podstawowy lub UNIQUE jest wyłączona, wyświetlany jest komunikat ostrzegawczy, zawierające listę wszystkich podlegających usterce indeksy i ograniczenia klucz obcy lub CZEK.Ponadto można wyświetlać wyłączone stanu indeksu w sys.Indexes katalogu widoku lub przy użyciu INDEXPROPERTY działa.Można przeglądać stan wyłączone klucz obcy i wyboru sys.foreign_keys and sys.check_constraints wykazu przegląda, odpowiednio.Aby uzyskać więcej informacji zobaczViewing Index Information.

Przykłady

Następujący przykład wyłącza indeks nieklastrowany na Employee Tabela.

USE AdventureWorks;
GO
ALTER INDEX IX_Employee_ManagerID 
ON HumanResources.Employee DISABLE;