MCTS 70-433: SQL Server 2008 - Manejo de tablas y vistas

Aunque ahora con las herramientas de consultas, como SQL Server Management, se puede hacer cualquier operación con la base de datos, en distintos escenarios vamos a necesitar hacer estas operaciones por queries. Por ejemplo cuando estamos actualizando una versión de base de datos, a de desarrollo a pruebas, o a producción, el modo de hacer un backup y restaurarlo en el otro servidor puede servir al inicio, pero ¿y si la base de datos del otro servidor ya tiene data ingresada? existen varias estrategias para hacer esto, pero la más útil y recomendable por el trabajo que le dado ahora, ha sido generar un archivo actualización con los queries de Update, puede surgir problemas si te olvidas de poner algún query pero ese es otro tema.
Empecemos con el tema...
Tenemos muchas opciones para crear y modificar tablas, usando CREATE TABLE y ALTER TABLE. Al crear una tabla nosotros podemos crear columnas calculadas, que son columnas virtuales ya que no son almacenadas físicamente en las tablas, y si queremos almacenarlas físicamente debemos usar el keyword PERSISTED: Computed Columns. Con SQL Server 2005 se introdujo el concepto de Schemas, que entre una de las funciones principales permite categorizar y agrupar los permisos dentro de una base de datos, en este artículo se explica la necesidad de la creación de Schema en versiones anteriores: Understanding the Difference between Owners and Schemas in SQL Server, ver también CREATE SCHEMA. Recordar que la seguridad es importante siempre, y no después que hemos sido atacados, y siempre tener claro el concepto: "mínimos privilegios", es decir, si una base de datos tiene distintas aplicaciones que trabajan con ella, y por ejemplo hay una aplicación Web que trabaja con 6 tablas (dentro de un Schema propio), se debería tener un usuario sólo con el permiso a este grupo de tablas, es más si para todas tus modificaciones (CRUD) usas procedimientos almacenados, no deberías permitirle al usuario poder hacer INSERT, UPDATE, o DELETE directamente contra este grupo de tablas, sólo darle permiso de ejecución de los store procedures (CRUD), para modificar los permisos podemos usar GRANT, DENY, REVOKE.
Sobre las Vistas (Views) recuerdo que una mini-charla de rendimiento hace años, recomendaron no usarlas, y bueno hasta ahora no he necesitado hacer uso de las mismas. En este artículo podemos entender las vistas, y en este otro podemos ver que podemos hacer y que no, con las vistas: Diseñando e implementando Vistas. Hay algunas opciones al momento de crear vistas (CREATE VIEW), ENCRYPTION para cifrar el registro en sys.syscomments que contiene la consulta de la creación de la vista, CHECK OPTION y SCHEMABINDING, para mantener la consistencia cuando se van a modificar los datos en una vista.
El tema de índices, debería tener una o varias entradas sólo para hablar de ello. Y el tema de índices no muchas veces se entiende en el primer review, charla, u otra fuente de información, sobre todo si no esta bien explicados, pero si debemos saber que el buen uso de Indexes va a mejorar el rendimiento de los queries y aplicaciones que usen nuestra base de datos, debido a que los índices pueden reducir la cantidad de data que se debe leer para devolver un conjunto de registros. Una tabla o vista puede contener índices clustered, y nonclustered, además existen otras opciones en los tipos de índices disponibles en SQL Server: Filtered Index, Index with Included Columns, Unique Index, entre otros. Dentro de las opciones para optimizar índices, se encuentra el uso de la opción Fill Factor. Cada vez que se ejecuta un query el componente Query Optimizer, es el encargado de determinar la manera más eficiente de ejecutar un query, basado en los famosos planes de ejecución, es bueno conocer como el Query Optimizer, genera las estadísticas para escoger el plan de ejecución más eficiente, nosotros podemos crear estadísticas (CREATE STATISTICS) de las columnas y su comportamiento con los índices, para más información revisar el siguiente artículo: Statistics Used by the Query Optimizer in Microsoft SQL Server 2005. Con respecto al tema indexed views, revisar el siguiente artículo: Improving Performance with SQL Server 2005 Indexed Views.
Si ya pasaron el tema de índices, los constraints son más sencillos, son usados para forzar la integridad de la data, y si revisaron el tema de CREATE TABLE y ALTER TABLE los deben haber visto: PRIMARY KEY (revisar IDENTITY_INSERT para insertar valores predeterminados a un columna Identity), FOREIGN KEY (revisar las opciones de actualización de información), UNIQUE, CHECK.
Los tipos de datos estructurados, son los que veníamos usando desde las primeras versiones de SQL, con SQL Server 2005 se contaba con datos semi-estructurados (Xml). Ahora con SQL Server 2008 tenemos el tipo de datos espacial, y el tipo FileStream, y respecto a estos últimos hay mucha información en los blogs, e internet en general.
Partición de tablas e índices, siempre lo distribuido (cuando se hace bien) tiende a llevar a una alta disponibilidad y escalabilidad. La partición de tablas e índices, permite que la data sea dividida horizontalmente y puede ser colocada en más de un filegroup. Recordar que la partición de tablas e índices sólo esta disponible en las versiones SQL Server Enterprise y SQL Server Developer Edition. Antes de particionar las tablas o índices, debemos crear los siguientes objetos: Partition Function, para especificar como la tabla o los índices serán particionados y Partition Scheme mapea las particiones producidas por una Partition Function para asignarlas a los filefroups definidos. Existen tres diferentes tipos de operaciones con particiones: MERGE, SPLIT, y SWITCH. Por cierto también podemos hacer partición de las vistas.
P.D.: Algunas de las mejoras del SQL Server Management Studio (2008), es el IntellSense para algunos keywords y algunos objetos (todavía no tengo claro el patrón), y algo que se pedía a gritos el agrupamiento de un bloque de código en los queries, ósea como si usaras las llaves de C# y puedes comprimir las líneas visibles de código, para la otra versión espero el #region...#endregion :D.
Saludos,