Upload
fer191919
View
25
Download
6
Embed Size (px)
DESCRIPTION
BHP Training SQL Server 2000 Programadores
Citation preview
Programación en SQL Server 2000
Recibiendo Datos
Introducción• Recibiendo Datos usando la sentencia SELECT• Filtrando Datos• Formateando un Set de Resultados• Cómo son procesadas las consultas• Consideraciones de rendimiento
Recibiendo Datos
Recibiendo Datos usando la sentencia SELECT• Uso de la sentencia SELECT• Especificación de Columnas• Usando la cláusula WHERE para especificar Filas.
Recibiendo Datos
SELECT [ALL | DISTINCT] <select_list> FROM {<table_source>} [,…n] WHERE <search_condition>
Sintaxis Parcial
Usando la sentencia SELECT• SELECT lista las columnas especificadas• La cláusula WHERE especifica la restricción a nivel de
filas• La cláusula FROM especifica el origen de datos
(Tabla)
Recibiendo Datos
Especificando Columnas
employeeid lastname firstname title
1 Davolio Nancy Sales Representative
2 Fuller Andrew Vice President, Sales
3 Leverling Janet Sales Representative
4 Peacock Margaret Sales Representative
5 Buchanan Steven Sales Manager
6 Suyama Michael Sales Representative
7 King Robert Sales Representative
8 Callahan Laura Inside Sales Coordinator
9 Dodsworth Anne Sales Representative
USE northwindSELECT employeeid, lastname, firstname, titleFROM employeesGO
Recibiendo Datos
Usando la cláusula WHERE para especificar filas
employeeid lastname firstname title
5 Buchanan Steven Sales Manager
USE northwindSELECT employeeid, lastname, firstname, titleFROM employeesWHERE employeeid = 5GO
Recibiendo Datos
Filtrando Datos• Usando operadores de comparación• Usando String de comparación• Usando operadores lógicos• Recibiendo un rango de valores• Usando una lista de valores como criterio de
busqueda• Recibiendo valores desconocidos
Recibiendo Datos
Usando operadores de comparaciónUSE northwindSELECT lastname, cityFROM employeesWHERE country = 'USA'
GO
lastname city
Davolio SeattleFuller TacomaLeverling KirklandPeacock RedmondCallahan Seattle
Ejemplo 1
Recibiendo Datos
Usando String de comparación
USE northwindSELECT companynameFROM customersWHERE companyname LIKE '%Restaurant%'GO
companyname
GROSELLA-Restaurante
Lonesome Pine Restaurant
Tortuga Restaurante
Recibiendo Datos
Usando comparadores lógicos
USE northwindSELECT productid, productname, supplierid, unitprice FROM products WHERE (productname LIKE 'T%' OR productid = 46) AND (unitprice > 16.00) GO
productid productname supplierid unitprice
14 Tofu 6 23.25
29 Thüringer Rostbratwurst 12 123.79
62 Tarte au sucre 29 49.3
Ejemplo 1
Recibiendo Datos
Recibiendo un rango de valores
USE northwindSELECT productname, unitpriceFROM productsWHERE unitprice BETWEEN 10 AND 20GO
productname unitprice
Chai 18
Chang 19
Aniseed Syrup 10
Genen Shouyu 15.5
Pavlova 17.45
Sir Rodney’s Scones 10
… …
Ejemplo 1
Recibiendo Datos
USE northwindSELECT companyname, countryFROM suppliersWHERE country IN ('Japan', 'Italy')
GO
Usando una lista de valores como criterio de busqueda
companyname country
Tokyo Traders Japan
Mayumi’s Japan
Formaggi Fortini s.r.l. Italy
Pasta Buttini s.r.l. Italy
Ejemplo 1
Recibiendo Datos
Recibiendo valores desconocidosUSE northwindSELECT companyname, faxFROM suppliersWHERE fax IS NULLGO
companyname fax
Exotic Liquids NULL
New Orleans Cajun Delights NULL
Tokyo Traders NULL
Cooperativa de Quesos ‘Las Cabras’ NULL
… …
Recibiendo Datos
Formateando el resultado• Ordenando los datos• Eliminando filas duplicadas• Cambiando nombres de las columnas• Usando literales
Recibiendo Datos
Ordenando DatosUSE northwindSELECT productid, productname, categoryid, unitprice FROM products ORDER BY categoryid, unitprice DESCGO
productid productname categoryid unitprice
38 Cote de Blaye 1 263.5000
43 Ipoh Coffee 1 46.0000
2 Chang 1 19.0000
… … … …
63 Vegie-spread 2 43.9000
8 Northwoods Cranberry Sauce 2 40.0000
61 Sirop d'érable 2 28.5000
… … … …
Ejemplo 1
Recibiendo Datos
Eliminando Filas duplicadas
USE northwindSELECT DISTINCT country FROM suppliers ORDER BY countryGO
country
Australia
Brazil
Canada
Denmark
Finland
France
Germany
Italy
Japan
Netherlands
Norway
Singapore
Spain
Sweden
UK
USA
Example 1
Recibiendo Datos
Cambiando nombres de las columnasUSE northwindSELECT firstname AS First, lastname AS Last
,employeeid AS 'Employee ID:' FROM employeesGO
First Last Employee ID:
Nancy Davolio 1
Andrew Fuller 2
Janet Leverling 3
Margaret Peacock 4
Steven Buchanan 5
Michael Suyama 6
Robert King 7
Laura Callahan 8
Anne Dodsworth 9
Recibiendo Datos
Usando literalesUSE northwindSELECT firstname, lastname
,'Identification number:', employeeidFROM employeesGO
First Last Employee ID:
Nancy Davolio Identification Number: 1
Andrew Fuller
Janet Leverling
Margaret Peacock
Steven Buchanan
Michael Suyama
Robert King
Laura Callahan
Anne Dodsworth
Identification Number: 2
Identification Number: 3
Identification Number: 4
Identification Number: 5
Identification Number: 6
Identification Number: 7
Identification Number: 8
Identification Number: 9
Recibiendo Datos
Cómo son procesadas las consultasUncached Queries (Ad Hoc)
Cached Queries
ExecuteCompileOptimizeResolveParse
First Execution
ExecuteCompileOptimizeResolveParse
Subsequent Execution ExecuteProcedure
Cache
Recibiendo Datos
Cómo son “cacheadas” automáticamente las consultas
USE northwindSELECT * FROM products WHERE unitprice = $12.5SELECT * FROM products WHERE unitprice = 12.5SELECT * FROM products WHERE unitprice = $12.5GO
USE librarySELECT * FROM member WHERE member_no = 7890SELECT * FROM member WHERE member_no = 1234SELECT * FROM member WHERE member_no = 7890GO
Ad Hoc Batches
Auto-Parameterization
Recibiendo Datos
Consideraciones de Rendimiento• Las consultas sin ser específicas van a ser mas lentas.
Full Scan.• Busquedas LIKE relentizan la recuperación• Coincidencias exactas o rangos mejoran velocidad de
recuperación de datos Cláusula ORDER BY puede ralentizar la recuperación de datos
Recibiendo Datos
Procedimientos recomendados
Usar la cláusula DISTINCT para eliminar las filas duplicadas en los resultados
Mejorar la legibilidad de los resultados por cambio de nombres de columna o mediante literales
En la línea multi-columna, coloque una coma antes de la Nombres de columna, con excepción de la primera columna
Recibiendo Datos
Práctica
SQL Server 2000
Recibiendo Datos
Repaso• Obtener datos usando la setencia SELECT• Filtrando Datos• Formateando un set de resultados• Cómo se procesar las consultas• Consideraciones de Rendimiento
Recibiendo Datos
Agrupando y sumarizando datos
Introducción• TOP n• Usando funciones de agregación• GROUP BY• Generando valores agregados en los
resultados• Usando cláusulas COMPUTE y COMPUTE BY
Agrupando y sumarizando datos
TOP n• Lista sólo las primeras n filas• Especifica el rango de valores en las cláusula
ORDER BY• Returns Ties if WITH TIES Is Used
USE northwindSELECT TOP 5 orderid, productid, quantity FROM [order details] ORDER BY quantity DESCGO
USE northwindSELECT TOP 5 WITH TIES orderid, productid, quantity FROM [order details] ORDER BY quantity DESCGO
Ejemplo 1
Ejemplo 2
Agrupando y sumarizando datos
Usando funciones de agrupaciónFunción Agrupación Descripción
AVG Average of values in a numeric expression
COUNT Number of values in an expression
COUNT (*) Number of selected rows
MAX Highest value in the expression
MIN Lowest value in the expression
SUM Total values in a numeric expression
STDEV Statistical deviation of all values
STDEVP Statistical deviation for the population
VAR Statistical variance of all values
VARP Statistical variance of all values for the population
Agrupando y sumarizando datos
Usando funciones agregadas con valores Null• Las funciones de agregación ignoran los valores null• COUNT(*) cuenta las filas con valores null
USE northwindSELECT COUNT (*) FROM employeesGO
USE northwindSELECT COUNT(reportsto) FROM employeesGO
Ejemplo 1
Ejemplo 2
Agrupando y sumarizando datos
GROUP BY• Usando la cláusula GROUP BY• Usando la cláusula GROUP BY con HAVING
Agrupando y sumarizando datos
USE northwindSELECT productid ,SUM(quantity) AS total_quantity FROM orderhist WHERE productid = 2 GROUP BY productidGO
Usando la cláusula GROUP BYUSE northwindSELECT productid, orderid ,quantity FROM orderhistGO
USE northwindSELECT productid ,SUM(quantity) AS total_quantity FROM orderhist GROUP BY productidGO
productid total_quantity
1 15
2 35
3 45
productid orderid quantity
1 1 5
1 1 10
2 1 10
2 2 25
3 1 15
3 2 30
productid total_quantity
2 35
Sólo las filas que satisfacen la cláusula WHERE
Agrupando y sumarizando datos
Usando la cláusula GROUP BY con HAVING
USE northwindSELECT productid, orderid ,quantity FROM orderhistGO
USE northwindSELECT productid, SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid HAVING SUM(quantity)>=30GO
productid total_quantity
2 35
3 45
productid orderid quantity
1 1 5
1 1 10
2 1 10
2 2 25
3 1 15
3 2 30
Agrupando y sumarizando datos
Generando valores agrupados en los resultados• Usando GROUP By con el operador ROLLUP• Usando GROUP By con el operador CUBE• Usando la función GROUPING
Agrupando y sumarizando datos
Usando GROUP By con el operador ROLLUPUSE northwindSELECT productid, orderid, SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid, orderid WITH ROLLUP ORDER BY productid, orderidGO
productid orderid total_quantity
NULL NULL 95
1 NULL 15
1 1 5
1 2 10
2 NULL 35
2 1 10
2 2 25
3 NULL 45
3 1 15
3 2 30
Grand total
Summarizes only rows for productid 1
Detail value for productid 1, orderid 1
Detail value for productid 1, orderid 2
Summarizes only rows for productid 2
Detail value for productid 2, orderid 1
Summarizes only rows for productid 3
Detail value for productid 3, orderid 1
Detail value for productid 3, orderid 2
Agrupando y sumarizando datos
Usando GROUP By con el operador CUBE
El operador CUBE produce dos resumenes más de valores que el operador ROLLUP
USE northwindSELECT productid, orderid, SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid, orderid WITH CUBE ORDER BY productid, orderidGO
Descripción
Grand total
Summarizes all rows for orderid 1
Summarizes all rows for orderid 2
Summarizes only rows for productid 1
Detail value for productid 1, orderid 1
Detail value for productid 1, orderid 2
Summarizes only rows for productid 2
Detail value for productid 2, orderid 1
Detail value for productid 2, orderid 2
Summarizes only rows for productid 3
Detail value for productid 3, orderid 1
Detail value for productid 3, orderid 2
productid orderid total_quantity
NULL NULL 95
NULL 1 30
NULL 2 65
1 NULL 15
1 1 5
1 2 10
2 NULL 35
2 1 10
2 2 25
3 NULL 45
3 1 15
3 2 30
Agrupando y sumarizando datos
1 represents summary values in the preceding column
0 represents detail values in the preceding column
95
30
65
15
5
10
35
10
25
45
15
30
Usando la función GROUPING
SELECT productid, GROUPING (productid) ,orderid, GROUPING (orderid) ,SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid, orderid WITH CUBE ORDER BY productid, orderidGO
productidNULL
NULL
NULL
1
1
1
2
2
2
3
3
3
1
1
1
0
0
0
0
0
0
0
0
0
orderidNULL
1
2
NULL
1
2
NULL
1
2
NULL
1
2
1
0
0
1
0
0
1
0
0
1
0
0
total_quantity
Agrupando y sumarizando datos
COMPUTE BY
COMPUTEUSE northwindSELECT productid, orderid, quantity FROM orderhist ORDER BY productid, orderid COMPUTE SUM(quantity) BY productid COMPUTE SUM(quantity)GO
USE northwindSELECT productid, orderid ,quantity FROM orderhistORDER BY productid, orderidCOMPUTE SUM(quantity)GO
productid orderid quantity
1 1 5
1 2 10
2 1 10
2 2 25
3 1 15
3 2 30
sum 95
productid orderid quantity
1 1 5
1 2 10
sum 15
2 1 10
2 2 25
sum 35
3 1 15
3 2 30
sum 45
sum 95
Usando la función GROUPING
Agrupando y sumarizando datos
Procedimientos recomendados
Indexar con frecuencia las columnas agregadas
Evite el uso de funciones agregadas con valores nulos
Utilice la cláusula ORDER BY para garantizar un orden
Utilice el operador ROLLUP con la cláusula CUBE
Agrupando y sumarizando datos
Práctica
SQL Server 2000
Agrupando y sumarizando datos
Revisión• TOP n• Usando funciones de agregación• Fundamentos de GROUP BY• Generar valores de agregación en los resultados• Usando la cláusula COMPUTE y COMPUTE BY
Agrupando y sumarizando datos
Uniendo multiples tablas
Introducción• Usando Alias para nombrar tablas• Combinando datos de múltiples tablas• Combinando múltiples resultados
Uniendo múltiples tablas
Usando Alias para nombrar tablas
• Ejemplo 1 (sin alias)
• Ejemplo 2 (con alias)USE joindbSELECT buyer_name, s.buyer_id, qty FROM buyers AS b INNER JOIN sales AS s ON b.buyer_id = s.buyer_idGO
USE joindb SELECT buyer_name, sales.buyer_id, qty FROM buyers INNER JOIN sales ON buyers.buyer_id = sales.buyer_idGO
Uniendo múltiples tablas
Combinando datos de múltiples tablas• Introducción a los JOIN• Inner Joins• Outer Joins• Cross Joins• Join con más de dos tablas• Join de una tabla con ella misma
Uniendo múltiples tablas
Introducción a los Join• Seleccionar columnas especificas de multiples
tablas– La palabra JOIN especifica que tablas estan en
reunion y como se reunen– La palabra ON especifica la condición de reunión
• Consulta dos o más tablas para generar un resultado– Usar PK y FK como condición de la reunión– Usar columnas en común durante la reunión
Uniendo múltiples tablas
USE joindbSELECT buyer_name, sales.buyer_id, qtyFROM buyers INNER JOIN salesON buyers.buyer_id = sales.buyer_idGO
sales
buyer_id prod_id qty
1
1
4
3
2
3
1
5
15
5
37
11
4 2 1003
buyers
buyer_name
Adam Barr
Sean Chai
Eva Corets
Erin O’Melia
buyer_id
1
2
3
4
Result
buyer_name
Adam Barr
Adam Barr
Erin O’Melia
Eva Corets
buyer_id qty
1
1
4
3
15
5
37
11
Erin O’Melia 4 1003
Ejemplo 1
Usando Join
Uniendo múltiples tablas
USE joindbSELECT buyer_name, sales.buyer_id, qty FROM buyers LEFT OUTER JOIN sales ON buyers.buyer_id = sales.buyer_idGO
sales
buyer_id prod_id qty
1
1
4
3
2
3
1
5
15
5
37
11
4 2 1003
buyers
buyer_name
Adam Barr
Sean Chai
Eva Corets
Erin O’Melia
buyer_id
1
2
3
4Resultado
buyer_name
Adam Barr
Adam Barr
Erin O’Melia
Eva Corets
buyer_id qty
1
1
4
3
15
5
37
11
Erin O’Melia 4 1003
Sean Chai NULL NULL
Ejemplo 1
Usando Outer Joins
Uniendo múltiples tablas
USE joindbSELECT buyer_name, qty FROM buyers CROSS JOIN salesGO
Resultado
buyer_name
Adam Barr
Adam Barr
Adam Barr
Adam Barr
qty
15
5
37
11
Adam Barr 1003
Sean Chai 15
Sean Chai 5
Sean Chai 37
Sean Chai 11
Sean Chai 1003
Eva Corets 15... ...
sales
buyer_id prod_id qty
1
1
4
3
2
3
1
5
15
5
37
11
4 2 1003
buyers
buyer_id
1
2
3
4
buyer_name
Adam Barr
Sean Chai
Eva Corets
Erin O’Melia
Ejemplo 1
Usando Cross Joins
Uniendo múltiples tablas
Reuniendo más de dos TablasSELECT buyer_name, prod_name, qty FROM buyers INNER JOIN sales ON buyers.buyer_id = sales.buyer_id INNER JOIN produce ON sales.prod_id = produce.prod_idGO
produce
prod_id prod_name
1
2
3
4
Apples
Pears
Oranges
Bananas
5 Peaches
buyers
buyer_id
1
2
3
4
buyer_name
Adam Barr
Sean Chai
Eva Corets
Erin O’Melia
sales
buyer_id
1
1
3
4
prod_id
2
3
1
5
2 2
qty
15
5
37
11
1003
Result
buyer_name
Erin O’Melia
Adam Barr
Erin O’Melia
Adam Barr
Eva Corets
prod_name
Apples
Pears
Pears
Oranges
Peaches
qty
37
15
1003
5
11
Ejemplo 1
Uniendo múltiples tablas
Reuniendo una tabla con ella mismaUSE joindbSELECT a.buyer_id AS buyer1, a.prod_id ,b.buyer_id AS buyer2 FROM sales AS a JOIN sales AS b ON a.prod_id = b.prod_idWHERE a.buyer_id > b.buyer_idGO
sales b
buyer_id prod_id qty
1
1
4
3
2
3
1
5
15
5
37
11
4 2 1003
sales a
buyer_id prod_id qty
1
1
4
3
2
3
1
5
15
5
37
11
4 2 1003
Result
buyer1
4
prod_id buyer2
2 1
Ejemplo 3
Uniendo múltiples tablas
Combinando múltiples resultados• Use el operador UNION para crear resultados
de multiples consultas• Para cada consulta Ud. debería:
– Trabajar con tipos de datos similares– Trabajar con el mismo nro de columnas – Trabajar con el mismo orden de columnas
en las columnas seleccionadas
USE northwindSELECT (firstname + ' ' + lastname) AS name ,city, postalcode FROM employeesUNIONSELECT companyname, city, postalcode FROM customersGO
Uniendo múltiples tablas
Procedimientos recomendados
Reunir tablas utilizando la PK y las FK
Referenciar todas las columnas que componene la PK en la cláusula ON cuando la clave es compuesta
Limitar el nro de tablas en un JOIN
Uniendo múltiples tablas
Práctica
SQL Server 2000
Uniendo múltiples tablas
Repaso• Usar Alias para los nombres de las tablas• Combinando datos de multiples tablas• Combinando múltiples resultados
Uniendo múltiples tablas
Trabajando con Subconsultas
Introducción• Introducción a subconsultas• Usando una subconsulta como una tablas derivada• Usando una subconsulta como una expresión• Usando una subconsulta para datos correlativos• Usando EXISTS y NOT EXISTS
Trabajando con Subconsultas
Introducción a subconsultas• Porque usar subconsultas
– Para disminuir lo complejo de una consulta y dividirla en una serie lógica de pasos
– Para responder a una consulta que se basa en los resultados de otra consulta
• Porque usar Joins en lugar de subconsultas– SQL Server executa mas rápido los JOIN
que las subconsultas• Cómo usar subconsultas
Trabajando con SubconsultasTrabajando con Subconsultas
Usando una subconsulta como una tablas derivada
• Es un set de resultados en una consulta que funciona como una tabla
• Toma el lugar de una tabla en la cláusula FROM
• Esta optimizado con el resto de la consulta
USE northwindSELECT T.orderid, T.customerid FROM ( SELECT orderid, customerid FROM orders ) AS TGO
Trabajando con SubconsultasTrabajando con Subconsultas
Usando una subconsulta como una expresión• Es evaluada y tratada como una expresión • Es ejecutada junto con la consulta principal
USE pubsSELECT title, price ,( SELECT AVG(price) FROM titles) AS average ,price-(SELECT AVG(price) FROM titles) AS difference FROM titles WHERE type='popular_comp'GO
Trabajando con SubconsultasTrabajando con Subconsultas
Usando una subconsulta para datos correlativos• Evaluando subconsultas correlativas• Imitando una cláusula JOIN• Imitando una cláusula HAVING
Trabajando con SubconsultasTrabajando con Subconsultas
Evaluando una consulta correlativa
Back to Step 1
USE northwindSELECT orderid, customerid FROM orders AS or1 WHERE 20 < (SELECT quantity FROM [order details] AS od WHERE or1.orderid = od.orderid AND od.productid = 23)GO
La consulta externa pasa los valores de columna a la consulta interna
La consulta utiliza este valor para satisfacer la consulta interna
La consulta devuelve un valor a la consulta externa
El proceso se repite para la siguiente fila de la consulta externa
Ejemplo 1
Trabajando con SubconsultasTrabajando con Subconsultas
Imitando una cláusula JOIN• Las subconsultas correlacionadas pueden producir el
mismo resultado que una cláusula JOIN• Deja al optimizador de consultas para determinar
cómo se correlacionan los datos de manera más eficiente
USE pubsSELECT DISTINCT t1.type FROM titles AS t1 WHERE t1.type IN (SELECT t2.type FROM titles AS t2 WHERE t1.pub_id <> t2.pub_id)GO
Ejemplo 1
Trabajando con SubconsultasTrabajando con Subconsultas
Imitando una cláusula HAVING• Subconsulta con el mismo resultado que una
cláusula HAVING
• Usando la cláusula HAVING sin una subconsulta
USE pubsSELECT t1.type, t1.title, t1.price FROM titles AS t1 WHERE t1.price > ( SELECT AVG(t2.price) FROM titles AS t2 WHERE t1.type = t2.type )GO
USE pubsSELECT t1.type, t1.title, t1.price FROM titles AS t1 INNER JOIN titles AS t2 ON t1.type = t2.type GROUP BY t1.type, t1.title, t1.price HAVING t1.price > AVG(t2.price)GO
Ejemplo 1
Ejemplo 2
Trabajando con SubconsultasTrabajando con Subconsultas
Usando EXISTS y NOT EXISTS• Usar con Subconsultas correlacionadas• Determinar si existen datos en una lista de
valores del Proceso de SQL Server– La consulta externa prueba la existencia de filas– La consulta interior devuelve TRUE o FALSE
USE northwindSELECT lastname, employeeid FROM employees AS e WHERE EXISTS (SELECT * FROM orders AS o WHERE e.employeeid = o.employeeid AND o.orderdate = '9/5/97')GO
Ejemplo 1
Trabajando con SubconsultasTrabajando con Subconsultas
Procedimientos recomendados
Utilice subconsultas para romper una compleja consulta
Utilice alias para las tablas en las Subconsultas correlacionadas
Utilice el comando INSERT…SELECT Para añadir filas de otras fuentes a una tabla existente
Utilice el operador EXISTS en lugar del operador IN
Trabajando con SubconsultasTrabajando con Subconsultas
Práctica
SQL Server 2000
Trabajando con SubconsultasTrabajando con Subconsultas
Repaso• Introducción a las subconsultas• Usando una subconsulta como una tabla derivada• Usando una subconsulta como una expresion• Usando una subconsulta con datos correlativos• Usando cláusulas EXISTS y NOT EXISTS
Trabajando con SubconsultasTrabajando con Subconsultas
Modificando Datos
Introducción• Usando Transacciones• Insertando Datos• Borrando Datos• Actualizando Datos• Consideraciones de rendimiento
Modificando Datos
Usando Transacciones• Comienzo de
Transacciones– Explícitas– Autocommit– Implícitas
• Final de la Transacción– COMMIT– ROLLBACK
BEGIN TRANSACTION UPDATE savings . . . UPDATE checking . . .COMMIT TRANSACTION
Modificando DatosModificando Datos
Insertando Datos• Insertando una fila de datos por valor• Usando sentencias INSERT…SELECT• Creación de una tabla usando la sentencia SELECT
INTO• Insertando Datos parciales• Insertando datos utilizando columnas por defecto
Modificando DatosModificando Datos
Insertando una fila de datos por valor• Se debe tener en cuenta las restricciones de destino
o la sentencia INSERT falla• Usar una lista de columnas para especificar columnas
de destino• Especificar una correspondencia en la lista de valores
USE northwindINSERT customers
(customerid, companyname, contactname, contacttitle ,address, city, region, postalcode, country, phone ,fax)
VALUES ('PECOF', 'Pecos Coffee Company', 'Michael Dunn' ,'Owner', '1900 Oak Street', 'Vancouver', 'BC' ,'V3F 2K1', 'Canada', '(604) 555-3392' ,'(604) 555-7293')
GO
Modificando DatosModificando Datos
USE northwindINSERT customers SELECT substring(firstname, 1, 3) + substring (lastname, 1, 2) ,lastname, firstname, title, address, city ,region, postalcode, country, homephone, NULL FROM employeesGO
Usando la sentencia INSERT…SELECT• Todas las filas que satisfacen la sentencia SELECT son
insertadas• Verificar que la tablas que recibe nuevas filas exista• Asegurarse que los tipos de datos sea compatibles• Determinar la existencia de valores por defecto o
que la columna permita valores Null
Modificando DatosModificando Datos
Creación de tablas usando la sentencia SELECT INTO• Se usa para crear una tabla con sus datos a traves
de una sentencia simple• Crear una tabla local o global en forma temporal• Crear alias a las columnas o especificar nombres de
las columnas para la nueva tablaUSE northwindSELECT productname AS products ,unitprice AS price ,(unitprice * 1.1) AS tax INTO #pricetable FROM productsGO
Modificando DatosModificando Datos
Insertando Datos Parciales
USE northwindINSERT shippers (companyname)VALUES ('Fitch & Mather')GO
Agregando Datos
USE northwindSELECT *FROM shippersWHERE companyname = 'Fitch & Mather'GO
Verificando Datos nuevos
shipperid
37
companyname
Fitch & Mather
phone
Null
Permite Valores Null
Ejemplo 1
Ejemplo 2
Modificando DatosModificando Datos
Insertando Datos utilizando columnas por defecto
• DEFAULT– Inserta el valor por defecto
especificado en la columna– La columna debe tener un valor por
defecto o permitir valores null
USE northwindINSERT shippers (companyname, phone) VALUES ('Kenya Coffee Co.', DEFAULT)GO
Modificando DatosModificando Datos
Insertando Datos utilizando columnas por defecto
• DEFAULT VALUES– Inserta valores por defecto a todas las
columnas– La columna debe tener un valor por
defecto o permitir valores null
Modificando DatosModificando Datos
Eliminando Datos• Uso de la sentencia DELETE • Usando la sentencia TRUNCATE TABLE • Eliminando filas basándose en otrsa tablas
Modificando DatosModificando Datos
Uso de la sentencia DELETE • La sentencia DELETE remueve una o mas filas
in una tabla teniendo en cuenta la cláusula WHERE y su condición.
• Cada fila eliminada es cargada en el transaction log
USE northwindDELETE orders WHERE DATEDIFF(MONTH, shippeddate, GETDATE()) >= 6GO
Modificando DatosModificando Datos
USE northwindTRUNCATE TABLE ordersGO
Usando la sentencia TRUNCATE TABLE• La sentencia TRUNCATE TABLE elimina todas las filas
de una tabla• SQL Server retiene la estructura de la tabla y los
objetos relacionados• Sólo los puntos a las páginas de memoria son
almacenados en el transaction log
Modificando DatosModificando Datos
Eliminación de Datos basándose en otras tablas• Usando una cláusula FROM adicional
– La primera cláusula FROM indica la tabla a modificar
– La segunda cláusula FROM especifica el criterio de restricción de la sentencia DELETE
• Especificar condiciones en la cláusula WHERE– La subconsulta especifica cuales filas se
eliminarán
Modificando DatosModificando Datos
Actualizando Datos• Actualizando filas basándose en datos y de
una tabla• Actualizando filas basándose en otras tablas
Modificando DatosModificando Datos
USE northwindUPDATE products SET unitprice = (unitprice * 1.1)GO
Actualizando filas basándose en datos y de una tabla
• La cláusula WHERE especifica las filas a cambiar• SET Keyword especifica el nuevo dato• Los datos ingresados deben ser compatibles con
los tipos de datos de las columnas• La actualización no se lleva adelante en filas que
violan alguna regla de integridad
Modificando DatosModificando Datos
Actualizando filas basándose en otras tablas• Cómo trabajar con la sentencia UPDATE
– Nunca actualizar la misma fila dos veces– Las columnas requieren el prefijo de la
tabla cuando existen nombres ambiguos• Especificando filas para actualizar usando JOINS
– Usar la cláusula FROM• Especificand filas para actualizar usando
Subconsultas
Modificando DatosModificando Datos
Consideraciones de Rendimiento• Todas las modificaciones de datos ocurren en
una misma transacción• Data Page Allocation• El modificar datos indexados incrementar el
Overhead• Los indices pueden asistir en el criteria de
busqueda
Modificando DatosModificando Datos
Procedimientos recomendados
Siempre escribir una sentencia SELECT que no modifica los datos antes de ejecutar sentencia que si lo hagan
Mejorar la legibilidad de los resultados cambiando los nombres de las columnas por literales
SIEMPRE incluir la cláusula WHERE cuando se utilizan las sentencias DELETE o UPDATE
Modificando DatosModificando Datos
Práctica
SQL Server 2000
Modificando DatosModificando Datos
Revisión• Usando Transacciones• Insertando Datos• Eliminando Datos• Actualizando Datos• Consideraciones de Rendimiento
Modificando DatosModificando Datos
Implementación de procedimientos almacenados
• Introducción a los procedimientos almacenados• Creación, ejecución, modificación y eliminación de
procedimientos almacenados• Utilización de parámetros en los procedimientos
almacenados• Ejecución de procedimientos almacenados
extendidos• Control de mensajes de error• Consideraciones acerca del rendimiento
Introducción
Implementación de procedimientos almacenados
• Definición de procedimientos almacenados• Procesamiento inicial de los procedimientos
almacenados • Procesamientos posteriores de los procedimientos
almacenados• Ventajas de los procedimientos almacenados
Introducción a los procedimientos almacenados
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Definición de procedimientos almacenados• Colecciones con nombre de instrucciones
Transact-SQL• Encapsulado de tareas repetitivas• Admiten cinco tipos (del sistema, locales,
temporales, remotos y extendidos)• Aceptar parámetros de entrada y devolver valores• Devolver valores de estado para indicar que se ha
ejecutado satisfactoriamente o se ha producido algún error
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Procesamiento inicial de los procedimientos almacenados
Se almacena en las tablassysobjects y syscomments
El plan compilado secoloca en la caché de
procedimientos
Compilación
Optimización
Creación
Ejecución(por primera vez o recompilación)
Análisis
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Procesamientos posteriores de los procedimientos almacenados
Plan de ejecución recuperado
Plan sin usar se retira
Plan de consulta Contexto de ejecución
SELECT *FROM dbo.memberWHERE member_no = ?
Conexión 1
8082
Conexión 2
Conexión 3
24
1003
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Ventajas de los procedimientos almacenados • Compartir la lógica de la aplicación• Exposición de los detalles de las tablas de la
base de datos• Proporcionar mecanismos de seguridad• Mejorar el rendimiento• Reducir el tráfico de red
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Creación, ejecución y modificación de procedimientos almacenados
• Creación de procedimientos almacenados• Recomendaciones para la creación de
procedimientos almacenados• Ejecución de procedimientos almacenados• Modificación y eliminación de procedimientos
almacenados
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Creación de procedimientos almacenados• Utilice la instrucción CREATE PROCEDURE para crearlos
en la base de datos activa
• Puede anidar hasta 32 niveles• Use sp_help para mostrar información
USE NorthwindGOCREATE PROC dbo.OverdueOrdersAS SELECT * FROM dbo.Orders WHERE RequiredDate < GETDATE() AND ShippedDate IS NullGO
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Recomendaciones para la creación de procedimientos almacenados
• El usuario dbo debe ser el propietario de todos los procedimientos almacenados
• Un procedimiento almacenado por tarea• Crear, probar y solucionar problemas• Evite sp_Prefix en los nombres de
procedimientos almacenados
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Recomendaciones para la creación de procedimientos almacenados
• Utilice la misma configuración de conexión para todos los procedimientos almacenados
• Reduzca al mínimo la utilización de procedimientos almacenados temporales
• No elimine nunca directamente las entradas de Syscomments
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Ejecución de procedimientos almacenados• Ejecución de un procedimiento almacenado
por separado
• Ejecución de un procedimiento almacenado en una instrucción INSERT
EXEC OverdueOrders
INSERT INTO CustomersEXEC EmployeeCustomer
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Alteración y eliminación de procedimientos almacenados
• Modificación de procedimientos almacenados
– Incluya cualquiera de las opciones en ALTER PROCEDURE
– No afecta a los procedimientos almacenados anidados
• Eliminación de procedimientos almacenados
– Ejecute el procedimiento almacenado sp_depends para determinar si los objetos dependen
del procedimiento almacenado
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Alteración y eliminación de procedimientos almacenados
• Modificación de procedimientos almacenados– Eliminación de procedimientos almacenados– Ejecute el procedimiento almacenado sp_depends
para determinar si los objetos dependen del procedimiento almacenado
USE NorthwindGOALTER PROC dbo.OverdueOrdersASSELECT CONVERT(char(8), RequiredDate, 1) RequiredDate, CONVERT(char(8), OrderDate, 1) OrderDate, OrderID, CustomerID, EmployeeID FROM OrdersWHERE RequiredDate < GETDATE() AND ShippedDate IS NullORDER BY RequiredDateGO
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Práctica: Creación de Procedimientos Almacenados
SQL Server 2000
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Utilización de parámetros en los procedimientos almacenados
• Utilización de parámetros de entrada• Ejecución de procedimientos almacenados con
parámetros de entrada• Devolución de valores mediante parámetros de
salida• Volver a compilar explícitamente procedimientos
almacenados
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Utilización de parámetros de entrada• Valide primero todos los valores de los parámetros
de entrada• Proporcione los valores predeterminados
apropiados e incluya las comprobaciones de NullCREATE PROCEDURE dbo.[Year to Year Sales] @BeginningDate DateTime, @EndingDate DateTime ASIF @BeginningDate IS NULL OR @EndingDate IS NULLBEGIN RAISERROR('NULL values are not allowed', 14, 1) RETURNENDSELECT O.ShippedDate, O.OrderID, OS.Subtotal, DATENAME(yy,ShippedDate) AS YearFROM ORDERS O INNER JOIN [Order Subtotals] OS ON O.OrderID = OS.OrderIDWHERE O.ShippedDate BETWEEN @BeginningDate AND @EndingDateGO
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Ejecución de procedimientos almacenados con parámetros de entrada
• Paso de valores por el nombre del parámetro
EXEC AddCustomer @CustomerID = 'ALFKI', @ContactName = 'Maria Anders', @CompanyName = 'Alfreds Futterkiste', @ContactTitle = 'Sales Representative', @Address = 'Obere Str. 57', @City = 'Berlin', @PostalCode = '12209', @Country = 'Germany', @Phone = '030-0074321'
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Ejecución de procedimientos almacenados con parámetros de entrada
• Paso de valores por posición
EXEC AddCustomer 'ALFKI2', 'Alfreds Futterkiste', 'Maria Anders', 'Sales Representative', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany', '030-0074321'
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Devolución de valores mediante parámetros de salida
CREATE PROCEDURE dbo.mathtutor@m1 smallint,
@m2 smallint,@result smallint OUTPUT
AS SET @result = @m1* @m2GODECLARE @answer smallintEXECUTE mathtutor 5, 6, @answer OUTPUTSELECT 'The result is: ' , @answer
The result is: 30Resultados del procedimientoalmacenado
Ejecución del procedimiento almacenado
Creación del procedimiento almacenado
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Volver a compilar explícitamente procedimientos almacenados
• Volver a compilar cuando– El procedimiento almacenado devuelve
conjuntos de resultados que varían considerablemente
– Se agrega un nuevo índice a una tabla subyacente
– El valor del parámetro es atípico
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Volver a compilar explícitamente procedimientos almacenados
• Volver a compilar mediante– CREATE PROCEDURE [WITH RECOMPILE]– EXECUTE [WITH RECOMPILE] – sp_recompile
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Ejecución de procedimientos almacenados extendidos
• Se programan con la API Servicios abiertos de datos• Pueden incluir características de C y C++• Pueden contener múltiples funciones• Se pueden llamar desde un cliente o desde SQL Server• Se pueden agregar sólo a la base de datos master
EXEC master..xp_cmdshell 'dir c:\'
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Control de mensajes de error• La instrucción RETURN sale incondicionalmente de
una consulta o procedimiento • sp_addmessage crea mensajes de error
personalizados• @@error contiene el número de error de la
instrucción ejecutada más recientemente
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Control de mensajes de error• Instrucción RAISERROR
– Devuelve un mensaje de error del sistema definido por el usuario
– Establece un indicador del sistema para registrar un error
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Consideraciones acerca del rendimiento
• Monitor de sistema de Windows 2000– Objeto: SQL Server: Administrador de caché– Objeto: Estadísticas de SQL
• Analizador de SQL– Puede supervisar eventos– Puede probar cada instrucción en un
procedimiento almacenado
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Procedimientos recomendados
Compruebe los parámetros de entrada
Diseñe cada procedimiento almacenado para realizar una únicatarea
Valide los datos antes de comenzar las transacciones
Implementación de procedimientos almacenados
Utilice la misma configuración de conexión para todos losprocedimientos almacenados
Use WITH ENCRYPTION para ocultar texto de los procedimientosalmacenados
Implementación de procedimientos almacenados
Práctica
SQL Server 2000
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Repaso• Introducción a los procedimientos almacenados• Creación, ejecución, modificación y eliminación de
procedimientos almacenados• Utilización de parámetros en los procedimientos
almacenados• Ejecución de procedimientos almacenados
extendidos• Control de mensajes de error• Consideraciones acerca del rendimiento
Implementación de procedimientos almacenadosImplementación de procedimientos almacenados
Implementación de funciones definidas por el usuario
Introducción• ¿Qué es una función definida por el usuario?• Definición de funciones definidas por el usuario• Ejemplos de funciones definidas por el usuario
Implementación de funciones definidas por el usuario
¿Qué es una función definida por el usuario?• Funciones escalares
– Similar a una función integrada• Funciones con valores de tabla de varias
instrucciones– Contenido como un procedimiento almacenado– Se hace referencia como una vista
• Funciones con valores de tabla en línea– Similar a una vista con parámetros– Devuelve una tabla como el resultado de una
instrucción SELECT única
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Definición de funciones definidas por el usuario• Creación de una función definida por el usuario• Creación de una función con enlace a esquema• Establecimiento de permisos para funciones
definidas por el usuario• Modificación y eliminación de funciones definidas
por el usuario
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Creación de una función definida por el usuario
USE NorthwindGOCREATE FUNCTION fn_NewRegion (@myinput nvarchar(30)) RETURNS nvarchar(30)BEGIN IF @myinput IS NULL SET @myinput = 'Not Applicable' RETURN @myinputEND
Creación de una función
Restricciones de las funciones
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Creación de una función con enlace a esquema• Todas las funciones definidas por el usuario y las
vistas a las que la función hace referencia también están enlazadas a esquema
• No se utiliza un nombre de dos partes para los objetos a los que hace referencia
• La función y los objetos se encuentran todos en la misma base de datos
• Tiene permiso de referencia en los objetos requeridos
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Establecimiento de permisos para funciones definidas por el usuario
• Necesita permiso para CREATE FUNCTION• Necesita permiso para EXECUTE• Necesita permiso para REFERENCE en las tablas,
vistas o funciones citadas• Debe ser propietario de la función para utilizar la
instrucción CREATE o ALTER TABLE
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Modificación y eliminación de funciones definidas por el usuario
• Modificación de funciones
– Conserva los permisos asignados– Hace que la definición de la función nueva
reemplace a la definición existente• Eliminación de funciones
ALTER FUNCTION dbo.fn_NewRegion <New function content>
DROP FUNCTION dbo.fn_NewRegion
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Ejemplos de funciones definidas por el usuario• Uso de una función escalar definida por el
usuario• Ejemplo de una función escalar definida por el
usuario• Uso de una función con valores de tabla de
varias instrucciones
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Ejemplos de funciones definidas por el usuario
• Ejemplo de una función con valores de tabla de varias instrucciones
• Uso de una función con valores de tabla en línea
• Ejemplo de una función con valores de tabla en línea
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Uso de una función escalar definida por el usuario
• La cláusula RETURNS especifica el tipo de datos• La función se define en un bloque BEGIN y END• El tipo de devolución puede ser cualquier tipo
de datos, excepto text, ntext, image, cursor o timestamp
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Ejemplo de una función escalar definida por el usuario
USE NorthwindGOCREATE FUNCTION fn_DateFormat
(@indate datetime, @separator char(1))RETURNS Nchar(20)ASBEGIN RETURN CONVERT(Nvarchar(20), datepart(mm,@indate)) + @separator + CONVERT(Nvarchar(20), datepart(dd, @indate)) + @separator + CONVERT(Nvarchar(20), datepart(yy, @indate))END
SELECT dbo.fn_DateFormat(GETDATE(), ':')
Creación de la función
Llamada a la función
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Uso de una función con valores de tabla de varias instrucciones
• BEGIN y END contienen múltiples instrucciones
• La cláusula RETURNS especifica el tipo de datos de la tabla
• La cláusula RETURNS da nombre y define la tabla
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Ejemplo de una función con valores de tabla de varias instrucciones
• Creación de la función
• Llamada a la función
USE NorthwindGOCREATE FUNCTION fn_Employees (@length nvarchar(9))RETURNS @fn_Employees TABLE (EmployeeID int PRIMARY KEY NOT NULL, [Employee Name] nvarchar(61) NOT NULL)ASBEGIN IF @length = 'ShortName' INSERT @fn_Employees SELECT EmployeeID, LastName FROM Employees ELSE IF @length = 'LongName' INSERT @fn_Employees SELECT EmployeeID, (FirstName + ' ' + LastName) FROM EmployeesRETURNEND
SELECT * FROM dbo.fn_Employees('LongName')- o bien -SELECT * FROM dbo.fn_Employees('ShortName')
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Uso de una función con valores de tabla en línea• El contenido de la función es una instrucción
SELECT• No utilice BEGIN y END• RETURN especifica table como el tipo de datos• El formato se define por el conjunto de resultados
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Ejemplo de una función con valores de tabla en línea Creación de la función
Llamada a la función mediante un parámetro
USE NorthwindGOCREATE FUNCTION fn_CustomerNamesInRegion ( @RegionParameter nvarchar(30) )RETURNS tableASRETURN ( SELECT CustomerID, CompanyName FROM Northwind.dbo.Customers WHERE Region = @RegionParameter )
SELECT * FROM fn_CustomerNamesInRegion(N'WA')
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Procedimientos recomendadosUtilice funciones escalares complejas con conjuntos deresultados pequeños
Utilice funciones con varias instrucciones en lugar deprocedimientos almacenados que devuelven tablas
Utilice funciones en línea para crear vistas parametrizadas
Implementación de funciones definidas por el usuario
Utilice funciones en línea para filtrar vistas indizadas
Implementación de funciones definidas por el usuario
Práctica
SQL Server 2000
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Repaso• ¿Qué es una función definida por el usuario?• Definición de funciones definidas por el usuario• Ejemplos de funciones definidas por el usuario
Implementación de funciones definidas por el usuarioImplementación de funciones definidas por el usuario
Implementación de desencadenadores (triggers)
Introducción• Introducción a los desencadenadores• Definición de desencadenadores• Funcionamiento de los desencadenadores• Ejemplos de desencadenadores• Consideraciones acerca del rendimiento
Implementación de desencadenadores (triggers)
Introducción a los desencadenadores• ¿Qué es un desencadenador?• Uso de los desencadenadores• Consideraciones acerca del uso de
desencadenadores
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
¿Qué es un desencadenador?• Asociación a una tabla• Invocación automática• Imposibilidad de llamada directa• Identificación con una transacción
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Uso de los desencadenadores• Cambios en cascada en tablas relacionadas de una
base de datos• Exigir una integridad de datos más compleja que
una restricción CHECK• Definición de mensajes de error personalizados• Mantenimiento de datos no normalizados• Comparación del estado de los datos antes y
después de su modificación
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Consideraciones acerca del uso de desencadenadores• Los propietarios de las tablas pueden designar
el primer y último desencadenador que se debe activar
• Debe tener permiso para ejecutar todas las instrucciones definidas en los desencadenadores
• Los propietarios de tablas no pueden crear desencadenadores AFTER en vistas o en tablas temporales
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Consideraciones acerca del uso de desencadenadores
• Los desencadenadores son reactivos, mientras que las restricciones son proactivas
• Las restricciones se comprueban antes• Las tablas pueden tener varios
desencadenadores para cualquier acción
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Definición de desencadenadores• Creación de desencadenadores• Alteración y eliminación de desencadenadores
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Creación de desencadenadores• Necesidad de los permisos adecuados• Imposibilidad de incluir determinadas
instrucciones
Use NorthwindGOCREATE TRIGGER Empl_Delete ON EmployeesFOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 1BEGIN RAISERROR( 'You cannot delete more than one employee at a time.', 16, 1) ROLLBACK TRANSACTIONEND
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Alteración y eliminación de desencadenadores• Alteración de un desencadenador
– Cambios en la definición sin quitar el desencadenador
– Deshabilitación o habilitación de un desencadenador
• Eliminación de un desencadenador
USE NorthwindGOALTER TRIGGER Empl_Delete ON EmployeesFOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 6BEGIN RAISERROR( 'You cannot delete more than six employees at a time.', 16, 1) ROLLBACK TRANSACTIONEND
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Funcionamiento de los desencadenadores
• Funcionamiento de un desencadenador INSERT• Funcionamiento de un desencadenador DELETE• Funcionamiento de un desencadenador UPDATE• Funcionamiento de un desencadenador INSTEAD OF• Funcionamiento de los desencadenadores anidados• Desencadenadores recursivos
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Funcionamiento de un desencadenador INSERTInstrucción INSERT en tabla con desencadenador INSERT INSERT [Order Details] VALUES
(10525, 2, 19.00, 5, 0.2)
Order Details
OrderID
105221052310524
ProductID
10417
UnitPrice
31.009.65
30.00
Quantity
79
24
Discount
0.20.150.0
19.002 0.210523 5
Instrucción INSERT registrada
inserted
10523 2 19.00 5 0.2
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Funcionamiento de un desencadenador INSERTInstrucción INSERT en tabla con desencadenador INSERT INSERT [Order Details] VALUES
(10525, 2, 19.00, 5, 0.2)
Order Details
OrderID
105221052310524
ProductID
10417
UnitPrice
31.009.65
30.00
Quantity
79
24
Discount
0.20.150.0
19.002 0.210523 5
Instrucción INSERT registrada
inserted
10523 2 19.00 5 0.2
Ejecución de acciones TRIGGER
Order DetailsOrderID
105221052310524
ProductID
10417
UnitPrice
31.009.65
30.00
Quantity
79
24
Discount
0.20.150.0
5 19.002 0.210523
Trigger Code:USE NorthwindCREATE TRIGGER OrdDet_InsertON [Order Details]FOR INSERTASUPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity)FROM Products AS P INNER JOIN Inserted AS ION P.ProductID = I.ProductID
UPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity)FROM Products AS P INNER JOIN Inserted AS ION P.ProductID = I.ProductID
15106520
1234
ProductsProductID UnitsInStock … …
2 15
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Funcionamiento de un desencadenador INSERTInstrucción INSERT en tabla con desencadenador INSERT
Instrucción INSERT en una tabla con undesencadenador INSERT
Instrucción INSERT registrada
Acción del desencadenador ejecutada
1
2
3
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Funcionamiento de un desencadenador DELETEInstrucción DELETE en tabla con desencadenador DELETE
Deleted
4 Dairy Products Cheeses 0x15…
Instrucción DELETE registrada
CategoriesCategoryID
123
CategoryName
BeveragesCondimentsConfections
Description
Soft drinks, coffees…Sweet and savory …Desserts, candies, …
Picture
0x15…0x15…0x15… 0x15…CheesesDairy Products4
DELETE CategoriesWHERE CategoryID = 4
DELETE CategoriesWHERE CategoryID = 4USE NorthwindCREATE TRIGGER Category_Delete
ON CategoriesFOR DELETE
ASUPDATE P SET Discontinued = 1FROM Products AS P INNER JOIN deleted AS dON P.CategoryID = d.CategoryID
USE NorthwindCREATE TRIGGER Category_Delete
ON CategoriesFOR DELETE
ASUPDATE P SET Discontinued = 1FROM Products AS P INNER JOIN deleted AS dON P.CategoryID = d.CategoryID
ProductsProductID Discontinued … …
1234
0000
Acción del desencadenador ejecutada
2 1
UPDATE P SET Discontinued = 1FROM Products AS P INNER JOIN deleted AS dON P.CategoryID = d.CategoryID
Instrucción DELETE en una tabla con un desencadenador DELETE
Instrucción DELETE registrada
Acción del desencadenador ejecutada
1
2
3
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Funcionamiento de un desencadenador UPDATEInstrucción UPDATE para una tabla con un desencadenador UPDATE definido
UPDATE EmployeesSET EmployeeID = 17WHERE EmployeeID = 2
UPDATE EmployeesSET EmployeeID = 17WHERE EmployeeID = 2
Instrucción UPDATE registrada como instrucciones INSERT y DELETE
EmployeesEmployeeID LastName FirstName Title HireDate
1234
DavolioBarrLeverlingPeacock
NancyAndrewJanetMargaret
Sales Rep.RSales Rep.Sales Rep.
~~~~~~~~~~~~
2 Fuller Andrew Vice Pres. ~~~
insertada
17 Fuller Andrew Vice Pres. ~~~
eliminada
2 Fuller Andrew Vice Pres. ~~~
Ejecución de acciones TRIGGERUSE NorthwindGOCREATE TRIGGER Employee_Update
ON EmployeesFOR UPDATE
ASIF UPDATE (EmployeeID)BEGIN TRANSACTION
RAISERROR ('Transaction cannot be processed.\***** Employee ID number cannot be modified.', 10, 1)ROLLBACK TRANSACTION
ASIF UPDATE (EmployeeID)BEGIN TRANSACTIONRAISERROR ('Transaction cannot be processed.\***** Employee ID number cannot be modified.', 10, 1)ROLLBACK TRANSACTION
No se puede procesar la transacción. ***** No se puede modificar el número de miembro No se puede procesar la transacción. ***** No se puede modificar el número de miembro
Employees
EmployeeID LastName FirstName Title HireDate
1234
1234
DavolioBarrLeverlingPeacock
DavolioBarrLeverlingPeacock
NancyAndrewJanetMargaret
NancyAndrewJanetMargaret
Sales Rep.RSales Rep.Sales Rep.
Sales Rep.RSales Rep.Sales Rep.
~~~~~~~~~~~~
~~~~~~~~~~~~
2 Fuller Andrew Vice Pres. ~~~
Instrucción UPDATE en una tabla con undesencadenador UPDATE
Instrucción UPDATE registrada como instruccionesINSERT y DELETE
Acción del desencadenador ejecutada
1
2
3
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Funcionamiento de los desencadenadores anidados
UnitsInStock + UnitsOnOrder es < ReorderLevel para ProductID 2
OrDe_Update
La realización de un pedido provoca la ejecución del desencadenador OrDe_Update
Se ejecuta la instrucción UPDATE en la tabla Products
InStock_UpdateProducts
ProductID UnitsInStock … …
1
34
15156520
Se ejecuta el desencadenador InStock_Update
Envía un mensaje
Order_DetailsOrderID
105221052310524
ProductID
10417
UnitPrice
31.009.65
30.00
Quantity
79
24
Discount
0.20.150.0
10525 19.002 0.25
2 15
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Desencadenadores recursivos• Activación recursiva de un desencadenador• Tipos de desencadenadores recursivos
– Recursividad directa, que se da cuando un desencadenador se ejecuta y realiza una acción que lo activa de nuevo
– Recursividad indirecta, que se da cuando un desencadenador se activa y realiza una acción que activa un desencadenador de otra tabla
• Conveniencia del uso de los desencadenadores recursivos
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Ejemplos de desencadenadores
• Exigir la integridad de los datos• Exigir reglas de empresa
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Exigir la integridad de los datosCREATE TRIGGER BackOrderList_Delete
ON Products FOR UPDATEASIF (SELECT BO.ProductID FROM BackOrders AS BO JOIN
Inserted AS I ON BO.ProductID = I.Product_ID) > 0
BEGINDELETE BO FROM BackOrders AS BO INNER JOIN Inserted AS I ON BO.ProductID = I.ProductID
END
ProductsProductID UnitsInStock … …
1
34
15106520
2 15 Actualizada
BackOrdersProductID UnitsOnOrder …
1123
151065
2 15 El desencadenador
elimina la fila
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Exigir reglas de empresa
Products
ProductID UnitsInStock … …
1234
15106520
Los productos con pedidos pendientes no se pueden eliminar
IF (Select Count (*) FROM [Order Details] INNER JOIN deleted ON [Order Details].ProductID = deleted.ProductID ) > 0ROLLBACK TRANSACTION
La instrucción DELETE se ejecuta en la tabla Product
El código del desencadenadorcomprueba la tabla Order Details
Order Details
OrderID
10522105231052410525
ProductID
102417
UnitPrice
31.0019.009.65
30.00
Quantity
79
24
Discount
0.20.150.0
9
'No puede procesarse la transacción''Este producto tiene historial de pedidos'
Se deshacela transacción
2 0
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Consideraciones acerca del rendimiento• Los desencadenadores trabajan rápidamente porque
las tablas insertadas y eliminadas están en la caché• El tiempo de ejecución está determinado por:
– Número de tablas a las que se hace referencia
– Número de filas afectadas• Las acciones contenidas en un desencadenador
forman parte de una transacción
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Procedimientos recomendados
Utilice desencadenadores sólo cuando sea necesario
Procure que las instrucciones de la definición de losdesencadenadores sean tan sencillas como sea posible
Incluya instrucciones de comprobación de terminación de larecursividad en las definiciones de los desencadenadoresrecursivos
Reduzca al mínimo el uso de instrucciones ROLLBACK enlos desencadenadores
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Práctica
SQL Server 2000
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Repaso• Introducción a los desencadenadores• Definición de desencadenadores• Funcionamiento de los desencadenadores• Ejemplos de desencadenadores• Consideraciones acerca del rendimiento
Implementación de desencadenadores (triggers)Implementación de desencadenadores (triggers)
Optimización del rendimiento de las consultas
Introducción• Introducción al optimizador de consultas• Obtención de información del plan de ejecución• Uso de un índice para abarcar una consulta• Estrategias de indización• Suplantación del optimizador de consultas
Optimización de las consultas
Introducción al optimizador de consultas• Función del optimizador de consultas• Cómo utiliza el optimizador de consultas la
optimización basada en el costo• Cómo funciona el optimizador de consultas• Fases de la optimización de consultas• Almacenamiento en caché del plan de ejecución• Establecimiento de un límite de costo
Optimización de las consultasOptimización de las consultas
Función del optimizador de consultas• Determina el plan de ejecución más eficaz
– Determinar la existencia de índices y evaluar su utilidad
– Determinar los índices o las columnas que se pueden utilizar
– Determinar cómo procesar las combinaciones– Uso de evaluación basada en costos de alternativas– Creación de estadísticas de columnas
• Utiliza información adicional• Produce un plan de ejecución
Optimización de las consultasOptimización de las consultas
Cómo utiliza el optimizador de consultas la optimización basada en el costo
• Limita el número de planes de optimización– El costo se estima en términos de E/S y costo de
CPU• Determina el tiempo de procesamiento de las
consultas– Utilice operadores físicos y secuencia de
operaciones– Utilice procesos paralelos y en serie
Optimización de las consultasOptimización de las consultas
Cómo funciona el optimizador de consultas
Proceso de análisis
Proceso de estandarización
Optimización de la consulta
Compilación
Rutinas de acceso abases de datos
Transact-SQL
Conjuntode
resultados
Optimización de las consultasOptimización de las consultas
Fases de la optimización de consultas• Análisis de la consulta
– Identifica los criterios de búsqueda y combinación de la consulta
• Selección de índices– Determina si existe algún índice– Produce una valoración de la utilidad del índice o
índices• Selección de la combinación
– Evalúa qué estrategia de combinación se va a utilizar
Optimización de las consultasOptimización de las consultas
Almacenamiento en caché del plan de ejecución• Almacenamiento de un plan de ejecución en la
memoria– Una copia para todas las ejecuciones en serie– Otra copia para todas las ejecuciones en paralelo
• Uso de un contexto de ejecución– Se vuelve a utilizar un plan de ejecución
existente, si lo hay
– Se genera un plan de ejecución nuevo, si no existe uno
Optimización de las consultasOptimización de las consultas
Almacenamiento en caché del plan de ejecución• Recompilación de planes de ejecución
– Los cambios en la base de datos pueden hacer que el plan de ejecución sea ineficaz o deje de ser válido
Optimización de las consultasOptimización de las consultas
Establecimiento de un límite de costo• Especificación de un límite máximo
– Utilice el regulador de consultas para evitar que se ejecuten consultas que tarden mucho tiempo y usen muchos recursos del sistema
• Especificación de límites de conexión– Use el procedimiento almacenado sp_configure
Optimización de las consultasOptimización de las consultas
Establecimiento de un límite de costo• Especificación de límites de conexión
– Ejecute la instrucción SET QUERY_GOVERNOR_COST_LIMIT
– Especifique 0 para desactivar el regulador de consultas
Optimización de las consultasOptimización de las consultas
Obtención de información del plan de ejecución• Presentación de los resultados de las instrucciones
STATISTICS• Presentación de los resultados de SHOWPLAN_ALL y
SHOWPLAN_TEXT• Presentación gráfica del plan de ejecución
Optimización de las consultasOptimización de las consultas
Presentación de los resultados de las instrucciones STATISTICS
Instrucción Ejemplo de salida
STATISTICSTIME
STATISTICSPROFILE
STATISTICS IO
SQL Server Execution Times:CPU time = 0 ms, elapsed time = 2 ms.
Rows Executes StmtText StmtId…-----------------------------------------------47 1 SELECT * FROM [charge] 16 WHERE (([charge_amt]>=@1) . . .
Table 'member'. Scan count 1,logical reads 23, physical reads 0, read-ahead reads 0.
Optimización de las consultasOptimización de las consultas
Presentación de los resultados de SHOWPLAN_ALL y SHOWPLAN_TEXT• Estructura de los resultados de la instrucción
SHOWPLAN– Devuelven información en forma de un
conjunto de filas– Forman un árbol jerárquico– Representan los pasos realizados por el
optimizador de consultas– Muestran un cálculo de cómo se optimizó una
consulta, no el plan de ejecución real
Optimización de las consultasOptimización de las consultas
Presentación de los resultados de SHOWPLAN_ALL y SHOWPLAN_TEXT• Detalles de los pasos de ejecución• Diferencia entre los resultados de
SHOWPLAN_TEXT y SHOWPLAN_ALL
Optimización de las consultasOptimización de las consultas
Presentación gráfica del plan de ejecución• Elementos del plan de ejecución gráfico• Lectura de los resultados del plan de ejecución
gráfico• Uso de la operación de consulta de marcadores
Optimización de las consultasOptimización de las consultas
Elementos del plan de ejecución gráfico• Los pasos son unidades de trabajo que se utilizan
para procesar una consulta• La secuencia de pasos es el orden en que se procesan
los pasos• Los operadores lógicos describen la operación
algebraica relacional que se utiliza para procesar una instrucción
• Los operadores físicos describen el algoritmo de implementación física que se utiliza para procesar una instrucción
Optimización de las consultasOptimización de las consultas
Lectura de los resultados del plan de ejecución gráficoPlan de consulta
SELECTCosto: 0%
Consulta de marcadoresCosto: 8%
Raíz decombinación hash…
Costo: 28%
Member.corp_noCosto: 9%
Member.fnameCosto: 10%
FiltroCosto: 0%
Secuencia de pasosSecuencia de pasos
Búsqueda en índiceRecorre un intervalo de filas en particular desde un índice no agrupado.
Operación física:Operación lógica:Cuenta de filas:Tamaño estimado de fila:Costo de E/S:Costo de CPU:Número de ejecuciones:Costo:Costo del subárbol:
Búsqueda en índiceBúsqueda en índice
41424
0,007060,000605
1,00,007675(6%)
0,00767
Argumento:OBJECT: ([credit].[dbo].[member].[fname]), SEEK: ([member],[firstname] >=‘Rb’ AND [member],[firstname] <‘T’) ORDERED
Optimización de las consultasOptimización de las consultas
Uso de la operación de consulta de marcadores• Análisis del plan de consultas
– Normalmente se utiliza después de haber procesado todos los pasos
• Recuperación de filas– Identificadores de fila– Claves de agrupación
Optimización de las consultasOptimización de las consultas
Uso de la operación de consulta de marcadores• Observación de los detalles
– Se utiliza una etiqueta de marcador para buscar la fila
• Determinación de cuándo se utiliza el operador de consulta de marcadores– Las consultas contienen la cláusula IN o el
operador OR
Optimización de las consultasOptimización de las consultas
Uso de un índice para abarcar una consulta• Introducción a los índices que abarcan consultas• Búsqueda de datos mediante índices que abarcan
consultas• Identificación de si se puede utilizar un índice para
abarcar una consulta• Determinación de si se utiliza un índice para abarcar
una consulta• Instrucciones para la creación de índices que abarcan
consultas
Optimización de las consultasOptimización de las consultas
Introducción a los índices que abarcan consultas• Sólo los índices no agrupados pueden abarcar
consultas• Los índices deben contener todas las columnas a las
que se hace referencia en la consulta• No es necesario el acceso a las páginas de datos• Las vistas indizadas pueden agregar datos anteriores• Los índices que abarcan consultas recuperan los
datos rápidamente
Optimización de las consultasOptimización de las consultas
Búsqueda de datos mediante índices que abarcan consultas
• Ejemplo de exploración de una sola página• Ejemplo de exploración de recorrido parcial• Ejemplo de exploración de recorrido completo
Optimización de las consultasOptimización de las consultas
Ejemplo de exploración de una sola páginaSELECT lastname, firstnameFROM memberWHERE lastname = 'Hall'
Páginas de índice
No situadas enel nivel de hoja
Nivel de hoja(valor de clave)
AkhtarBarrBarrBormBuhl
Sarah…………
GanioHallHallHartJonesJones
JonDonDonSherriAmyBeverly
Hall DonLangMartinMartinMartinMoris
Eric…………
…
Páginas de datos
… …
AkhtarLang……
SarahEric……
Akhtar…Ganio…
Sarah…Jon…
Lang………
Eric………
Optimización de las consultasOptimización de las consultas
Ejemplo de exploración de recorrido parcialUSE creditSELECT lastname, firstname FROM memberWHERE lastname BETWEEN 'Funk' AND 'Lang'
Páginas de índice
No situadas enel nivel de hoja
Nivel de hoja(valor de clave)
AkhtarBarrBarrBormBuhl
……………
GanioHallHart
JonesJones
……………
MorganNashNayOta
Rudd
……………
ChaiConConCoxDale
……………
DunnDunnFineFortFunk
……………
JordanKimKim
KochKoch
……………
LangMartinMartinMartinMoris
……………
SmithSmithSmithSmithSmith
……………
Páginas de datos
AkhtarChaiDunnGanio
…………
JordanLangMorganSmith
…………
Akhtar
Jordan
…
…
…
…
Optimización de las consultas
Ejemplo de exploración de recorrido completoUSE creditSELECT lastname, firstnameFROM member
Páginas de índice
No situadas enel nivel de hoja
Nivel de hoja(valor de clave)
AkhtarBarrBarrBormBuhl
……………
GanioHallHart
JonesJones
……………
MorganNashNayOta
Rudd
……………
MartinSmith
…
AkhtarGanio
…
Akhtar…
Martin
ChaiConConCoxDale
……………
DunnDunnFineFortFunk
……………
JordanKimKim
KochKoch
……………
LangMartinMartinMartinMoris
……………
SmithSmithSmithSmithSmith
……………
…
Páginas de datos
Optimización de las consultasOptimización de las consultas
Identificación de si se puede utilizar un índice para abarcar una consulta
• Todos los datos necesarios deben estar en el índice• Un índice compuesto es útil aunque no se haga
referencia a la primera columna• No es necesaria una cláusula WHERE
Optimización de las consultasOptimización de las consultas
Identificación de si se puede utilizar un índice para abarcar una consulta
• Se puede utilizar un índice no agrupado si requiere menos E/S que un índice agrupado que contenga una columna a la que se hace referencia en la cláusula WHERE
• Los índices se pueden combinar para abarcar consultas
Optimización de las consultasOptimización de las consultas
Determinación de si se utiliza un índice para abarcar una consulta• Observación de los resultados del plan de
ejecución – Se muestra la frase “Comprobar un índice no
agrupado, en su totalidad o sólo un intervalo”• Comparación de E/S
– Índice no agrupado• Número total de niveles no situados en el
nivel de hoja
Optimización de las consultasOptimización de las consultas
Determinación de si se utiliza un índice para abarcar una consulta• Comparación de E/S
– Índice no agrupado• Número total de páginas que componen el
nivel de hoja• Número total de filas por página del nivel de
hoja• Número total de filas por página de datos
– Número total de páginas que componen la tabla
Optimización de las consultasOptimización de las consultas
Instrucciones para la creación de índices que abarcan consultas
• Agregar columnas a los índices• Reduzca el tamaño de la clave del índice• Mantenga una proporción de tamaño entre la fila
y la clave
Optimización de las consultasOptimización de las consultas
Estrategias de indización• Evaluación de la E/S para las consultas que tienen
acceso a un intervalo de datos• Indización para varias consultas• Instrucciones para la creación de índices
Optimización de las consultasOptimización de las consultas
Método de acceso
Recorrido de tabla
Índice agrupado en la columna charge_amt
Índice no agrupado en la columna charge_amt
Índice compuesto en las columnas charge_amt y charge_no
Página de E/S
10.417
1042
100.273
273
Evaluación de la E/S para las consultas que tienen acceso a un intervalo de datos
SELECT charge_noFROM chargeWHERE charge_amt BETWEEN 20 AND 30
Optimización de las consultasOptimización de las consultas
Indización para varias consultas
USE creditSELECT charge_no, charge_dt, charge_amtFROM chargeWHERE statement_no = 19000 AND member_no = 3852
USE creditSELECT member_no, charge_no, charge_amtFROM chargeWHERE charge_dt between '07/30/1999'AND '07/31/1999' AND member_no = 9331
Ejemplo 1
Ejemplo 2
Optimización de las consultasOptimización de las consultas
Instrucciones para la creación de índices• Determine las prioridades de todas las
consultas• Determine la selectividad de cada parte de la
cláusula WHERE de cada consulta• Determine si es conveniente crear un índice• Identifique las columnas que se deben indizar• Determine el mejor orden para las columnas
de los índices compuestos• Determine los demás índices que sean
necesarios• Pruebe el rendimiento de las consultas
Optimización de las consultasOptimización de las consultas
Suplantación del optimizador de consultas• Determinación de cuándo se debe suplantar el
optimizador de consultas• Uso de las sugerencias y la instrucción SET
FORCEPLAN • Comprobación del rendimiento de las consultas
después de suplantar el optimizador de consultas
Optimización de las consultasOptimización de las consultas
Determinación de cuándo se debe suplantar el optimizador de consultas
• Limitar las sugerencias de optimizador• Antes de suplantar el optimizador de consultas debe
explorar las demás alternativas mediante:– Actualización de estadísticas– Recompilación de procedimientos almacenados– Revisión de las consultas o argumentos de búsqueda– Evaluación de la posibilidad de crear índices
diferentes
Optimización de las consultasOptimización de las consultas
Uso de las sugerencias y la instrucción SET FORCEPLAN
• Sugerencias de tabla• Sugerencias de combinación• Sugerencias de consulta• Instrucción SET FORCEPLAN
Optimización de las consultasOptimización de las consultas
Comprobación del rendimiento de las consultas después de suplantar el optimizador de consultas
• Compruebe que mejora el rendimiento• Documente las razones para utilizar sugerencias de
optimizador• Vuelva a probar las consultas regularmente
Optimización de las consultasOptimización de las consultas
Procedimientos recomendadosUtilice el regulador de consultas para evitar que se ejecutenconsultas que tarden mucho tiempo y usen muchos recursosdel sistema
Examine y conozca totalmente los datos y cómo se tendrá accesoa ellos en las consultas
Cree índices que resuelvan las consultas utilizadas con másfrecuencia
Establezca estrategias de indización para consultas individualesy múltiples
Evite la suplantación del optimizador de consultas
Optimización de las consultasOptimización de las consultas
Práctica
SQL Server 2000
Optimización de las consultasOptimización de las consultas
Repaso• Introducción al optimizador de consultas• Obtención de información del plan de ejecución• Uso de un índice para abarcar una consulta• Estrategias de indización• Suplantación del optimizador de consultas
Optimización de las consultasOptimización de las consultas
Análisis de consultas
Introducción• Consultas que utilizan el operador AND• Consultas que utilizan el operador OR• Consultas que utilizan operaciones de combinación
Análisis de consultas
Consultas que utilizan el operador AND• Procesamiento del operador AND
– Devuelve las filas que cumplen todas las condiciones de cada criterio especificado en la cláusula WHERE
– Limita de forma progresiva el número de filas devueltas con cada condición de búsqueda adicional
– Puede utilizar un índice por cada condición de búsqueda de la cláusula WHERE
Análisis de consultasAnálisis de consultas
Consultas que utilizan el operador AND• Directrices de indización y consideraciones de
rendimiento– Definir un índice en un criterio de búsqueda
altamente selectivo– Evaluar el rendimiento entre crear varios
índices de una columna y un índice compuesto
Análisis de consultasAnálisis de consultas
Consultas que utilizan el operador OR• Devuelve las filas que cumplen cualquier
condición de cada criterio especificado en la cláusula WHERE
• Aumenta de forma progresiva el número de filas devueltas con cada condición de búsqueda adicional
• Puede utilizar un índice o índices diferentes para cada parte del operador OR
Análisis de consultasAnálisis de consultas
Consultas que utilizan el operador OR• Siempre realiza un recorrido de tabla o de
índice agrupado si una columna a la que se hace referencia en el operador OR no tiene un índice o si éste no es útil
• Puede utilizar varios índices
Análisis de consultasAnálisis de consultas
Práctica: Análisis de consultas que utilizan los operadores AND y OR
SQL Server 2000
Análisis de consultasAnálisis de consultas
Cons. MarcadoresComb. hash/inter…
Filtro
member.fname
Filtro
member.corp_no
Select
Análisis de consultasAnálisis de consultas
Cons. MarcadoresEq. comb. hash…Filtro
member.fnamemember.corp_no
Select
Raíz comb. hash…
member.mem_no
Análisis de consultasAnálisis de consultas
Cons. Marcadoresmember.mbr_mem... SELECT
Análisis de consultasAnálisis de consultas
Análisis de consultas
SELECTCosto: 1%
Recorrido tablaCosto: 99%
Análisis de consultas
Consultas que utilizan oper. de combinación• Selectividad y densidad de una cláusula JOIN• Cómo se procesan las combinaciones• Cómo se procesan las combinaciones de bucle
anidado• Presentación multimedia: Cómo se procesan las
combinaciones de mezcla• Consideraciones acerca del uso de combinaciones
de mezcla• Cómo se procesan las combinaciones hash
Análisis de consultasAnálisis de consultas
Selectividad y densidad de una cláusula JOIN
• Selectividad de una cláusula JOIN– Si las estadísticas están
disponibles, se basa en la densidad del índice
– Si las estadísticas no están disponibles, se basa en el número de consideraciones
Selectividad
Po
rce
nta
je d
e f
ilas
de
vue
ltas
Análisis de consultasAnálisis de consultas
Selectividad y densidad de una cláusula JOIN
• Densidad de una cláusula JOIN– Un índice con un gran
número de duplicados tiene alta densidad
– Un índice único tiene baja densidad Selectividad
Po
rce
nta
je d
e f
ilas
de
vue
ltas
Análisis de consultasAnálisis de consultas
Cómo se procesan las combinaciones
membermember_no …...5678...
.
.
.Chen...
ResultadoÍndiceno agrupado único Índice no agrupado
chargecharge_no...15259...16351...17673...
member_no...5678...5678...5678...
…
member_no
5678567856785678567856785678567856785678567856785678
charge_no
30257176731525916351327784889760611667947439676840861738790299607
…
(13 filas afectadas)
USE creditSELECT m.member_no, c.charge_no, c.charge_amt, c.statement_noFROM member AS m INNER JOIN charge AS cON m.member_no = c.member_noWHERE c.member_no = 5678
Análisis de consultasAnálisis de consultas
Cómo se procesan las combinaciones de bucle anidadoUSE creditSELECT m.member_no, c.charge_no, c.charge_amt, s.statement_noFROM member AS m INNER JOIN charge AS cON m.member_no = c.member_no INNER JOIN statement AS sON c.member_no = s.member_noWHERE m.member_no = 5678
Combina el resultado con las filas correspondientes de la tabla charge
Recupera las filas correspondientesde ambas tablas y las combina
1
2
chargecharge_no...15259...16351...17673...
member_no...5678...5678...5678...
statementstatement_no...567815678...
member_no...56785678...
…........
membermember_no …...5678...
.
.
.Chen...
Análisis de consultasAnálisis de consultas
Consideraciones acerca del uso de combinaciones de mezcla
• Requiere que las columnas combinadas estén ordenadas
• Evalúa valores ordenados– Utiliza un índice del árbol existente– Aprovecha las operaciones de ordenación– Realiza su propia operación de ordenación
Análisis de consultasAnálisis de consultas
Consideraciones acerca del uso de combinaciones de mezcla
• Consideraciones acerca del rendimiento
USE creditSELECT m.lastname, p.payment_amt FROM member AS m INNER JOIN payment AS p ON m.member_no = p.member_no WHERE p.payment_amt < 7000 AND m.firstname < 'Jak'
Análisis de consultasAnálisis de consultas
Cómo se procesan las combinaciones hash
Claves hash
xxx
zzz
yyy
nnn
.
.
.
member_no
1
.
.
.
9817
.
.
.
Resultado member_no lastname …
9817 DeBroux …
Bucket hash
.
.
.
Filas de datos
yyy
9817
.
.
.
DeBroux
…
10686
.
.
.
Zuvel
…
8342
.
.
.
Hjellen
…
xxx
Entrada de sonda Entrada de generación
Análisis de consultasAnálisis de consultas
Procedimientos recomendados
Definir un índice en una columna altamente selectiva
Asegurarse de que existen índices para todas las columnas a lasque se hace referencia en el operador OR
Minimice el uso de combinaciones hash
Análisis de consultasAnálisis de consultas
Repaso• Consultas que utilizan el operador AND• Consultas que utilizan el operador OR• Consultas que utilizan operaciones de combinación
Análisis de consultasAnálisis de consultas
Administración de transacciones y bloqueos
Introducción• Introducción a las transacciones y los bloqueos• Administración de las transacciones• Bloqueos en SQL Server• Administración de los bloqueos
Administración de transacciones y bloqueos
Introducción a las transacciones y los bloqueos• Las transacciones aseguran que varias
modificaciones a los datos se procesan juntas• Los bloqueos impiden los conflictos de
actualización– Las transacciones están serializadas– El bloqueo es automático– Los bloqueos permiten usar los datos al
mismo tiempo• Control de simultaneidad
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Administración de las transacciones• Presentación multimedia: Transacciones de
SQL Server• Recuperación de transacciones y puntos de
comprobación• Consideraciones para el uso de transacciones• Establecimiento de la opción de transacciones
implícitas• Restricciones en las transacciones definidas por el usuario
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Recuperación de transacciones y puntos de comprobación Recuperación de transacciones Acción requerida
Ninguna
Puntos de comprobación Fallo del sistema
1
2
3
4
5
Confirmar
Deshacer
Confirmar
Deshacer
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Consideraciones para el uso de transacciones• Recomendaciones para las transacciones
– Las transacciones deben ser lo más cortas posible
– Preste atención a ciertas instrucciones Transact-SQL
– Evite las transacciones que requieran la intervención del usuario
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Consideraciones para el uso de transacciones• Aspectos del anidamiento de transacciones
– Se pueden anidar transacciones, pero no se recomienda
– Utilice @@trancount para determinar el nivel de anidamiento
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Establecimiento de la opción de transacciones implícitas
• Una transacción se inicia automáticamente cuando se ejecutan determinadas instrucciones
• No se permiten transacciones anidadas• La transacción debe completarse explícitamente con
COMMIT o ROLLBACK TRANSACTION• De forma predeterminada, esta opción está
desactivadaSET IMPLICIT_TRANSACTIONS ON
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
ALTER DATABASE BACKUP LOG CREATE DATABASE DROP DATABASE
RECONFIGURE RESTORE DATABASE RESTORE LOG UPDATE STATISTICS
Restricciones en las transacciones definidas por el usuario• Ciertas instrucciones no se pueden incluir
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Bloqueos en SQL Server• Problemas de simultaneidad impedidos por
los bloqueos• Recursos que se pueden bloquear• Tipos de bloqueos• Compatibilidad de los bloqueos
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Problemas de simultaneidad impedidos por los bloqueos• Actualización perdida• Dependencia no confirmada (lectura no confirmada)• Análisis incoherente (lectura no repetible)• Lecturas fantasma
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Recursos que se pueden bloquear Elemento Descripción
RID Identificador de fila
ClaveBloqueo de fila dentro de un índice
Página
Extensión
Tabla
Página de datos o página de índice
Grupo de páginas
Tabla completa
Base dedatos
Base de datos completa
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Tipos de bloqueos• Bloqueos básicos
– Compartidos– Exclusivos
• Bloqueos para situaciones especiales– Intención– Actualización– Esquema– Actualización masiva
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Compatibilidad de los bloqueos• Los bloqueos pueden ser compatibles o incompatibles con
otros bloqueos• Ejemplos
– Los bloqueos compartidos son compatibles con todos los bloqueos excepto con los exclusivos
– Los bloqueos exclusivos no son compatibles con ningún otro bloqueo
– Los bloqueos de actualización son compatibles sólo con los bloqueos compartidos
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
• Opciones de bloqueo en el nivel de sesión• Arquitectura de bloqueos dinámicos• Opciones de bloqueo en el nivel de tabla• Interbloqueos• Presentación de información acerca de los bloqueos
Administración de los bloqueos
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Opciones de bloqueo en el nivel de sesión• Nivel de aislamiento de las transacciones
– READ COMMITTED (DEFAULT)– READ UNCOMMITTED– REPEATABLE READ– SERIALIZABLE
• Tiempo de espera para los bloqueos– Limita el tiempo de espera para un recurso
bloqueado– Use SET LOCK_TIMEOUT
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Arquitectura de bloqueos dinámicosBloqueodinámico
TablaPáginaFila
Costo
Granularidad
Costo de bloqueoCosto de simultaneidad
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Opciones de bloqueo en el nivel de tabla• Úselas con precaución• Puede especificar una o más opciones de bloqueo
para una tabla• Utilice la parte sugerenciasDeOptimizador de la
cláusula FROM de las instrucciones SELECT o UPDATE
• Suplanta las opciones de bloqueo en el nivel de sesión
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Interbloqueos• Cómo SQL Server termina los interbloqueos• Cómo minimizar los interbloqueos• Cómo personalizar la configuración de tiempo
de espera de bloqueo
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Presentación de información acerca de los bloqueos
• Ventana Actividad actual• Procedimiento almacenado de sistema sp_lock• Analizador de SQL• Monitor de sistema de Windows 2000• Información adicional
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Procedimientos recomendados
Mantenga las transacciones lo más cortas posible
Diseñe las transacciones para minimizar los interbloqueos
Utilice las opciones de bloqueo predeterminadas de SQL Server
Administración de transacciones y bloqueos
Tenga cuidado cuando utilice las opciones de bloqueo
Administración de transacciones y bloqueos
Práctica
SQL Server 2000
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos
Repaso• Introducción a las transacciones y los bloqueos• Administración de las transacciones• Bloqueos en SQL Server• Administración de los bloqueos
Administración de transacciones y bloqueosAdministración de transacciones y bloqueos