Maison >base de données >tutoriel mysql >Améliorations de SQL Server 2008 apportées à la gestion des conversions de types de données implicites dans les plans d'exécution

Améliorations de SQL Server 2008 apportées à la gestion des conversions de types de données implicites dans les plans d'exécution

jacklove
jackloveoriginal
2018-06-15 09:29:191827parcourir

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

Améliorations de SQL Server 2008 apportées à la gestion des conversions de types de données implicites dans les plans dexécution

À 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 :
Améliorations de SQL Server 2008 apportées à la gestion des conversions de types de données implicites dans les plans dexécution

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 :

Comment implémenter une requête de relation parent-enfant de niveau infini dans une seule phrase dans MySQL

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn