udf eficientes

42
Conferencia Visual FoxPro España 2003 Diseñando Funciones definidas por usuario eficientes en SQL-Server 2000 Fernando G. Guerrero - Solid Quality Learning Miguel Egea PortalSQL.COM

Upload: fernando-g-guerrero

Post on 12-Jul-2015

290 views

Category:

Software


3 download

TRANSCRIPT

Page 1: Udf eficientes

Conferencia

Visual FoxPro

España 2003Diseñando Funciones

definidas por usuario

eficientes en SQL-Server 2000

Fernando G. Guerrero - Solid Quality LearningMiguel Egea – PortalSQL.COM

Page 2: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Información Breve sobre Fernando(2 milisegundos)

MCSD, MCSE+Internet (W2K), MCDBA, MCT, SQL

Server MVP

Articulista de SQL-Server Magazine y SQL-Server

Profesional.

Mi web-sites http://www.callsql.com y

http://www.solidqualitylearning.com

Mi libro. Escrito junto a Carlos E. Rojas

Principal Mentor en Solid Quality Learning

Page 3: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Información Breve sobre Miguel(1 milisegundo)

SQL Server MVP

Articulista en MSDN

Webmaster de http://www.portalsql.com

El libro que más me gusta

Page 4: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

¿Que debe esperar de las UDF’s?

Las UDFs son flexibles, eficientes, versátiles,

pero …no están demasiado bien documentadas.

Debe conocer cuando y como usarlas.

La siguiente versión de Sql-Server deberá

extender enormemente la funcionalidad de las

UDF’s, así que debe empezar con ellas a.s.a.p.

Obtendrá beneficios conociendo que pasa en los

escenarios que las use (espera a ver algunas

trazas de Profiler)

Quisiéramos enseñaros un montón de ejemplos y

un montón más On-Line

Page 5: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

¿Que debería aprender en esta sesión?

Por qué las UDFs son una funcionalidad

importante en la programación

Como crear UDFs: Definidas por el usuario

UDFs del sistema

Como ejecuta SQL-Server las UDF’s

Como convertir vistas y procedimientos

almacenados en UDF’s

Como usar algunas funciones indocumentadas

del sistema

Como querer a las UDF’s un poquito más cada

dia

Page 6: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Agenda Introducción a las funciones definidas por el

usuario (UDF)

UDF Ventajas y limitaciones

Comentarios sobre funciones no deterministas

Añadiendo funcionalidad A T-SQL con UDF

escalares

Redefiniendo vistas como UDF de tabla en línea.

Convirtiendo procedimientos almacenados en

Funciones de valores de tabla de múltiples

instrucciones

UDFs en las definiciones de integridad

Referencial.

Page 7: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Introducción a las UDF’s

Tipos: Funciones Escalares

De tabla de valores en línea

De tabla de valores de múltiples instrucciones.

Proporcionadas por el sistema Oficialmente soportadas.

Algunas funciones más (útiles)

Usando plantillas del Analizador de Consultas

para crear UDFS

Usando el Analizador para detectar el uso de

funciones

Page 8: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Ventajas de las UDF’s

Pueden generalmente ser usadas en cualquier

lugar de una consulta

Extienden la funcionalidad de T-SQL.

Son compiladas, como los procedimientos

almacenados, ¡Ejecución más rápida!

La creación y el uso son similares a los

procedimientos almacenados.

Page 9: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Limitaciones de las UDF’s

Algunas funciones no deterministas no están

permitidas dentro de UDF’s.

Devuelven un solo valor.

No pueden modificar datos ….. directamente.

Comparten los 32 niveles de recursión con

triggers y procedimientos almacenados.

Page 10: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Máximo 32 niveles de llamada

SQL Transaction

1: Stored Procedure

2: Stored Procedure

3: Trigger 30: Trigger

29: Stored Procedure

31: Trigger

32: Stored Procedure

33: ¿ahora una UDF ?

Page 11: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Ilimitado, sin llamadas recursivas

SQL Transaction

1: Stored Procedure

2: Stored Procedure

3: Trigger30: Trigger

29: Stored Procedure

31: Trigger

32: Stored Procedure

33: Ahora una UDF

Page 12: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Funciones no deterministas, que no

pueden usarse dentro de UDF’s (I)

Funciones no deterministas, no permitidas en UDFs:

CURRENT_TIMESTAMP, GETDATE,

GetUTCDate, @@DBTS

IDENTITY, NEWID

TEXTPTR

@@MAX_CONNECTIONS

Ninguna de las funciones estadísticas del sistema

están permitidas

Todas las otras funciones del sistema están

permitidas menos… veamos la siguiente diapositiva.

Page 13: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Funciones no deterministas, que no

pueden usarse dentro de UDF’s (II)

CAST es determinista excepto convirtiendo

fechas.

Convert es determinista, excepto convirtiendo

fechas sin un estilo de conversión implícito.

CHECKSUM es determinista, excepto

CHECKSUM(*)

IsDate es no determinista, en su lugar use

Convert con un estilo como 0,100,9 o 109.

RAND es no determinista excepto que se

especifique un valor de semilla.

Page 14: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

¿Cuándo es una UDF Determinista?

Todas las funciones, propias o definidas por el

usuario referenciadas son deterministas.

La función se ha definido con WITH

SCHEMABINDING

No ejecuta procedimientos almacenados

extendidos.

No hay que olvidar que según BOL puedes usar

funciones nativas SQL dentro de una UDF

Page 15: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Extender la funcionalidad T-SQL con

UDF’s

Las funciones escalares son exactamente

funciones.

Las puedes usar en cualquier lugar que SQL

espere una expresión

Las UDF’s son funciones multi-comando similares

a los procedimientos almacenados.

Las UDF’s aceptan parámetros de entrada (Hasta

2100 pese a que los BOL dicen 1024).

Las UDF’s no usan parámetros tipo OUPUT.

Las UDF’s devuelven cualquier valor (excepto

BLOB’s)

Page 16: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Ejemplo de función escalar FV

(Valor Futuro)CREATE FUNCTION dbo.fn_FV

(@rate float, @nper int, @pmt money,

@pv money = 0.0, @type bit = 0)

RETURNS money

AS BEGIN

DECLARE @fv money

IF @rate = 0 SET @fv = @pv + @pmt * @nper

ELSE SET @fv = @pv * POWER(1 + @rate,

@nper) + @pmt *

(((POWER(1 + @rate, @nper + @type) -

1) / @rate) – @type)

RETURN (-@fv)

END

Page 17: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

UDF’s escalares indocumentadas

¿Dónde encontrarlas? $SQLInstallDir$\Install\Replsys.sql

$SQLInstallDir$\Install\Procsyst.sql

Algunos ejemplos de uso fn_chariswhitespace

fn_replquotename

fn_replmakestringliteral

fn_mssharedversion

Hay muchas definidas para el uso interno de la replicación. No he encontrado un uso práctico de

ellas, pero su estructura es muy interesante.

Page 18: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Limitaciones y algunos trucos para

UDF’s escalares

Como obtener números aleatorios de una UDF.

Como usar fechas en una UDF.

Recursividad en una UDF escalar.

Como modificar datos dentro de una UDF.

VEAMOS TODO ESTO MÁS EN DETALLE

Page 19: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Como obtener valores aleatorios en

una UDF

RAND no está permitido en una UDF.

Podemos tomar información de hora de

sysprocesses (last_batch). Solo es significativo para conexiones de usuarios.

Podemos usar cuando se lanzan procesos del

sistema (como el LAZY WRITER).

No es excesivamente buen enfoque.

Se puede completar todo esto con funciones

trigonométricas como PI

Se puede usar OPENQUERY para hacer una

‘auto’ llamada y estará todo permitido….

INCLUSO RAND

Page 20: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Como usar Fechas en UDF’s

Las funciones relacionadas con fechas no están

permitidas en las UDF’s.

Podemos usar la información de la hora desde

sysprocesses como antes, pero no es una

información segura.

También podemos usar OPENQUERY u

OPENROWSET para llamar a Sql. Entonces todo

está permitido, incluso GETDATE

¿Por qué no se permiten las funciones de fecha

dentro de las UDF’s. Quizá alguien de MS las odie..

Page 21: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Recursividad en las UDF’s

Nada nos impide usarla ….. Pero deberíamos

intentar otra via.

Está limitada a 32 niveles de recursión.

Puede ser usada para navegar en árboles

binarios.

Son una alternativa válida a procedimientos

almacenados recursivos que devuelven datos.

Ejemplo : El árbol de empleados

Page 22: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

¿Cómo modificar datos desde una

UDF?

No se puede …… por definición.

Pero si puedes usar objetos ADO desde VB o

Foxpro para conectar a SQL-SERVER y modificar

datos…..

Podrás usar lo mismo desde las UDF’s mediante

los procedimientos sp_OAxxx .

Sin embargo si no es imprescindible yo usaría

siempre procedimientos almacenados para

modificar datos.

Pero es posible… Veámos un ejemplo.

Page 23: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

¿Insertar datos con OPENQUERY?

OPENQUERY está diseñado para devolver datos

de cualquier proveedor OLE-DB.

Pero actualmente ejecuta secuencias de

instrucciones.

Veamos que hace…

Page 24: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Usos avanzados de UDF’s escalares

Usar variable de tipo tabla en UDF’s (Listado 6)

Usar y devolver XML (Listado 7)

Consideraciones de rendimiento.

Trazando UDF’s escalares con profiler

(analizador).

Page 25: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Redefiniendo vistas como UDF’s de

tabla en línea

Son como las vistas….casi.

Trabajan como las vistas.

Tienen las mismas limitaciones que las vistas… y

unas pocas más.

Pero : ¡Aceptan parámetros de entrada!

Page 26: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Redefiniendo vistas como UDF’s de

tabla en línea (continuación)

Sin embargo: Deben ser definidas como un solo comando

SELECT.

Nunca son ‘ejecutadas’.

Son insensibles a cambios de estructura.

PERO: no pueden tener índices y no puedes

declarar triggers sobre ellas.

Page 27: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Ejemplo de UDF’s de tabla en línea.

-- Devuelve los pedidos de un día determinado

CREATE FUNCTION dbo.GetOrdersFromDay

(@date as smalldatetime)

RETURNS TABLE

AS

RETURN (SELECT *

FROM Orders

WHERE DATEDIFF(day, OrderDate, @date) = 0)

GO

SELECT *

FROM dbo.GetOrdersFromDay('2002-09-14')

Page 28: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

UDF de tabla en línea documentada.

::fn_trace_gettable(@filename,

@numfiles)

Devuelve información de traza en formato tabla. @filename es el directorio físico de la traza

@numfiles es el número de renovación (default son

todos)

SELECT *

FROM ::fn_trace_gettable(

'c:\my_trace.trc',

default)

Page 29: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Y una UDF del sistema no

documentada

::fn_dblog(@start, @end)

Lee el log de transacciones @start es el Log Sequence Number (LSN)

@end es el último LSN

Se usa (null,null) para leerlo todo

Se cuidadoso con el formato de @start y @end

SELECT TOP 10

[Current LSN], Operation

FROM ::fn_dblog(NULL, NULL)

ORDER BY [Current LSN] DESC

Page 30: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Limitaciones y algunos trucos en las

UDF’s de tabla en línea.

Usar ORDER BY dentro de una UDF (Listado 8)

Joins entre UDF’s con otras UDF’s y otras tablas.

(listado 9)

Modificar datos desde una UDF (Listado 10)

¿Cómo usa SQL-SERVER estas funciones? Intentar detectarlas en el analizador (profiler)

Intentar detectarlas en el plan de ejecución.

Page 31: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Convirtiendo SP’s en UDF’s

multicomando.

Las UDF’s multicomando Son como los procedimientos almacenados.. casi.

Están compilados como los procedimientos

almacenados.

Tienen las mismas limitaciones que los

procedimientos almacenados.

Pero.. Pueden ser usadas en la cláusula FROM

de cualquier secuencia de comandos.

Page 32: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Convertir SP’s en UDF’s

multicomando (continuación)

¿Por qué $#%£! debería convertir mis

procedimientos almacenados? Es muy fácil convertir procedimientos

almacenados en funciones.

Son tan rápidas como los procedimientos

almacenados.

Aunque, no pueden usar parámetros de salida

(OUTPUT)

Aunque, no pueden modificar datos …

directamente.

Esto es por lo que LAS QUIERO

Page 33: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Ejemplos de creación de UDFs

multicomando.

CREATE FUNCTION dbo.tv_GetOrdersFromDay

(@date as smalldatetime)

RETURNS @list TABLE (OrderID int, OrderDate

datetime)

AS

BEGIN

INSERT @List

SELECT OrderID, OrderDate

FROM Orders

WHERE DATEDIFF(day, OrderDate, @date) = 0

RETURN

END

Page 34: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Algunas UDF’s multicomando más

complejas.

MakeList(@ParamArray, @Separator)

Convierte una cadena de strings en una

tabla con un solo campo con cada item

separado por @separator en una fila.

(Listado 11)

OrderDetailsComplete(@ID, @Key)

Muestra un listado de pedidos con información

completa y descriptiva, con cada primary key para

unir con otras tablas( Listado 12)

La lista se producirá para cada : Order (@Key = 'ORD') Product (@Key = 'PRO')

Customer (@Key = 'CUS') Category (@Key = 'CAT')

Full List (@Key NOT IN ('ORD', 'PRO', 'CUS', 'CAT'))

Page 35: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Limitaciones y trucos con las

UDF’s multicomando

Solo puedes devolver un conjunto de resultados

Uniendo UDF’s de tabla en línea, con UDF’s

multicomando u otras Tablas.

No puedes modificar los datos dentro de una

UDF… directamente.

¿Cómo usa SQL-SERVER estas funciones? Intentar detectarlas en el analizador (profiler)

Intentar detectarlas en el plan de ejecución.

Page 36: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Creando UDF’s del sistema

Deben ser creadas en master.

SQL-SERVER debe estar configurado para

permitir actualizaciones en las tablas del sistema.

El propietario debe ser system_function_schema

Y ya está!!!

Son muy útiles para convertir procedimientos

almacenados del sistema en UDF’s Si quieres usar esos procedimientos almacenados

en cláusulas FROM

Y el procedimiento almacenado tiene un código

válido para una UDF.

Page 37: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Ejemplo. Convirtiendo sp_lock en

fn_lock. Fn_lock te puede proporcionar más funcionalidad

que sp_lock: Buscando procesos bloqueados. Buscando bloqueos que afectan a algunos

objetos. Mostrando los bloqueos que afecta a una

conexión. Mostrando bloqueos que afectan al mismo

recurso. Mira el código. Por ejemplo :

SELECT *

FROM ::fn_lock()

WHERE Status = 'WAIT‘

Page 38: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Ejemplo: Obteniendo información de

grupos y usuarios de Windows

fn_getntgroupmembers te informa de los

miembros de un grupo de usuarios de windows

gn_getntgroups Te informa de los grupos a los

que pertenece un usuario.

Veamos el código:

Por ejemplo:SELECT *

FROM

::fn_getntgroups(‘MyDomain\MyUse

r')

Page 39: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Las UDF’s en las restricciones Usar UDFs escalares en definiciones DEFAULT

Usar UDFs escalares en restricciones CHECK

Usar UDFs escalares en campos PRIMARY KEY

Usar UDFs escalares en columnas calculadas

“UDFs Provide a New Identity” (SQL Server

Magazine, March 2001):

http://www.sqlmag.com/Articles/Index.cfm?Arti

cleID=16354

Mira el código.ALTER TABLE IDTest

ADD CONSTRAINT def_IDTest

DEFAULT (dbo.fn_GetNewID(OBJECT_ID('IDTest'))) FOR

ID

Page 40: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Recursos y referencias

Microsoft SQL Server 2000 by Example:

http://www.SqlServerByExample.com

SQL Server Magazine: http://www.sqlmag.com

Professional Association of SQL Server:

http://www.sqlpass.org

Newsgroups: news://msnews.microsoft.com

Swynk: http://www.swynk.com

CallSQL: http://www.callsql.com

www.SolidQualityLearning.com

PortalSQL.COM : http://www.portalsql.com

Microsoft SQL Server site:

http://www.microsoft.com/sql

Page 41: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

Gracias!!!!!!!!!!!!!

¿Preguntas?

Contacte con nosotros en

[email protected] y

[email protected]

Page 42: Udf eficientes

Conferencia Visual FoxPro España 2003 PortalFox.com

¡Gracias!

Acuérdese de rellenar la hoja de evaluación