2008-11-19 9 views
0

Je souhaite indexer une colonne calculée dans ma table de base de données qui utilise un certain nombre de fonctions définies par l'utilisateur. Cependant, je viens d'apprendre que ma colonne est non-déterministe.Fonctions scalaires déterministes

Sans indexer cela va être lent à exécuter les requêtes dont j'ai besoin.

Quelle est la meilleure façon de suivre les fonctions définies par l'utilisateur pour déterminer si elles sont déterministes? Existe-t-il un quelconque type d'outil dans SQL Server Management Studio qui me dira si une fonction définie par l'utilisateur est déterministe ou dois-je simplement suivre toutes les fonctions définies par le système que j'utilise pour déterminer -deterministic et trouver d'autres façons d'écrire mon code sans eux?

Répondre

1

Puisque vous dites que vous utilisez un certain nombre de fonctions définies par l'utilisateur, avez-vous essayé de créer un index basé sur la fonction sur chacun d'eux séparément? Cela devrait au moins le réduire.

2

Essayez:

SELECT * 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE IS_DETERMINISTIC = 'NO' 
     AND ROUTINE_TYPE = 'FUNCTION' 

ou

SELECT OBJECTPROPERTY(OBJECT_ID('schemaname.functionname'), 'IsDeterministic') 

Désolé, IIRC, SQL Server 2000 ne permettait pas non déterministe des FDU.

Indexer une colonne non-déterministe est assez idiot - après tout, si sa valeur n'est pas strictement dépendante des paramètres, ça ne va pas être très utile si ça change sur vous-même, surtout si c'est utilisé dans un index pour trouver des choses!

+0

Votre première déclaration ne semble pas correcte selon ceux-ci: http://msdn.microsoft.com/en-us/library/ms187440.aspx, http://msdn.microsoft.com/en-us/library/ms178091.aspx. Par exemple, une fonction UDF qui appelle CURRENT_TIMESTAMP ne serait pas déterministe. –

+0

Vous avez raison - il doit s'agir de connaissances provenant de SQL Server 2000, qui n'autorisaient pas les fonctions non déterministes dans un fichier UDF. –

+0

Ma fonction doit être déterministe. C'est un calcul qui implique essentiellement une concaténation de chaînes, des dates et des instructions de cas –

0

J'ai compris pourquoi ma fonction est non-déterministe. Elle repose sur des déclarations Convertir des codes de style 1, 3, puis d'autres au-dessus de 100.

Selon msdn Convert est:

déterministes à moins que l'une de ces conditions existe:

type de source est sql_variant.

Le type de cible est sql_variant et son type de source est non déterministe.

La source ou le type de cible est datetime ou smalldatetime, l'autre source ou type de cible est une chaîne de caractères et un style non déterministe est spécifié. Pour être déterministe, le paramètre de style doit être une constante. De plus, les styles inférieurs ou égaux à 100 sont non déterministes, à l'exception des styles 20 et 21. Les styles supérieurs à 100 sont déterministes, à l'exception des styles 106, 107, 109 et 113.

Questions connexes