web-dev-qa-db-fra.com

Fonction table (TVF) vs vue

Quelle est la différence entre les fonctions table et les vues? Y a-t-il quelque chose que vous pouvez faire avec 1 qui soit difficile ou impossible à faire avec l'autre? Ou la différence réside-t-elle dans l'efficacité?

71
Haoest

Un TVF en ligne sans paramètre et une vue non matérialisée sont très similaires. Voici quelques différences fonctionnelles qui vous viennent à l'esprit.

Vues

Accepts Parameters               - No
Expanded out by Optimiser        - Yes
Can be Materialized in advance   - Yes (through indexed views)
Is Updatable                     - Yes 
Can contain Multiple Statements  - No
Can have triggers                - Yes
Can use side-effecting operator  - Yes  

TVF en ligne

Accepts Parameters               - Yes
Expanded out by Optimiser        - Yes
Can be Materialized in advance   - No
Is Updatable                     - Yes
Can contain Multiple Statements  - No
Can have triggers                - No
Can use side-effecting operator  - No    

TVF multi-états

Accepts Parameters               - Yes
Expanded out by Optimiser        - No
Can be Materialized in advance   - No
Is Updatable                     - No
Can contain Multiple Statements  - Yes
Can have triggers                - No
Can use side-effecting operator  - No    

Lors de l'exécution, les vues et les TVF en ligne sont à la fois en ligne et traités de la même manière que les tables dérivées ou les CTE. Ils peuvent très bien ne pas être évalués dans leur intégralité (ou même pas du tout dans certains cas) ou peuvent être évalués plusieurs fois dans d'autres . Les TVF multi-états seront toujours évalués et stockés dans le type de table de retour (essentiellement une variable de table)

Parfois, la possibilité de paramétrer directement des TVF en ligne peut conduire à un meilleur plan d'exécution que la requête paramétrée équivalente sur une vue.

117
Martin Smith

J'ai trouvé que les jointures avec des TVF MultiStatement fonctionnent beaucoup mieux que Views lorsqu'un PK est spécifié sur la table de retour de la fonction.

CREATE FUNCTION [FORMREQS].[fnGetFormsStatus] ()
RETURNS

/* Create a PK using two of the columns */
@Indexed TABLE (
    [OrgID] [char](8) NOT NULL,
    [PkgID] [int] NOT NULL,
    [FormID] varchar(5) NOT NULL,
    PRIMARY KEY CLUSTERED(OrgID, PkgID) 
)
AS
BEGIN
INSERT @Indexed SELECT OrgID, PkgID, FormID FROM FormsTable

RETURN

END
0
Douglas