Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
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:
Erstellen Sie eine Ansicht mit dem Namen
dbo.View1
, die auf dieSales.SalesOrderDetail
Tabelle aus derAdventureWorks2019
Datenbank des verknüpften Servers LS1 verweist.USE AdventureWorks2019; GO CREATE VIEW [dbo].[view1] AS SELECT * FROM Sales.SalesOrderDetail;
Abfragen der Ansicht remote.
SELECT * FROM LS1.AdventureWorks2019.dbo.view1;
Die Kardinalitätsschätzung der Abfrage zeigt genau 10.000 Zeilen an.
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.
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.
Wenn Sie eine Abfrage mit der
WHERE
Klausel ausführen, können Sie die Kardinalitätsschätzung mithilfe derQuery 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.