>Comunque sia, se riesci a trovare un altro criterio di ordinamento,
>magari basato solo su un campo della tabella, e magari opportunamente
>indicizzato, non perdi prestazioni così come effettuare ordinamenti
>o raggruppamenti su funzioni sui campi..
Esatto. SQL Server 2005 ci permette di rendere persistenti le colonne calcolate e quindi è ora possibile indicizzarle.
In questo esempio definirò una colonna calcolata persistente a livello di tabella, definirò un indice clustered su di essa massimizzando le prestazioni di ordinamento, raggruppamento ed eventualmente di filtraggio tramite la clausola BETWEEN:
USE tempdb;
CREATE TABLE dbo.Matrici_DizCampi(
Id int IDENTITY(1, 1),
Campo varchar(10) NOT NULL,
Numero AS CAST(RIGHT(Campo, 4) AS int) PERSISTED,
CONSTRAINT PK_Matrici_DizCampi PRIMARY KEY NONCLUSTERED (Id)
);
CREATE CLUSTERED INDEX CL_IDX_Numero
ON dbo.Matrici_DizCampi(Numero);
INSERT dbo.Matrici_DizCampi VALUES('asdfas2345');
INSERT dbo.Matrici_DizCampi VALUES('bsdfas0345');
INSERT dbo.Matrici_DizCampi VALUES('csdfas7345');
INSERT dbo.Matrici_DizCampi VALUES('xxdfas1345');
INSERT dbo.Matrici_DizCampi VALUES('zzdfas3345');
SELECT Id, Campo, Numero
FROM dbo.Matrici_DizCampi
ORDER BY Numero;
/* Output:
Id Campo Numero
----------- ---------- -----------
2 bsdfas0345 345
4 xxdfas1345 1345
1 asdfas2345 2345
5 zzdfas3345 3345
3 csdfas7345 7345
(5 row(s) affected)
*/
DROP TABLE dbo.Matrici_DizCampi
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org