Freigeben über


Leistungsproblem beim Abfragen von Ansichten auf verknüpften Servern

Gilt für: SQL Server

Problembeschreibung

Das Ausführen einer Abfrage für Ansichten auf einem verknüpften Server benötigt mehr Zeit als das direkte Ausführen derselben Abfrage für eine Basistabelle auf dem verknüpften Server.

Ursache

Das Ausführen einer Abfrage für eine Ansicht und eine Basistabelle führt zu einem anderen Verhalten aufgrund der Datenkardinalitätsschätzung, die zum Berechnen der erwarteten Anzahl zurückgegebener Zeilen verwendet wird. Die Anzahl für abfragende Ansichten wird auf einen konstanten Wert von 10.000 festgelegt, während die Zahl für das Abfragen von Basistabellen aus statistischen Informationen abgeleitet wird.

Kardinalitätsschätzung auf einer Basistabelle, die von verknüpften Servern abgefragt wird

Der Microsoft OLE DB-Anbieter (SQLOLEDB) (nicht mehr verwaltet) oder Microsoft® OLE DB Driver 18 für SQL Server® (MSOLEDBSQL) unterstützen beide Verteilungsstatistiken in Basistabellen. SQL Server kann die Statistiken und histogramme auf verknüpfte Server auf die gleiche Weise wie jede normale Abfrage verwenden. Wenn Sie beispielsweise einen verknüpften Server namens LS1 erstellen, der die Datenbank mit der AdventureWorks2019 Sales.SalesOrderDetail Tabelle enthält, können die folgenden Abfragen das statistische Histogramm verwenden:

SELECT * FROM LS1.AdventureWorks2019.Sales.SalesOrderDetail;
SELECT * FROM LS1.AdventureWorks2019.Sales.SalesOrderDetail WHERE SalesOrderID=43659;

Die folgenden grafischen Abfragepläne zeigen die geschätzte Anzahl von Zeilen an, die für jede Remoteabfrage zurückgegeben werden.

Screenshot der Abfrage für die Tabelle auf dem verknüpften Server.

Kardinalitätsschätzung für ansichten, die von verknüpften Servern abgefragt werden

Verknüpfte Serverabfragen für Ansichten verwenden keine statistikbasierte Kardinalitätsschätzung. Die Kardinalitätsschätzung für eine Ansicht ist ein konstanter Wert von 10.000. Der folgende Test veranschaulicht folgendes:

  1. Erstellen Sie eine Ansicht mit dem Namen dbo.View1 , die auf die Sales.SalesOrderDetail Tabelle aus der AdventureWorks2019 Datenbank des verknüpften Servers LS1 verweist.

    USE AdventureWorks2019;
    GO
    CREATE VIEW [dbo].[view1]
    AS
    SELECT * FROM Sales.SalesOrderDetail;
    
  2. Abfragen der Ansicht remote.

    SELECT * FROM LS1.AdventureWorks2019.dbo.view1;
    
  3. Die Kardinalitätsschätzung der Abfrage zeigt genau 10.000 Zeilen an.

    Screenshot der Abfrage für die Ansicht auf dem verknüpften Server.

Kardinalitätsschätzung für eine ansicht, die von verknüpften Servern mit WHERE-Klausel abgefragt wird

Wenn Sie eine Abfrage mit der WHERE Klausel für Ansichten auf einem verknüpften Server ausführen, ist die Kardinalitätsschätzung für Ansichten auch ein konstanter Wert. Der Wert variiert jedoch je nach Kompatibilitätsebene der Datenbank.

Notiz

Der Wert der Kardinalitätsschätzung wird nicht von der Kompatibilitätsebene der Datenbank beeinflusst, auf der die Ansicht definiert ist.

  • Für eine Datenbankkompatibilitätsebene von 120 oder höher (neue Version der Kardinalitätsschätzung) beträgt die Kardinalitätsschätzung 100.
  • Bei einer Datenbankkompatibilitätsstufe von 110 oder niedriger (Legacy-Kardinalitätsschätzung) beträgt die Kardinalitätsschätzung 1.000.

Ein Beispiel finden Sie in den folgenden Abfragen:

SELECT * FROM LS1.AdventureWorks2019.dbo.view1
WHERE SalesOrderID=43659 
    OPTION (USE HINT ('FORCE_DEFAULT_CARDINALITY_ESTIMATION'));
GO
SELECT * FROM LS1.AdventureWorks2019.dbo.view1 
WHERE SalesOrderID=43659
OPTION (USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION'));

Ein Beispiel finden Sie in der folgenden Kardinalitätsschätzung der Abfragen.

Screenshot der Abfrage für die Ansicht CE auf dem verknüpften Server.

Lösung

In den meisten Fällen ist keine Aktion erforderlich, da die meisten Anwendungsworkloads nicht von der Kardinalitätsschätzung auf Ansichten betroffen sind, wenn sie von verknüpften Servern abgefragt werden. Wenn die Arbeitsauslastung beeinträchtigt ist, verwenden Sie eine der folgenden Methoden:

  • Aktualisieren und ändern Sie die Ansicht als indizierte Ansicht. Die indizierte Ansicht weist mindestens einen Index mit entsprechenden Statistiken auf. Sehen Sie sich die folgenden Abfragen an, um eine indizierte Ansicht zu erstellen und abzufragen.

    Notiz

    Diese Methode macht tatsächliche Statistiken verfügbar, die die zugrunde liegenden Daten darstellen.

    --Set the options to support indexed views.
    SET NUMERIC_ROUNDABORT OFF;
    SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
       QUOTED_IDENTIFIER, ANSI_NULLS ON;
    GO
    IF OBJECT_ID ('Sales.vOrderDetails1', 'view') IS NOT NULL
       DROP VIEW Sales.vOrderDetails1;
    GO
    --Create view with schemabinding
    CREATE VIEW Sales.vOrderDetails1
       WITH SCHEMABINDING
       AS  
          SELECT SalesOrderID, 
           SalesOrderDetailID, 
           CarrierTrackingNumber, 
           OrderQty, 
           ProductID,
           UnitPrice,
           UnitPriceDiscount,
           LineTotal,
           ModifiedDate
          FROM Sales.SalesOrderDetail
    GO
    --Create an index on the view
    CREATE UNIQUE CLUSTERED INDEX IDX_V1
       ON Sales.vOrderDetails1 (SalesOrderID, ProductID);
    --Select from the materialized view
    SELECT * FROM LS1.adventureworks2019.Sales.vOrderDetails1;
    

    Ein Beispiel finden Sie in der folgenden Kardinalitätsschätzung der Abfrage.

    Screenshot der Abfrage für die indizierte Ansicht auf dem verknüpften Server.

  • Wenn Sie eine Abfrage mit der WHERE Klausel ausführen, können Sie die Kardinalitätsschätzung mithilfe der Query Hint OPTION (USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION')) erhöhen. Dieser Ansatz kann in einigen Fällen besonders bei der Verknüpfung mit großen Tabellen hilfreich sein.

    Notiz

    Diese Methode ist für Fälle geeignet, in denen die Ansicht viele Zeilen verfügbar macht.

  • Führen Sie die Abfrage bei Bedarf direkt für die Basistabellen anstelle von Ansichten auf dem verknüpften Server aus.

Siehe auch