2014-06-05 15 views
5

Próbuję dowiedzieć się, dlaczego odczyty logiczne są wykonywane na tabeli docelowej podczas wstawiania do niej, gdy jest pusta tabela. Mam poniższą tabelę.Logiczne odczytuje pustą tabelę docelową podczas wstawiania do niej

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[Employee](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [EmployeeID] [int] NOT NULL, 
     [EmployeeName] [varchar](50) NOT NULL 
) ON [FG_Test] 

GO 

SET ANSI_PADDING OFF 
GO 

To jest pusta tabela z identyfikatorem będącym kluczem podstawowym z indeksem klastrowym na tym identyfikatorze. Kiedy należy stosować następujące INSERT

TRUNCATE TABLE [dbo].[Employee]; 

INSERT INTO [dbo].[Employee] WITH (TABLOCK) (EmployeeID, EmployeeName) 
(
SELECT EmployeeID, 
    EmployeeName 
FROM Process.Employee 
); 

Jak na ustawienie Statystyka IO, jestem coraz 1596236 logiczne czyta na stole dbo.Employee. Kiedy upuszczam indeks, te odczyty logiczne już się nie zdarzają, wtedy kiedy czytam - dodam ten sam indeks, to logiczne odczyty również już nie występują. Z czasem logiczne odczyty zaczynają się ponownie, gdy trzymam indeks na stole.

Dlaczego miałoby to być?

Odpowiedz

1

Zasadniczo odczyty logiczne są zgłaszane dla tabeli docelowej, gdy wkładka nie jest minimalnie zarejestrowana.

Te odczyty logiczne są powiązane ze znalezieniem miejsca w istniejącej strukturze w celu dodania nowych wierszy. Minimalnie rejestrowane wkładki korzystają z mechanizmu ładowania zbiorczego, który przydziela całe nowe strony/zakresy (i dlatego nie musi czytać docelowej struktury w ten sam sposób).

Zmiana widoczna podczas wstawiania do drzewa b może być zależna od tego, czy optymalizator zdecyduje się posortować wiersze w kolejności indeksu klucza (wstaw właściwość operatora DMLRequestSort = true), co umożliwi włączenie minimalnie zapisanych wstawień, jeśli tabela docelowa jest pusta lub jeśli włączone jest trace flag 610.

Powiązane problemy