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
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:
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:
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!