2016-03-25 27 views
7

私は単純なスクリプトを持っています。私の実行計画のテーブルスキャンオペレータの[Bmk1002]とは何ですか?

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; 

MERGEステートメントの実行計画は、このようになります。

enter image description here

あなたは私の質問は、まさにこの[Bmk1002]あるもの、であるhttps://drive.google.com/file/d/0B4xMAUd6DN6XdkZyTmJkdF9TY3c/view?

でここに実行計画をダウンロードできますか?誰かがそれを説明するのを助けることを願っています。

+0

[Bmk1002]は、1)ネストされたループ(結合、外部参照)。 2)インデックスシーク。その一例がここにあります:http://sqlbitdatatype.blogspot.kr/2012/03/bookmark-explain-plan-understanding_22.html – Khazratbek

答えて

4

「ブックマーク」(「ブックマークの参照」とも呼ばれます)です。

これは、行の物理的な位置(ファイル:ページ:スロット)です。

お客様(それはあなたの代わりに%%physloc%%を使用することができますが、これからの生の出力は、フレンドリーではないクラスタ化インデックスを持っている場合)、ヒープ

SELECT %%lockres%% 
FROM Customers 

はあなたにこれらの値が表示されますされています。

この実行計画では、同じ行を複数回更新または削除しようとするとエラーが発生する必要があるため、この実行計画では必要です。

他の固有キーがないため、SQL Serverはこのブックマークを、行を一意に識別できる値として代わりに使用します。

計画はROW_NUMBER() OVER (PARTITION BY Bmk1002 ORDER BY Bmk1002)*を計算し、これが今まで>1ある場合にアサートオペレータは、(dbo.Customersで同じものに参加dbo.CustomersStageの複数の行があった場合にどう思われる)エラーが発生します。 *


実際の計画ではなくrow_numberよりconditional_row_numberを呼び出します。これは、文書化されていない関数です。私は、重複のチェックに "挿入"のアクションを持つ行を無視する必要があるので、それはストレートrow_numberではなく条件付きバージョンを使用すると想像します。

+0

ありがとうございました! "bmk"は私が考えていたはずのブックマークを表します。 –

1

Bmkxxxxは追加の列で、クエリでは参照されません。 これはtablescanのキー値であり、クエリ実行の後半部分で使用されます。実行計画の詳細については、Red-gateのこの優れた電子ブックをご覧ください。 http://download.red-gate.com/ebooks/SQL/eBOOK_SQLServerExecutionPlans_2Ed_G_Fritchey.pdf

このツールをSQL Sentryからダウンロードすると、実行計画をナビゲートするのに役立ちます。 http://www.sqlsentry.com/products/plan-explorer/sql-server-query-view

Pluralsightのこのコースは優れています。 https://www.pluralsight.com/courses/sqlserver-query-plan-analysis

関連する問題