Heim  >  Artikel  >  Datenbank  >  SQL Server 2008-Verbesserungen bei der Handhabung impliziter Datentypkonvertierungen in Ausführungsplänen

SQL Server 2008-Verbesserungen bei der Handhabung impliziter Datentypkonvertierungen in Ausführungsplänen

jacklove
jackloveOriginal
2018-06-15 09:29:191785Durchsuche

Durch den folgenden Test bestätigt, erstellen Sie zunächst eine Testtabelle mit ungleichmäßiger Datenverteilung.

USE tempdb
GOCREATE TABLE _t(
    c varchar(50)
);CREATE INDEX IX_c ON _t( c );GO-- 加入 10000 条数据INSERT _tSELECT (9999 + id) FROM(    SELECT TOP 10000 id = ROW_NUMBER() OVER( ORDER BY GETDATE() )    FROM sys.all_columns a, sys.all_columns
)ID
-- 将 100 - 10000 的数据变成相同值UPDATE _t SET c = '' WHERE c >= '10100'

Verwenden Sie dann die Werte varhcar und nvarchar, um die geschätzte Anzahl der Ausführungsplanzeilen zu testen, die 1 Bedingung bzw. 8900 Bedingungen erfüllen.

ALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGOSELECT * FROM _t WHERE c = '10005';     -- 实际1条GOSET SHOWPLAN_ALL OFF;GOALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGOSELECT * FROM _t WHERE c = N'10005';     -- 实际1条GOSET SHOWPLAN_ALL OFF;GOALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGOSELECT * FROM _t WHERE c = '';          -- 实际9900条GOSET SHOWPLAN_ALL OFF;GOALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGOSELECT * FROM _t WHERE c = N'';         -- 实际9900条GOSET SHOWPLAN_ALL OFF;GO

Die geschätzte Anzahl der Zeilen im erhaltenen Abfrageplan ist in der folgenden Abbildung dargestellt

SQL Server 2008-Verbesserungen bei der Handhabung impliziter Datentypkonvertierungen in Ausführungsplänen

Sie können die geschätzte Anzahl der Daten erkennen In den in der Abbildung gezeigten Zeilen sind die geschätzten Ergebnisse für Varchar-Werte (keine Konvertierung versteckter Datentypen erforderlich) genau. Für den Nvarchar-Wert beträgt das geschätzte Ergebnis jedoch 99,0099, unabhängig davon, ob der angegebene Wert nur ein Datenelement oder 8900 Datenübereinstimmungen aufweist. Dies zeigt, dass die Schätzung den von uns angegebenen Wert nicht berücksichtigt.
Weiterer Test mit Variablen

ALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGODECLARE @v varchar;SELECT * FROM _t WHERE c = @v; -- varcharGOSET SHOWPLAN_ALL OFF;GOALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGODECLARE @nv nvarchar;SELECT * FROM _t WHERE c = @nv; -- nvarcharGOSET SHOWPLAN_ALL OFF;GO

Die Ergebnisse sind wie folgt:
SQL Server 2008-Verbesserungen bei der Handhabung impliziter Datentypkonvertierungen in Ausführungsplänen

Ob es sich um eine Varchar- oder Nvarchar-Variable handelt, die geschätzte Anzahl von Zeilen Dieser Wert ist derselbe wie das Ergebnis der Verwendung des nvarchar-Konstantenwerts. Es scheint, dass der SQL Server-Abfrageoptimierer das Ergebnis als Variable betrachten sollte. Wenn ein fester konstanter Wert angegeben wird, sollte das Ergebnis von GetRangeThroughConvert ebenfalls ein bestimmter Wert sein.

In diesem Artikel werden die relevanten Inhalte von SQL Server erläutert. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

So implementieren Sie eine Eltern-Kind-Beziehungsabfrage auf unendlicher Ebene in einem einzigen Satz in MySQL

SQL Server FileStream mit Fortschritt So greifen Sie zu

Was tun, wenn Sie Ihr SQL Server-Administratorkennwort vergessen


Das obige ist der detaillierte Inhalt vonSQL Server 2008-Verbesserungen bei der Handhabung impliziter Datentypkonvertierungen in Ausführungsplänen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn