Aracılığıyla paylaş


BİRLEŞTİRME deyimini performansını en iyi duruma getirme

De SQL Server 2008, tek bir birden çok veri düzenleme dili (dml) işlemlerini gerçekleştirmek deyim birleştirme kullanarak deyim.Örneğin, ekleme, güncelleştirme ya da diğer tabloda bulunan farklılıklar temel alan bir tablodaki satırları silmek iki tablo eşitlemeniz gerekebilir.Genellikle, bu saklı yordam veya tek tek INSERT, update ve delete deyimleri içeren toplu iş yürütme tarafından yapılır. Ancak kaynak ve hedef tablolardaki verileri değerlendirilen ve birden çok kez işlenen gelir; en az bir kez her deyim için.

BİRLEŞTİRME deyimini kullanarak, tek bir deyim ile tek tek dml deyimlerini değiştirebilir.Kaynak ve hedef tablolardaki verileri işlenen sayısını en aza indirme tek bir deyim içinde bu nedenle, gerçekleştirilen işlemler bu sorgu performansını artırabilir.Ancak, performans artışı doğru dizin, birleşim ve diğer konuları yerinde değilse bağlıdır.Bu konuda kullanırken en iyi performansı elde etmek yardımcı olacak en iyi uygulama önerilerini sağlar birleştirme deyim.

Dizin için en iyi yöntemler

BİRLEŞTİRME performansını artırmak için deyim, aşağıdaki dizin yönergeleri öneririz:

  • Kaynak birleştirmek sütunları üzerinde bir dizin oluşturmak tablo benzersiz ve covering.

  • Benzersiz kümelenmiş dizin birleştirmek sütunları hedef oluşturmak tablo.

Bu dizinler benzersiz birleştirmek anahtarları ve tablolardaki verileri sıralanmış emin olun.Çünkü sorgu performansı geliştirilmiş sorgu iyileştiricisi bulun ve yinelenen satırları güncelleştirmek için işlem yapma ve ek ek doğrulama gerçekleştirmek gerekli değildir sıralama işlemi gerekli değildir.

Örneğin, aşağıdaki birleştirmede deyim kaynak tablo dbo.Purchasesve hedef tablo dbo.FactBuyingHabits, sütunları katılan ProductID ve CustomerID.Bu performansını artırmak için deyim, benzersiz veya birincil anahtar dizinini oluşturacak (kümelenmiş veya kümelenmemiş) üzerinde ProductID ve CustomerID sütunlar üzerinde dbo.Purchases Tablo ve kümelenmiş dizin üzerinde ProductID ve CustomerID sütunlar üzerinde dbo.FactBuyingHabits tablosu.Bu tablolar oluşturmak için kullanılan kodu görüntülemek için bkz: Ekleme, güncelleştirme ve mektup birleştirme kullanarak veri silme.

MERGE dbo.FactBuyingHabits AS Target
USING (SELECT CustomerID, ProductID, PurchaseDate FROM dbo.Purchases) AS Source
ON (Target.ProductID = Source.ProductID AND Target.CustomerID = Source.CustomerID)
WHEN MATCHED THEN
    UPDATE SET Target.LastPurchaseDate = Source.PurchaseDate
WHEN NOT MATCHED BY TARGET THEN
    INSERT (CustomerID, ProductID, LastPurchaseDate)
    VALUES (Source.CustomerID, Source.ProductID, Source.PurchaseDate)
OUTPUT $action, Inserted.*, Deleted.*; 

KATILMAK için en iyi yöntemler

BİRLEŞTİRME performansını artırmak için deyim emin olun ve aşağıdaki birleştirmek yönergeleri öneririz doğru sonuçlar elde:

  • Yalnızca arama koşullarına belirtmek ON <merge_search_condition> yan tümce tümce tümcesinin eşleşen veri kaynak ve hedef tabloları ölçütlerini belirlemekDiğer bir deyişle, yalnızca hedef sütunları belirtmek tablo için karşılık gelen sütunları kaynak karşılaştırıldığında tablo.Sabit gibi diğer değerlere karşılaştırmaları dahil.

Kaynak veya hedef tablo satırlarını filtre için aşağıdaki yöntemlerden birini kullanın.

  • Uygun OLDUĞUNDA yan tümce tümce tümcesindeki filtre satır için arama koşulu belirleyin.Örneğin, WHEN NOT MATCHED AND S.EmployeeName LIKE 'S%' THEN INSERT....

  • Kaynak veya hedef tablo görünüme başvuran ve kaynak veya hedef Süzülen satırları döndüren bir görünüm tanımlayın.Görünümün hedef tablo üzerinde tanımlı ise, herhangi bir eylem karşısında görünümlerini güncelleştirmek için koşullar uygun olmalıdır.Bir görünümünü kullanarak veri güncelleştirme hakkında daha fazla bilgi için bkz: Bir görünüm üzerinden veri değiştirme.

  • WITH kullanma <ortak tablo ifade> için kaynak veya hedef tablo. satır filtre yan tümce tümce tümceBu yöntem on yan tümce tümce tümcesinde ek arama ölçütleri belirtmek için benzer ve yanlış sonuçlar doğurabilir.Bu yöntem kullanmaktan kaçının veya uygulamadan önce sınamanız önerilir.

Daha fazla bilgi Bkz: Ekleme, güncelleştirme ve mektup birleştirme kullanarak veri silme.

Birleşimler sorgu en iyi duruma getirilmesi

birleştirmek işlemi birleştirmek deyimindeki deyim içinde bir birleştirmek aynı şekilde optimize edilmiştir.Diğer bir deyişle, ne zaman SQL Server katılma, işler sorgu iyileştiricisi işleme birleştirmek. (dışında birçok olasılık) en etkili yöntem seçerBirleşimler hakkında daha fazla bilgi için bkz: Fundamentals katılın ve Gelişmiş sorgu kavramları ayarlama. Kaynak ve hedef olduğunda benzer boyutta ve daha önce açıklanan 'dizini en iyi yöntemler içinde' dizin yönergeleri bölüm için kaynak ve hedef tabloları, uygulanan bir birleştirmek birleştirmek işleç olarak en verimli sorgu planı.Bunun nedeni, her iki tablodan bir kez taranır ve verileri sıralamak için gerek yoktur çünkü.Kaynak hedef tablo daha küçük olduğunda bir içiçe döngüleri işleç olarak tercih.

Belirterek belirli bir birleştirmek kullanımını zorla OPTION (<query_hint>) yan tümce tümce tümcesinde birleştirmek deyim.Bu birleştirmek türü dizinler kullanmaması nedeniyle, karma birleştirmek bir sorgu ipucu birleştirmek ifadeleri için kullanmamanızı öneririz.Sorgu ipuçları hakkında daha fazla bilgi için bkz: Sorgu ipuçları (Transact-sql).Aşağıdaki örnek, iç içe döngülü birleştirmek seçeneği yan tümce tümce tümcesinde belirtir.

USE AdventureWorks2008R2;
GO
BEGIN TRAN;
MERGE Production.ProductInventory AS pi
USING (SELECT ProductID, SUM(OrderQty) 
       FROM Sales.SalesOrderDetail AS sod
       JOIN Sales.SalesOrderHeader AS soh
         ON sod.SalesOrderID = soh.SalesOrderID
         AND soh.OrderDate BETWEEN '20030701' AND '20030731'
       GROUP BY ProductID) AS src(ProductID, OrderQty)
ON (pi.ProductID = src.ProductID)
WHEN MATCHED AND pi.Quantity - src.OrderQty >= 0 
    THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty
WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0 
    THEN DELETE
OUTPUT $action, Inserted.*, Deleted.*
OPTION (LOOP JOIN);
GO
ROLLBACK TRAN;

Parameterizasyonunu en iyi yöntemler

Parametreler olmadan, bir select, INSERT, update veya delete deyim yürütülmeden, SQL Server sorgu iyileştiricisi deyim dahili stratejisinin seçebilirsiniz.Bu sorgunun içerdiği herhangi bir hazır bilgi değerleri parametrelerle değiştirilir olduğunu anlamına gelir. Örneğin, deyim INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10), uygulanan dahili olarak INSERT dbo.MyTable (Col1, Col2) VALUES (@p1, @p2).Adı verilen bu işlem, Basit parameterizasyonunu, yeteneğini artırır ilişkisel altyapı var, daha önceden derlenmiş yürütme planları ile yeni sql deyimlerinin eşleştirmek için.Sorgu derlemesini ve yeniden derlemelerinde sıklığı sınırlı olduğundan sorgu performansı iyileştirilebilir.sorgu iyileştiricisi Basit parameterizasyonunu işlemi için birleştirme ifadeleri geçerli değildir.Bu nedenle, birleştirme deyimhazır bilgi değerleri içeren s değil tek tek INSERT yanı sıra, update gerçekleştirmek veya silme deyims yeni bir plan olarak derlendiğinden her saat birleştirme deyim yürütülür.

Sorgu performansını artırmak için parameterizasyonunu aşağıdaki yönergeleri öneririz:

  • Tüm hazır bilgi değerleri stratejisinin ON <merge_search_condition> yan tümce tümce tümce ve OLDUĞUNDA yan tümce tümce tümceleri birleştirme deyim.Örneğin, birleştirme katabilirler deyim içine uygun giriş parametreleriyle hazır bilgi değerleri değiştirerek bir saklı yordam.

  • deyim stratejisinin olamaz, şablon türü bir plan Kılavuzu oluşturun ve plan Kılavuzu'nda PARAMETERİZASYONUNU ZORLANMIŞ sorgu ipucu belirtme.Daha fazla bilgi için bkz: Plan kılavuzları kullanarak sorgu parameterizasyonunu davranışı belirtme.

  • BİRLEŞTİRME ifadeleri veritabanı üzerinde sık sık yürütülen, ZORLANAN için PARAMETERİZASYONUNU seçeneği veritabanı ayarlama düşünün.Bu seçenek ayarlarken dikkatli olun.PARAMETERİZASYONUNU bir veritabanı düzey ayarı seçenektir ve nasıl tüm sorgular Veritabanı karşı etkileri işlenir.Daha fazla bilgi için bkz: Zorunlu parameterizasyonunu.

ÜST yan tümcesi en iyi yöntemler

Mektup birleştirme işleminde deyim, top yan tümce tümce tümce numarasını belirtir veya Kaynak tablo ile hedef tablosu katıldı sonra etkilenen satırların sonra bir ekleme, ilgili olmayan tümce tümce satırları yüzdesini güncelleştirmek veya eylem silmek kaldırılır.top yan tümce tümce tümce daha belirtilen değere birleştirilen satır sayısını azaltır ve INSERT, update veya delete eylemleri sýralanmamýþ bir biçimde birleştirilen kalan satırlara uygulanır.Diğer bir deyişle, hiç sipariş satırları içinde OLDUĞUNDA yan tümceleri içinde tanımlanan eylemler arasında dağıtılır vardır.Örneğin, üst (10) belirterek, 10 satır etkiler; Bu satır 7 güncelleştirilebilir ve eklenen veya 1 3 silinebilir, güncelleştirilmiş ve 4 5 vb. eklenmiş.

Veri düzenleme dili (dml) işlemleri büyük bir top yan tümce tümce tümce kullanan genel olarak tablo toplu.top yan tümce tümce tümce içinde birleştirme kullanırken deyim bu amaçla aşağıdaki etkileri anlamanız önemlidir.

  • G/Ç performansı etkilenebilir.

    BİRLEŞTİRME deyim kaynak ve hedef tabloları tam Tablo tarama gerçekleştirir.toplu iş iş işlemin bölme toplu iş iş gerçekleştirilen yazma işlemlerinin sayısını azaltır; Ancak, her toplu iş iş bir kaynak ve hedef tabloları tam Tablo tarama gerçekleştirir.Ortaya çıkan okuma etkinliği, sorgu performansını etkileyebilir.

  • Yanlış sonuçlar ortaya çıkabilir.

    Art arda gelen tüm toplu işleri yeni satır veya yanlış tartget yinelenen satırları ekleme gibi istenmeyen davranışlara hedef açısından önemlidir tablo ortaya çıkabilir.Kaynak tablo hedef toplu iş iş işlemde değildi, ancak genel hedef tabloda olan bir satır bulunduğunda ortaya çıkar.

    Doğru sonuçlar sağlamak için:

    • Varolan hedef satır kaynak satırları etkiler ve genuinely yeni hangilerinin belirlemek için on yan tümce tümce tümcesini kullanın.

    • ZAMAN içinde ek koşul kullanın hedef satır zaten önceki bir toplu iş tarafından güncelleştirilip güncelleştirilmediğini belirlemek için matched yan tümce tümce tümce.

    top yan tümce tümce tümce yalnızca bu yan tümce tümce tümceleri uygulandıktan sonra uygulandıı için her yürütme genuinely eşleşmeyen bir satır ekler veya varolan bir satırı güncelleştirir.Aşağıdaki örnek, kaynak ve hedef tablo oluşturur ve sonra toplu iş iş işlemlerinde hedef değiştirmek için top yan tümce tümce tümce kullanarak en doğru yöntem sunar.

    CREATE TABLE dbo.inventory(item_key int NOT NULL PRIMARY KEY, amount int, is_current bit);
    GO
    CREATE TABLE dbo.net_changes(item_key int NOT NULL PRIMARY KEY, amount int);
    GO
    
    MERGE TOP(1) dbo.inventory
    USING dbo.net_changes
    ON inventory.item_key = net_changes.item_key
    WHEN MATCHED AND inventory.is_current = 0
      THEN UPDATE SET amount += net_changes.amount, is_current = 1
    WHEN NOT MATCHED BY TARGET
      THEN INSERT (item_key, amount, is_current) VALUES(item_key, amount, 1)
    OUTPUT deleted.*, $action, inserted.*;
    GO
    

    top yan tümce tümce tümce kullanmanın yanlış bir yöntem aşağıdaki örnekte gösterilmiştir.Denetimi is_current sütun kaynağı ile birleştirmek koşulu belirtildiğinde tablo.Tek bir toplu iş iş kullanılan bir kaynak satırı kabul edilir olarak bunun anlamı "eşleşen değil" kaynaklanan istenmeyen INSERT operasyonu sonraki toplu iş iş işlemde.

    MERGE TOP(1) dbo.inventory
    USING dbo.net_changes
    ON inventory.item_key = net_changes.item_key AND inventory.is_current = 0
    WHEN MATCHED
      THEN UPDATE SET amount += net_changes.amount, is_current = 1
    WHEN NOT MATCHED BY TARGET
      THEN INSERT (item_key, amount, is_current) values(item_key, amount, 1)
    OUTPUT deleted.*, $action, inserted.*;
    GO
    

    Aşağıdaki örnek, aynı zamanda yanlış bir yöntem gösterilmektedir.top(1) tarafından seçilen biridir dışında hangi hedef satırdaki eşleşmesi kaynak satır "eşlenemiyor" kabul için toplu iş iş okuma satır sayısını sınırlamak için ortak bir tablo ifade (cte) kullanarak,, kaynaklanan istenmeyen bir ekleme işlemi.Buna ek olarak, bu yöntem yalnızca güncelleştirilen satır sayısını sınırlar; Her toplu iş iş Tümünü Ekle çalışın "eşsiz" kaynak satırları.

    WITH target_batch AS (
      SELECT TOP(1) *
      FROM dbo.inventory
      WHERE is_current = 0
      )
    MERGE target_batch
    USING dbo.net_changes
    ON target_batch.item_key = net_changes.item_key
    WHEN MATCHED
      THEN UPDATE SET amount += net_changes.amount, is_current = 1
    WHEN NOT MATCHED BY TARGET
      THEN INSERT (item_key, amount, is_current) values(item_key, amount, 1)
    OUTPUT deleted.*, $action, inserted.*;
    GO
    

BULK Load en iyi yöntemler

BİRLEŞTİRME deyim verimli bir kaynak veri dosyasından veri yükü hedef tabloya openrowset(bulk…) yan tümce tümce tümce tablo kaynağı olarak belirterek toplu olarak kullanılabilir.Bunu yaptığınızda, dosyanın tamamını tek bir toplu iş iş işlemde işlenir.

Toplu birleştirme işleminin performansını artırmak için aşağıdaki yönergeleri öneririz:

  • Hedef birleştirmek sütunları kümelenmiş dizin oluşturmak tablo.

  • Sipariş ve UNIQUE ipuçları openrowset(bulk…) yan tümce tümce tümcesinde kaynak veri dosyasının nasıl sıralanmış belirtmek için kullanın.

    Varsayılan olarak, veri dosyası sırasız toplu işlemini varsayar.Bu nedenle, kaynak veriler hedef kümelenmiş dizin için göre sıralanır önemlidir tablo ve sipariş ipucu sorgu en iyi duruma getiricisi daha verimli bir sorgu planı oluşturabilir, siparişi belirtmek için kullanılır.İpucu çalışma zamanında doğrulanır; veri akışı için belirtilen ipuçları uymuyorsa, bir hata ortaya çıkar.

Bu yönergeleri birleştirmek anahtarlar benzersiz kaynak dosyadaki verileri sıralama düzeni düzenini hedef ile eşleşen emin olun ve tablo.Ek sıralama işlemi gerekli değildir ve gereksiz veri kopyaları gereklidir çünkü sorgu performansı artırıldı.Aşağıdaki örnek, toplu yükleme verileri için birleştirme deyimini kullanır StockData.txt, düz dosyaya, hedef tablo dbo.Stock.Birincil anahtar kısıtlaması üzerinde tanımlayarak StockName hedef tablo, kaynak verilerin. ile birleştirmek için kullanılan sütun kümelenmiş dizin oluşturulurSipariş ve UNIQUE ipuçları uygulanan Stock Veri sütununda kaynak, hangi eşler kümelenmiş dizin anahtar sütunu hedef tablo.

Bu örneği çalıştırmadan önce 'StockData.txt' adlı bir metin dosyası oluşturma klasör C:\SQLFiles\.Dosyayı iki sütun veri virgülle ayrılmış olması gerekir.Örneğin, aşağıdaki verileri kullanın.

Alpine mountain bike,100

Brake set,22

Cushion,5

Daha sonra bir xml dosyası oluşturmak biçim dosyası 'BulkloadFormatFile.xml' adlı klasör C:\SQLFiles\.Aşağıdaki bilgileri kullanın.

<?xml version="1.0"?>

<BCPFORMAT xmlns="https://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<RECORD>

<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="25"/>

<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="5"/>

</RECORD>

<ROW>

<COLUMN SOURCE="1" NAME="Stock" xsi:type="SQLNVARCHAR"/>

<COLUMN SOURCE="2" NAME="Delta" xsi:type="SQLSMALLINT"/>

</ROW>

</BCPFORMAT>

USE AdventureWorks2008R2;
GO
CREATE TABLE dbo.Stock (StockName nvarchar(50) PRIMARY KEY, Qty int CHECK (Qty > 0));
GO
MERGE dbo.Stock AS s
USING OPENROWSET (
    BULK 'C:\SQLFiles\StockData.txt',
    FORMATFILE = 'C:\SQLFiles\BulkloadFormatFile.xml',
    ROWS_PER_BATCH = 15000,
    ORDER (Stock) UNIQUE) AS b
ON s.StockName = b.Stock
WHEN MATCHED AND (Qty + Delta = 0) THEN DELETE
WHEN MATCHED THEN UPDATE SET Qty += Delta
WHEN NOT MATCHED THEN INSERT VALUES (Stock, Delta);
GO

Performans ölçme ve tanılama birleştirme

Ölçme ve birleştirme deyimleri performans tanılama yardımcı olacak aşağıdaki özellikler kullanılabilir.

  • Use birleştirme stmt , sayaç sys.dm_exec_query_optimizer_info birleştirme deyimleridir sorgu iyileştirme sayısı dönmek için dinamik yönetimi.

  • Use merge_action_type , öznitelik sys.dm_exec_plan_attributes tetiğin yürütme planı birleştirme sonucunda kullanılan türü dönmek için dinamik yönetimi işlev deyim.

  • Bir diğeri için yaptığınız şekilde birleştirme deyimini sorun giderme verileri toplamak için sql izleme kullanma veri işleme dili (dml) deyim.Daha fazla bilgi için bkz: SQL izleme giriş.