2016-03-25 17 views
7

Mam prosty skrypt.Co to za kolumna [Bmk1002] w operatorze skanowania tabeli mojego planu wykonania?

IF OBJECT_ID('dbo.Customers', 'U') IS NOT NULL 
    DROP TABLE dbo.Customers; 
GO 
CREATE TABLE dbo.Customers 
(
custid INT NOT NULL, 
companyname VARCHAR(125) NOT NULL, 
phone VARCHAR(120) NOT NULL, 
address VARCHAR(150) NOT NULL 
); 
INSERT INTO dbo.Customers 
     (custid, companyname, phone, address) 
VALUES (1, 'cust 1', '(111) 111-1111', 'address 1'), 
     (2, 'cust 2', '(222) 222-2222', 'address 2'), 
     (3, 'cust 3', '(333) 333-3333', 'address 3'), 
     (4, 'cust 4', '(444) 444-4444', 'address 4'), 
     (5, 'cust 5', '(555) 555-5555', 'address 5'); 
IF OBJECT_ID('dbo.CustomersStage', 'U') IS NOT NULL 
    DROP TABLE dbo.CustomersStage; 
GO 
CREATE TABLE dbo.CustomersStage 
(
custid INT NOT NULL, 
companyname VARCHAR(125) NOT NULL, 
phone VARCHAR(120) NOT NULL, 
address VARCHAR(150) NOT NULL 
); 
INSERT INTO dbo.CustomersStage 
     (custid, companyname, phone, address) 
VALUES (2, 'AAAAA', '(222) 222-2222', 'address 2'), 
     (1, 'cust 1111111111', '(111) 111-11111111111111', 'address 111111111'), 
     -- (1, 'cust 1111111112222222222', '(111) 111-1111111112222222222', 'address 1111111112222222222'), 
     (3, 'cust 3', '(333) 333-3333', 'address 3'), 
     (5, 'BBBBB', 'CCCCC', 'DDDDD'), 
     (6, 'cust 6 (new)', '(666) 666-6666', 'address 6'), 
     (7, 'cust 7 (new)', '(777) 777-7777', 'address 7'); 

SELECT * 
FROM dbo.Customers; 
SELECT * 
FROM dbo.CustomersStage; 

SET STATISTICS XML ON; 
MERGE INTO dbo.Customers d 
USING dbo.CustomersStage s 
ON d.custid = s.custid 
WHEN MATCHED THEN 
    UPDATE SET d.companyname = s.companyname, 
       d.phone = s.phone, 
       d.address = s.address 
WHEN NOT MATCHED THEN 
    INSERT (
      custid, 
      companyname, 
      phone, 
      address 
      ) 
    VALUES (
      s.custid, 
      s.companyname, 
      s.phone, 
      s.address 
      ); 
SET STATISTICS XML OFF; 

SELECT * 
FROM dbo.Customers; 

Plan wykonania oświadczenia MERGE wygląda następująco.

enter image description here

Można pobrać plan wykonania tutaj w https://drive.google.com/file/d/0B4xMAUd6DN6XdkZyTmJkdF9TY3c/view?

moje pytanie, co dokładnie jest to [Bmk1002]? Mam nadzieję, że ktoś może pomóc to wyjaśnić.

+0

[Bmk1002] może być: 1) Zagnieżdżone pętle (łączenia, odnośniki zewnętrzne); 2) Poszukiwanie indeksu; Oto przykład: http://sqlbitdatatype.blogspot.kr/2012/03/bookmark-explain-plan-understanding_22.html – Khazratbek

Odpowiedz

4

Jest to "zakładka" (określana także w wyrażeniu "wyszukiwanie zakładki").

To jest fizyczna lokalizacja wiersza (Plik: Strona: Slot).

Klienci to kupie

SELECT %%lockres%% 
FROM Customers 

pokaże te wartości (gdyby indeks klastra można użyć zamiast %%physloc%% ale surowe wyjście z tego nie jest tak przyjazny).

Jest to potrzebne w tym planie wykonania, ponieważ specyfikacja scalenia wymaga podania błędu w przypadku próby zaktualizowania lub usunięcia tego samego wiersza więcej niż jeden raz.

Ponieważ nie ma innego unikatowego klucza, SQL Server używa tej zakładki zamiast wartości gwarantowanej, aby móc jednoznacznie zidentyfikować wiersz.

Plan oblicza ROW_NUMBER() OVER (PARTITION BY Bmk1002 ORDER BY Bmk1002)* i operator assert zgłasza błąd, jeśli to kiedykolwiek >1 (co by się stało, gdyby nie było wiele wierszy w dbo.CustomersStage które łączą się tym samym jednym z dbo.Customers).


* Właściwie plan nazywa conditional_row_number zamiast row_number. Jest to wewnętrzna nieudokumentowana funkcja. Wyobrażam sobie, że używa wersji warunkowej, a nie prostej row_number, ponieważ musi zignorować wiersze z akcją "wstawiania" w sprawdzaniu duplikatów.

+0

Dzięki Martin! "bmk" oznacza zakładkę, o której powinienem pomyśleć. –

1

Bmkxxxx jest dodatkową kolumną, nie wymienioną w zapytaniu. Jest to kluczowa wartość z tablescan i będzie używana w późniejszych częściach wykonywania zapytania. Sprawdź ten doskonały ebook od Red-gate, aby dowiedzieć się więcej o planach wykonania. http://download.red-gate.com/ebooks/SQL/eBOOK_SQLServerExecutionPlans_2Ed_G_Fritchey.pdf

I pobierz to narzędzie z SQL Sentry, aby ułatwić nawigację planów wykonania. http://www.sqlsentry.com/products/plan-explorer/sql-server-query-view

Ten kurs w Pluralsight jest doskonały. https://www.pluralsight.com/courses/sqlserver-query-plan-analysis

Powiązane problemy