Maison > Article > base de données > Améliorations de SQL Server 2008 apportées à la gestion des conversions de types de données implicites dans les plans d'exécution
Vérifié par le test suivant, créez d'abord une table de test avec une répartition inégale des données.
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'
Utilisez ensuite les valeurs varhcar et nvarchar pour tester le nombre estimé de lignes du plan d'exécution qui remplissent respectivement 1 condition et 8900 conditions.
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
Le nombre estimé de lignes dans le plan de requête obtenu est indiqué dans la figure ci-dessous
À partir du nombre estimé de lignes de données Comme le montre la figure, vous pouvez voir que pour les valeurs varchar (aucune conversion de type de données cachée n'est requise), les résultats estimés sont précis. Mais pour la valeur nvarchar, que la valeur spécifiée ne contienne qu'une seule donnée ou 8 900 données correspondantes, le résultat estimé est 99,0099, ce qui montre que l'estimation ne prend pas en compte la valeur que nous avons spécifiée.
Test supplémentaire avec des variables
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
Les résultats sont les suivants :
Qu'il s'agisse d'une variable varchar ou nvarchar, la ligne estimée Les nombres sont tous 99,0099. Cette valeur est la même que le résultat de l'utilisation de la valeur constante nvarchar. Il semble que l'optimiseur de requêtes SQL Server devrait effectivement traiter le résultat de GetRangeThroughConvert comme une variable. , la spécification est fixe Lorsque la valeur est une valeur constante, le résultat de GetRangeThroughConvert doit également être une certaine valeur.
Cet article explique le contenu pertinent de SQL Server Pour plus de contenu connexe, veuillez faire attention au site Web php chinois.
Recommandations associées :
SQL Server FileStream avec progression Comment accéder
Que faire si vous oubliez votre mot de passe administrateur SQL Server
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!