2016-03-25 19 views
7

Ho un semplice script.Cos'è questa colonna [Bmk1002] nell'operatore di scansione tabella del mio piano di esecuzione?

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; 

Il piano di esecuzione dell'istruzione MERGE si presenta così.

enter image description here

È possibile scaricare il piano di esecuzione qui a https://drive.google.com/file/d/0B4xMAUd6DN6XdkZyTmJkdF9TY3c/view?

La mia domanda è, che cosa è esattamente questo [Bmk1002]? Spero che qualcuno possa aiutare a spiegarlo.

+0

[Bmk1002] può essere: 1) Anelli nidificati (join, riferimenti esterni); 2) Ricerca per indice; Un esempio è qui: http://sqlbitdatatype.blogspot.kr/2012/03/bookmark-explain-plan-understanding_22.html – Khazratbek

risposta

4

È il "segnalibro" (indicato anche nella frase "ricerca dei segnalibri").

Questa è la posizione fisica della riga (file: pagina: slot).

Clienti, è un mucchio

SELECT %%lockres%% 
FROM Customers 

vi mostrerà questi valori (se avesse un indice cluster è possibile utilizzare %%physloc%% posto ma l'uscita prima da questo non è così amichevole).

È necessario in questo piano di esecuzione poiché la specifica di unione richiede che venga generato un errore se si tenta di aggiornare o eliminare la stessa riga più di una volta.

Poiché non esiste un'altra chiave univoca disponibile, SQL Server utilizza questo segnalibro come un valore garantito per poter identificare in modo univoco una riga.

Il piano calcola ROW_NUMBER() OVER (PARTITION BY Bmk1002 ORDER BY Bmk1002)* e l'operatore asserzione genera un errore se questo è mai >1 (che accadrebbe se ci fossero più righe nella dbo.CustomersStage che aderiscono al stesso in dbo.Customers).


* In realtà il piano prevede conditional_row_number piuttosto che row_number. Questa è una funzione interna non documentata. Immagino che usi la versione condizionale piuttosto che direttamente row_number in quanto ha bisogno di ignorare le righe con un'azione di "inserimento" nell'assegno per i duplicati.

+0

Grazie Martin! "bmk" sta per segnalibro che avrei dovuto pensare. –

1

Il Bmkxxxx è una colonna aggiuntiva, non referenziata nella query. È il valore chiave delle tabellecan e verrà utilizzato nelle parti successive dell'esecuzione della query. Dai un'occhiata a questo eccellente ebook di Red-gate per saperne di più sui piani di esecuzione. http://download.red-gate.com/ebooks/SQL/eBOOK_SQLServerExecutionPlans_2Ed_G_Fritchey.pdf

E scaricare questo strumento da SQL Sentry per facilitare la navigazione nei piani di esecuzione. http://www.sqlsentry.com/products/plan-explorer/sql-server-query-view

E questo corso a Pluralsight è eccellente. https://www.pluralsight.com/courses/sqlserver-query-plan-analysis

Problemi correlati