Question

Je vais avoir du mal phrasé cette question de telle manière qui ne se présente pas des résultats pour persisté, indexé des colonnes calculées.

Ma question est, si j'ai une table telle que:

CREATE TABLE Customers (
    ID int,
    Name nvarchar(50),
    Balance money,
    HasBalance AS CONVERT(bit, CASE WHEN Balance > 0 THEN 1 ELSE 0 END)
)

En supposant qu'il y ait un indice sur l'équilibre, serait le processeur de requêtes SQL traiter efficacement une requête telle que:

SELECT ID, Name, Balance
FROM Customers
WHERE HasBalance = 1

Sera-ce essentiellement « en ligne », l'expression de colonne calculée comme si je l'avais indiqué le cas directement dans la requête?

Qu'en est-il si l'expression de colonne calculée étaient dans une fonction définie par l'utilisateur non-schemabound?

EDIT

Mon exemple était pas génial car, comme il est indiqué, la colonne HasBalance ne serait pas une très bonne distribution des données. Mais en ignorant un instant l'efficacité de l'indice lui-même, sera le processeur de requête traiter essentiellement la requête ci-dessus comme indiqué ci-dessous lors de la sélection d'un index et le choix d'un plan d'exécution?

SELECT ID, Name, Balance
FROM Customers
WHERE Balance > 0
Était-ce utile?

La solution

Cela dépend de la répartition des données, ont en ce moment vous que 2 valeurs possibles 1 et 0 .... donc à moins que vous avez 99% des données étant une valeur de votre sélectivité sera très pauvre, il doit analyser tout l'index pour trouver toutes les valeurs positives ou négatives

Modifier ..... Voici ce qui se passe, vous obtenez une table de balayage

CREATE TABLE Customers (
    ID int,
    Name nvarchar(50),
    Balance money,
    HasBalance AS CONVERT(bit, CASE WHEN Balance > 0 THEN 1 ELSE 0 END)
)


insert Customers values(1,'d',100)
insert Customers values(2,'d',-2)
insert Customers values(3,'d',-4)
insert Customers values(4,'d',3)
insert Customers values(5,'d',5)

create index ix_test on Customers(Balance)


SELECT ID, Name, Balance
FROM Customers
WHERE HasBalance = 0

set showplan_text on

| --Table scan (OBJET:.. ([Clients] [maître] [dbo]),   OÙ:... (CONVERT (bit, CASE QUAND [maître] [dbo] [Clients] [Balance]> (0,0000 $)   ALORS (1) AUTRE (0) END, 0) = [@ 1]))

jeter un oeil à cette

SELECT Balance
FROM Customers
WHERE HasBalance = 0

- Index scan (OBJET:... ([Maître] [dbo] [Clients] [ix_test]), où: (CONVERT (bit, CAS QUAND [maître]. [Dbo]. [Les clients]. [Balance]> (0,0000 $) ALORS (1) AUTRE (0) FIN, 0) = [@ 1]))

SELECT Balance
FROM Customers
WHERE Balance > 0
.....

| - Index Seek (OBJET: ([maître] [dbo] [Les clients] [ix_test]), DEMANDER: ([maître] [dbo] [Les clients] . [balance]> CONVERT_IMPLICIT (argent, [@ 1], 0)) AVANT ORDONNÉES)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top