2016-03-25 16 views
7

Ich habe ein einfaches Skript. Was ist diese Spalte [Bmk1002] im Tabellenscanoperator meines Ausführungsplans?

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; 

Der Ausführungsplan der MERGE Anweisung sieht wie folgt aus.

enter image description here

Sie können den Ausführungsplan hier herunterladen bei https://drive.google.com/file/d/0B4xMAUd6DN6XdkZyTmJkdF9TY3c/view?

Meine Frage ist, was genau das ist [Bmk1002]? Hoffe jemand kann helfen, es zu erklären.

+0

[Bmk1002] kann sein: 1) Verschachtelte Schleifen (Joins, äußere Referenzen); 2) Indexsuche; Ein Beispiel ist hier: http://sqlbitdatatype.blogspot.kr/2012/03/bookmark-explain-plan-understanding_22.html – Khazratbek

Antwort

4

Es ist das "Lesezeichen" (auch in der Phrase "Lesezeichen suchen").

Dies ist der physische Speicherort der Zeile (File: Page: Slot).

Kunden, ist ein Haufen

SELECT %%lockres%% 
FROM Customers 

Sie diese Werte zeigen (wenn es ein Clustered-Index hatte man %%physloc%% stattdessen verwenden könnte, aber die rohe Ausgabe von das ist nicht so freundlich).

Es wird in diesem Ausführungsplan benötigt, da die Spezifikation der Zusammenführung es erfordert, einen Fehler zu verursachen, wenn versucht wird, die gleiche Zeile mehr als einmal zu aktualisieren oder zu löschen.

Da kein anderer eindeutiger Schlüssel verfügbar ist, verwendet SQL Server dieses Lesezeichen stattdessen als Wert, der garantiert eine Zeile eindeutig identifizieren kann.

Der Plan berechnet ROW_NUMBER() OVER (PARTITION BY Bmk1002 ORDER BY Bmk1002)* und die Assertion Betreiber wirft einen Fehler, wenn dies jemals >1 ist (was mehrere Zeilen in dbo.CustomersStage waren, wenn es passieren würde, die in dbo.Customers auf den gleiche beitreten).


* Eigentlich nennt der Plan conditional_row_number statt row_number. Dies ist eine interne undokumentierte Funktion. Ich stelle mir vor, dass es die bedingte Version anstatt gerade row_number verwendet, da es Zeilen mit einer Aktion "Einfügen" in der Überprüfung auf Duplikate ignorieren muss.

+0

Danke Martin! "bmk" steht für Bookmark, an das ich hätte denken sollen. –

1

Das Bmkxxxx ist eine zusätzliche Spalte, auf die in der Abfrage nicht verwiesen wird. Dies ist der Schlüsselwert aus dem Tabellenscan und wird in den späteren Teilen der Abfrageausführung verwendet. Schauen Sie sich dieses hervorragende eBook von Red-Gate an, um mehr über Ausführungspläne zu erfahren. http://download.red-gate.com/ebooks/SQL/eBOOK_SQLServerExecutionPlans_2Ed_G_Fritchey.pdf

Und laden Sie dieses Tool von SQL Sentry, um Ihnen bei der Ausführung von Ausführungsplänen zu helfen. http://www.sqlsentry.com/products/plan-explorer/sql-server-query-view

Und dieser Kurs bei Pluralsight ist ausgezeichnet. https://www.pluralsight.com/courses/sqlserver-query-plan-analysis