Anda di halaman 1dari 16

MS-SQL Server Programacin Back End

Modelo Relacional - MSSQL Server

Referencia de Transact-SQL

CREATE INDEX
Crea un ndice de una vista o una tabla dada. Slo el propietario de la tabla o vista puede crear ndices en esa tabla. El propietario de una tabla o vista puede crear un ndice en cualquier momento, independientemente de que haya datos en la tabla o no. Los ndices se pueden crear en tablas o vistas de otra base de datos especificando un nombre calificado de base de datos. Sintaxis CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) [ WITH < index_option > [ ,...n] ] [ ON filegroup ] < index_option > :: = { PAD_INDEX | FILLFACTOR = fillfactor | IGNORE_DUP_KEY | DROP_EXISTING | STATISTICS_NORECOMPUTE | SORT_IN_TEMPDB } Argumentos UNIQUE Crea un ndice nico (es decir, que no permite que dos filas tengan el mismo valor de ndice) en una tabla o vista. El ndice agrupado de una vista debe ser UNIQUE. Microsoft SQL Server comprueba si hay valores duplicados cuando se crea el ndice (si ya existen datos) y realiza la comprobacin cada vez que se agregan datos con una instruccin INSERT o UPDATE. Si existen valores de clave duplicados, se cancela la instruccin CREATE INDEX y se devuelve un mensaje de error con el primer duplicado. Varios valores NULL se consideran como duplicados al crear un ndice UNIQUE. Cuando existe un ndice nico, las instrucciones UPDATE o INSERT que generen valores de clave duplicada se deshacen y SQL Server muestra un mensaje de error. Esto se cumple incluso si las instrucciones UPDATE o INSERT cambian muchas filas pero crean un nico duplicado. Si se realiza un intento de introducir datos donde existe un ndice nico y se ha especificado la clusula IGNORE_DUP_KEY, slo causarn un error las filas que infrinjan el ndice UNIQUE. Cuando se procesa una instruccin UPDATE, IGNORE_DUP_KEY no tiene efecto. Mg. Jorge Medi@nero A. Pag. 1

MS-SQL Server Programacin Back End

SQL Server no permite la creacin de un ndice nico sobre columnas que ya contengan valores duplicados, ya est establecido o no IGNORE_DUP_KEY. Si se intenta, SQL Server muestra un mensaje de error; los duplicados deben eliminarse antes de que se pueda crear un ndice nico sobre la columna o columnas.

CLUSTERED Crea un objeto en el que el orden fsico de las filas es el mismo que el orden indizado de las filas y el nivel inferior (hojas) del ndice agrupado contiene las filas de datos reales. Una tabla o vista permite un ndice agrupado al mismo tiempo. Una vista con un ndice agrupado se denomina vista indizada. Es necesario crear un ndice agrupado nico en una vista antes de poder definir otros ndices en la misma vista. Cree el ndice agrupado antes de crear los ndices no agrupados. Los ndices no agrupados existentes en las tablas se vuelven a generar al crear un ndice agrupado. Si no se especifica CLUSTERED, se crea un ndice no agrupado. Nota Debido a que el nivel hoja de un ndice agrupado y sus pginas de datos son, por definicin, lo mismo, la creacin de un ndice agrupado y la utilizacin de la clusula ON filegroup mueven efectivamente una tabla desde el archivo en que se cre la tabla al nuevo grupo de archivos. Antes de crear tablas o ndices en grupos de archivos especficos, compruebe qu grupos de archivos estn disponibles y que esos grupos de archivos tengan suficiente espacio libre para el ndice. Es importante que el grupo de archivos tenga al menos 1,2 veces el espacio requerido para la tabla completa.

NONCLUSTERED Crea un objeto que especifica la ordenacin lgica de una tabla. Con un ndice no agrupado, el orden fsico de las filas es independiente del orden indizado. El nivel hoja de un ndice no agrupado contiene las filas del ndice. Cada fila del ndice contiene el valor de clave no agrupada, y uno o varios localizadores de fila que apuntan a la fila que contiene dicho valor. Si la tabla no tiene un ndice agrupado, el localizador de fila es la direccin de disco de la fila. Si la tabla tiene un ndice agrupado, el localizador de fila es la clave del ndice agrupado de la fila. Cada tabla puede tener hasta 249 ndices no agrupados (sin importar cmo se hayan creado: implcitamente con las restricciones PRIMARY KEY y UNIQUE, o explcitamente con CREATE INDEX). Cada ndice puede proporcionar acceso a los datos en un orden distinto. Para las vistas indizadas, slo se pueden crear ndices no agrupados en una vista que ya tenga definido un ndice agrupado. Por lo tanto, el localizador de fila de un ndice no agrupado de una vista indizada siempre es la clave agrupada de la fila. index_name Es el nombre del ndice. Los nombres de ndice deben ser nicos en una tabla o vista, pero no es necesario que sean nicos en una base de datos. Los nombres de ndice deben seguir las reglas de los identificadores. Mg. Jorge Medi@nero A. Pag. 2

MS-SQL Server Programacin Back End

table Es la tabla que contiene la columna o columnas que deben indizarse. Especificar los nombres de la base de datos y del propietario de la tabla es opcional. view Es el nombre de la vista que se va a indizar. La vista debe definirse con SCHEMABINDING para crear un ndice en ella. La definicin de la vista tambin debe ser determinista. Una vista es determinista si todas las expresiones de la lista de seleccin y las clusulas WHERE y GROUP BY son deterministas. Adems, todas las columnas de claves deben ser precisas. Slo las columnas de la vista que no son de clave pueden contener expresiones flotantes (expresiones que utilizan el tipo de datos float) y las expresiones float no se pueden utilizar en ninguna otra parte de la definicin de la vista. Para buscar una columna determinista en la vista, utilice la funcin COLUMNPROPERTY (propiedad IsDeterministic). La propiedad IsPrecise de la funcin puede utilizarse para determinar si las columnas de clave son precisas. Es necesario crear un ndice agrupado nico en una vista antes de crear los ndices no agrupados. El optimizador de consultas puede utilizar las vistas indizadas en SQL Server Enterprise o Developer para acelerar la ejecucin de las consultas. No es necesario hacer referencia a la vista en la consulta para que el optimizador tengan en cuenta esa vista a la hora de hacer una sustitucin. Al crear vistas indizadas o manipular filas de tablas que participan en una vista indizada, se debe asignar un valor especfico a siete opciones SET. El valor de las opciones SET siguientes debe ser ON: ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_PADDING y ANSI_WARNING. La opcin SET NUMERIC_ROUNDABORT debe ser OFF. Si alguno de estos valores es diferente, se producir un error en las instrucciones de modificacin de datos (INSERT, UPDATE, DELETE) que se ejecuten en cualquier tabla a la que haga referencia una vista indizada, y SQL Server mostrar un mensaje de error con todas las opciones SET que infringen los requisitos de configuracin. Adems, para una instruccin SELECT que implica una vista indizada, si los valores de alguna de las opciones SET no son los requeridos, SQL Server procesar SELECT sin considerar la sustitucin de la vista indizada. Esto asegura que el resultado de la consulta es correcto, en los casos en que puede verse afectado por las opciones SET anteriores. Si la aplicacin utiliza una conexin de DB-Library, es necesario asignar el valor requerido a las siete opciones SET en el servidor. (De forma predeterminada, las conexiones OLE DB y ODBC han establecido todas las opciones SET correctamente, excepto ARITHABORT.) Si todas las opciones SET enumeradas no tienen el valor requerido, se podra producir un error al ejecutar la actualizacin de algunas operaciones, como BCP, la duplicacin o consultas distribuidas, en tablas que forman parte de las vistas indizadas. En la mayor parte de los casos, este problema se puede evitar estableciendo ARITHABORT como ON (mediante user options en la opcin de configuracin del servidor). Se recomienda que la opcin de usuario ARITHABORT se establezca en todo el servidor como ON nada ms crearse la primera vista indizada o ndice de columna calculada en cualquier base de datos del servidor. Mg. Jorge Medi@nero A. Pag. 3

MS-SQL Server Programacin Back End

column Es la columna o columnas a las que se aplica el ndice. Especifique dos o ms nombres de columna para crear un ndice compuesto sobre los valores combinados de las columnas especificadas. Enumere las columnas que desee incluir en el ndice compuesto (en orden de prioridad) entre parntesis despus de table. Nota No se pueden especificar como columnas de un ndice las columnas que contienen tipos de datos ntext, text o image. Adems, una vista no puede incluir columnas text, ntext o image, aunque no se haga referencia a ellas en la instruccin CREATE INDEX. Los ndices compuestos se utilizan cuando dos o ms columnas se buscan mejor como una unidad o si muchas consultas hacen referencia slo a columnas del ndice. En un nico ndice compuesto se pueden combinar hasta 16 columnas. Todas las columnas de un ndice compuesto deben encontrarse en la misma tabla. El tamao mximo permitido de los valores de ndice combinado es 900 bytes. Es decir, la suma de las longitudes de las columnas de tamao fijo que forman el ndice compuesto no puede sobrepasar 900 bytes. [ASC | DESC] Determina la direccin ascendente o descendente del orden de la columna de ndice determinada. El valor predeterminado es ASC. n Es un marcador de posicin que indica que se pueden especificar mltiples columnas (columnas) para cualquier ndice particular. PAD_INDEX Especifica el espacio que debe dejarse abierto en cada pgina (nodo) de los niveles intermedios del ndice. La opcin PAD_INDEX slo es til cuando se especifica tambin FILLFACTOR, porque PAD_INDEX utiliza el mismo porcentaje especificado por FILLFACTOR. De forma predeterminada, SQL Server asegura que cada pgina de ndice contiene suficiente espacio libre para acomodar al menos una fila del tamao mximo que pueda tener el ndice, dado el conjunto de claves de las pginas intermedias. Si el porcentaje especificado para FILLFACTOR no es suficientemente grande para acomodar una fila, SQL Server anula internamente el porcentaje para permitir el valor mnimo. Nota El nmero de filas de una pgina intermedia de ndice no es nunca inferior a dos, independientemente de lo bajo que sea el valor de FILLFACTOR. FILLFACTOR = fillfactor Especifica un porcentaje que indica cunto debe llenar SQL Server el nivel hoja de cada pgina de ndices durante la creacin de los mismos. Cuando se llena una pgina de ndices, SQL Server requiere tiempo para dividir la pgina de ndices y hacer sitio a las nuevas filas, lo que resulta bastante costoso. En el caso de las tablas con muchas actualizaciones, la eleccin adecuada de un valor para FILLFACTOR proporciona mejor rendimiento en las actualizaciones que un valor de FILLFACTOR inadecuado. El valor de FILLFACTOR original se almacena con el ndice en sysindexes.

Mg. Jorge Medi@nero A.

Pag. 4

MS-SQL Server Programacin Back End

Cuando se especifica FILLFACTOR, SQL Server redondea el nmero de filas que debe colocarse en cada pgina. Por ejemplo, emitir CREATE CLUSTERED INDEX ... FILLFACTOR = 33 crea un ndice agrupado con un valor FILLFACTOR del 33 por ciento. Suponga que SQL Server calcula que 5,2 filas es el 33 por ciento del espacio de una pgina. SQL Server redondea esa cantidad, de forma que coloca seis filas en cada pgina. Nota La utilizacin de un valor FILLFACTOR explcito slo se aplica cuando se crea el ndice por primera vez. SQL Server no mantiene dinmicamente el porcentaje especificado de espacio libre de pgina. Los valores de FILLFACTOR especificados por el usuario pueden estar entre 1 y 100. Si no se especifica un valor, el valor predeterminado es 0. Cuando FILLFACTOR es 0, slo se llenan las pginas de hoja. Para cambiar el valor predeterminado de FILLFACTOR, ejecute sp_configure. Utilice un valor FILLFACTOR de 100 slo cuando no se produzcan instrucciones INSERT o UPDATE, por ejemplo, en el caso de las tablas de slo lectura. Si FILLFACTOR es 100, SQL Server crea ndices con pginas de hoja 100 por cien llenas. Una instruccin INSERT o UPDATE ejecutada despus de la creacin de un ndice con un valor de FILLFACTOR del 100 por cien hace que la pgina se divida con cada INSERT y, posiblemente, con cada UPDATE. Los valores de FILLFACTOR ms pequeos, excepto 0, hacen que SQL Server cree nuevos ndices con pginas hoja que no estn completamente llenas. Por ejemplo, un valor de FILLFACTOR de 10 puede ser una opcin razonable al crear un ndice en una tabla que se sabe que contiene una pequea parte de los datos que posiblemente contendr en el futuro. Valores ms pequeos de FILLFACTOR hacen tambin que cada ndice requiera ms espacio de almacenamiento. La siguiente tabla ilustra cmo se llenan las pginas de un ndice si se especifica FILLFACTOR. FILLFACTOR Pgina intermedia Pgina hoja Una entrada libre Una entrada libre Una entrada libre 100 por cien llena <= porcentaje de FILLFACTOR llena 100 por cien llena

0 por cien 1 a 99 por ciento 100 por cien

Una entrada libre es el espacio de la pgina que puede acomodar otra entrada de ndice. Importante La creacin de un ndice agrupado con un valor de FILLFACTOR afecta a la cantidad de espacio de almacenamiento que ocupan los datos, porque SQL Server vuelve a distribuir los datos cuando crea el ndice agrupado. IGNORE_DUP_KEY Controla qu ocurre cuando se realiza un intento de insertar un valor de clave duplicada en una columna que sea parte de un ndice agrupado nico. Si se especific IGNORE_DUP_KEY para el ndice y se ejecuta una instruccin INSERT que crea una clave duplicada, SQL Server emite un mensaje de advertencia y no tiene en cuenta la fila duplicada. Si no se especific IGNORE_DUP_KEY para el ndice, SQL Server emite un mensaje de error y deshace la instruccin INSERT completa. Mg. Jorge Medi@nero A. Pag. 5

MS-SQL Server Programacin Back End

La tabla siguiente muestra cundo puede utilizarse IGNORE_DUP_KEY. Tipo de ndice Opciones Agrupado No permitido. Agrupado nico IGNORE_DUP_KEY permitido. No agrupado No permitido. No agrupado nico IGNORE_DUP_KEY permitido.

DROP_EXISTING Especifica que el ndice agrupado o no agrupado preexistente mencionado debe quitarse y volverse a generar. El nombre del ndice especificado debe ser el mismo que el ndice existente actualmente. Debido a que los ndices no agrupados contienen las claves de agrupamiento, los ndices no agrupados deben volverse a generar cuando se quita un ndice agrupado. Si se vuelve a crear un ndice agrupado, los ndices no agrupados deben volverse a crear para que tengan en cuenta el nuevo conjunto de claves. La clusula DROP_EXISTING mejora el rendimiento cuando se vuelve a crear un ndice agrupado (con el mismo conjunto de claves o con uno distinto) en una tabla que tambin tiene ndices no agrupados. La clusula DROP_EXISTING reemplaza la ejecucin de una instruccin DROP INDEX en el antiguo ndice agrupado seguida de la ejecucin de una instruccin CREATE INDEX para el nuevo ndice agrupado. Los ndices no agrupados vuelven a generarse una vez, slo si las claves son distintas. Si las claves no cambian (se proporcionan los mismos nombres de ndice y columnas que el ndice original), la clusula DROP_EXISTING no ordena de nuevo los datos. Esto puede ser til si el ndice debe compactarse. Un ndice agrupado no se puede convertir en un ndice no agrupado mediante la clusula DROP_EXISTING; no obstante, un ndice agrupado nico se puede cambiar a un ndice no nico y viceversa. Nota Al ejecutar una instruccin CREATE INDEX con la clusula DROP_EXISTING, SQL Server asume que el ndice es coherente, es decir, que no est daado. Las filas del ndice especificado deben ordenarse por la clave especificada a la que se hace referencia en la instruccin CREATE INDEX.

STATISTICS_NORECOMPUTE Especifica que las estadsticas de ndices no actualizadas no se vuelven a calcular automticamente. Para restaurar la actualizacin automtica de estadsticas, ejecute UPDATE STATISTICS sin la clusula NORECOMPUTE. Importante Deshabilitar el clculo automtico de estadsticas de distribucin puede impedir que el optimizador de consultas de SQL Server elija los planes de ejecucin ptimos de las consultas relativas a la tabla.

Mg. Jorge Medi@nero A.

Pag. 6

MS-SQL Server Programacin Back End

SORT_IN_TEMPDB Especifica que los resultados de orden intermedios utilizados para crear el ndice se almacenarn en la base de datos tempdb. Esta opcin puede reducir el tiempo necesario para crear un ndice si tempdb est en un conjunto de discos diferente que la base de datos del usuario, pero aumenta la cantidad de espacio en disco utilizado durante la creacin del ndice.

ON filegroup Crea el ndice especificado en el grupo de archivos (filegroup) dado. El grupo de archivos se debe haber creado ya al ejecutar CREATE DATABASE o ALTER DATABASE. Observaciones El espacio se asigna a las tablas e ndices en incrementos de una extensin (ocho pginas de 8 kilobytes) a la vez. Cada vez que se llena una extensin, se asigna otra. Los ndices de tablas vacas o muy pequeas utilizarn asignaciones de pginas individuales hasta que se hayan agregado 8 pginas al ndice y, despus, cambiarn a las asignaciones extendidas. Para obtener un informe acerca del espacio asignado y el utilizado por un ndice, utilice sp_spaceused. La creacin de un ndice agrupado requiere disponer en la base de datos de un espacio igual aproximadamente a 1,2 veces el tamao de los datos. Este espacio es adicional al espacio empleado por la tabla existente; los datos se duplican para crear el ndice agrupado y los datos antiguos no indizados se eliminan cuando se completa el ndice. Al utilizar la instruccin DROP_EXISTING, el espacio que necesita el ndice agrupado es una cantidad igual a los requisitos de espacio del ndice existente. La cantidad de espacio adicional requerido tambin se puede ver afectado por el argumento FILLFACTOR especificado. Al crear un ndice en SQL Server 2000, puede utilizar la opcin SORT_IN_TEMPDB para indicar al motor de base de datos que almacene los resultados intermedios de orden del ndice en tempdb. Esta opcin puede reducir el tiempo necesario para crear un ndice si tempdb est en un conjunto de discos diferente que la base de datos del usuario, pero aumenta la cantidad de espacio en disco utilizado para crear un ndice. Adems del espacio necesario en la base de datos del usuario para crear el ndice, tempdb debe tener la misma cantidad de espacio adicional para almacenar los resultados intermedios de ordenacin. La instruccin CREATE INDEX se optimiza como cualquier otra consulta. El procesador de consultas de SQL Server puede elegir explorar otro ndice en lugar de explorar una tabla para guardar en operaciones de E/S. El orden se puede eliminar en algunos casos. En equipos multiprocesador con SQL Server Enterprise y Developer, CREATE INDEX utiliza automticamente ms procesadores para explorar y ordenar, igual que hacen otras consultas. El nmero de procesadores utilizados para ejecutar una sola instruccin CREATE INDEX viene determinado por la opcin de configuracin max degree of parallelism y por la carga de trabajo actual. Si SQL Server detecta que el sistema est ocupado, el grado de paralelismo de la operacin CREATE INDEX se reduce automticamente antes de comenzar la ejecucin de la instruccin.

Mg. Jorge Medi@nero A.

Pag. 7

MS-SQL Server Programacin Back End

La copia de seguridad de los grupos de archivos completos afectados por una instruccin CREATE INDEX desde la ltima copia de seguridad del grupo de archivos, debe realizarse como una unidad. Para obtener ms informacin acerca de las copias de seguridad de archivos y grupos de archivos, consulte BACKUP. Las operaciones de copia de seguridad y CREATE INDEX no se bloquean entre s. Si hay una copia de seguridad en curso, el ndice se crea en modo de registro completo, lo que puede requerir ms espacio para registro. Para mostrar un informe de los ndices de un objeto, ejecute sp_helpindex. Los ndices se pueden crear en una tabla temporal. Cuando se quita la tabla o se termina la sesin, se quitan todos los ndices y desencadenadores. Columnas de tipo variable en ndices El tamao mximo permitido para una clave de ndice es 900 bytes, pero SQL Server 2000 permite crear ndices en columnas con un tipo de variable mayor con un tamao mayor que 900 bytes. Durante la creacin del ndice, SQL Server comprueba las siguientes condiciones: La suma de todas las columnas de datos fijos que participan en la definicin del ndice debe ser menor o igual que 900 bytes. Cuando el ndice a crear se compone nicamente de columnas de datos fijos, el tamao total de las columnas debe ser menor o igual que 900 bytes. En caso contrario, no se crear el ndice y SQL Server devolver un error. Si la definicin del ndice est compuesta por columnas de tipo fijo y variable, y las columnas de datos fijos cumplen la condicin anterior (menor o igual que 900 bytes), SQL Server comprueba el tamao total de las columnas de tipo variable. Si el tamao mximo de las columnas de tipo variable ms el tamao de las columnas de datos fijos es mayor que 900 bytes, SQL Server crea el ndice pero muestra una advertencia al usuario. La advertencia indica al usuario que si las acciones de insercin o actualizacin posteriores que se realicen en las columnas de tipo variable producen, como resultado, un tamao total mayor que 900 bytes, no se podr realizar la accin y se producir un error en tiempo de ejecucin. Del mismo modo, si la definicin del ndice est compuesta slo de columnas de tipo variable y el tamao total mximo de estas columnas es mayor que 900 bytes, SQL Server crear el ndice pero devolver una advertencia.

UNIQUE o PRIMARY KEY pueden contener una columna calculada siempre que cumpla todas las condiciones de creacin del ndice. Concretamente, la columna calculada debe ser determinista, precisa y no debe contener columnas text, ntext o image. Para obtener ms informacin acerca del determinismo, consulte Funciones deterministas y no deterministas. La creacin de un ndice en una vista o columna calculada puede producir un error en una operacin INSERT o UPDATE que antes funcionaba. Este error podra ocurrir cuando la columna calculada produce un error aritmtico.

Mg. Jorge Medi@nero A.

Pag. 8

MS-SQL Server Programacin Back End

Por ejemplo, aunque la columna calculada c del siguiente ejemplo produzca un error aritmtico, la instruccin INSERT funcionar: CREATE TABLE t1 (a int, b int, c AS a/b) GO INSERT INTO t1 VALUES ('1', '0') GO En cambio, si despus de crear la tabla crea un ndice en la columna calculada c, la misma instruccin INSERT producir un error. CREATE TABLE t1 (a int, b int, c AS a/b) GO CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1.c GO INSERT INTO t1 VALUES ('1', '0') GO El resultado de una consulta que utiliza un ndice de una vista definido con expresiones numricas o float podra diferir de una consulta similar que no utiliza el ndice de la vista. Esta diferencia se podra deber a errores de redondeo durante las acciones INSERT, DELETE o UPDATE en las tablas subyacentes. Para evitar que SQL Server utilice vistas indizadas, incluya la sugerencia OPTION (EXPAND VIEWS) en la consulta. Adems, si alguna de las opciones enumeradas no tiene el valor correcto, el optimizador no utilizar los ndices de las vistas. Para obtener ms informacin acerca de la sugerencia OPTION (EXPAND VIEWS), consulte SELECT.

Restricciones de las vistas indizadas


La instruccin SELECT que define una vista indizada no debe tener las palabras clave TOP, DISTINCT, COMPUTE, HAVING y UNION. No puede tener una subconsulta. La lista SELECT no puede contener asteriscos (*), listas creadas con el comodn 'table.*', DISTINCT, COUNT(*), COUNT(<expression>), columnas calculadas de las tablas base y agregados escalares. Las listas SELECT sin agregados no pueden tener expresiones. Las lista agregada SELECT (consultas que contienen GROUP BY) puede incluir SUM y COUNT_BIG(<expression>); debe contener COUNT_BIG(*). No se permiten otras funciones agregadas, como MIN, MAX, STDEV, ... La agregacin compleja mediante AVG no puede participar en la lista SELECT de la vista indizada. No obstante, si una consulta utiliza esta agregacin, el optimizador puede utilizar esta vista indizada para sustituir AVG por una combinacin de agregados SUM y COUNT_BIG simples. Una columna procedente de una expresin cuyo resultado es un tipo de datos float o que utiliza expresiones float para su evaluacin no puede ser clave de un ndice en una vista indizada o en Mg. Jorge Medi@nero A. Pag. 9

MS-SQL Server Programacin Back End

una columna calculada de una tabla. Estas columnas se denominan no precisas. Utilice la funcin COLUMNPROPERTY para determinar si una columna calculada en particular o una columna de una vista es precisa. Las vistas indizadas estn sujetas a estas restricciones adicionales: El creador del ndice debe ser propietario de las tablas. Todas las tablas, la vista y el ndice se deben crear en la misma base de datos. La instruccin SELECT que define la vista indizada no puede contener vistas, funciones de conjunto de filas, funciones en lnea ni tablas derivadas. La misma tabla fsica slo puede ocurrir una vez en la instruccin. No se permiten operaciones OUTER JOIN en tablas combinadas. No se permiten subconsultas ni predicados CONTAINS o FREETEXT en la condicin de bsqueda. Si la definicin de la vista contiene una clusula GROUP BY, todas las columnas de agrupacin as como la expresin COUNT_BIG(*) deben aparecer en la lista SELECT de la vista. Adems, estas columnas deben ser las nicas de la clusula CREATE UNIQUE CLUSTERED INDEX. El cuerpo de la definicin de una vista que se puede indizar debe ser determinista y preciso, igual que los requisitos para los ndices de columnas calculadas. Consulte Crear ndices en columnas calculadas. Permisos De forma predeterminada, los permisos CREATE INDEX se conceden a la funcin fija de servidor sysadmin, a las funciones fijas de base de datos db_ddladmin y db_owner y al propietario de la tabla, y no son transferibles.

Ejemplos A. Utilizar un ndice sencillo El ejemplo siguiente crea un ndice en la columna au_id de la tabla authors. SET NOCOUNT OFF USE pubs IF EXISTS (SELECT name FROM sysindexes WHERE name = 'au_id_ind') DROP INDEX authors.au_id_ind GO USE pubs CREATE INDEX au_id_ind ON authors (au_id) GO

Mg. Jorge Medi@nero A.

Pag. 10

MS-SQL Server Programacin Back End

B. Utilizar un ndice agrupado nico Este ejemplo crea un ndice en la columna employeeID de la tabla emp_pay, que exige que sea nico. Este ndice ordena fsicamente los datos del disco porque se especifica la clusula CLUSTERED.

SET NOCOUNT ON USE tempDB IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'emp_pay') DROP TABLE emp_pay GO USE tempDB IF EXISTS (SELECT name FROM sysindexes WHERE name = 'employeeID_ind') DROP INDEX emp_pay.employeeID_ind GO USE tempDB GO CREATE TABLE emp_pay ( employeeID int NOT NULL, base_pay money NOT NULL, commission decimal(2, 2) NOT NULL ) INSERT emp_pay VALUES (1, 500, .10) INSERT emp_pay VALUES (2, 1000, .05) INSERT emp_pay VALUES (3, 800, .07) INSERT emp_pay VALUES (5, 1500, .03) INSERT emp_pay VALUES (9, 750, .06) GO SET NOCOUNT OFF CREATE UNIQUE CLUSTERED INDEX employeeID_ind ON emp_pay (employeeID) GO

Mg. Jorge Medi@nero A.

Pag. 11

MS-SQL Server Programacin Back End

C. Utilizar un ndice compuesto sencillo En este ejemplo se crea un ndice en las columnas orderID y employeeID de la tabla order_emp. SET NOCOUNT ON USE tempDB IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'order_emp') DROP TABLE order_emp GO USE tempDB IF EXISTS (SELECT name FROM sysindexes WHERE name = 'emp_order_ind') DROP INDEX order_emp.emp_order_ind GO USE tempDB GO CREATE TABLE order_emp ( orderID int IDENTITY(1000, 1), employeeID int NOT NULL, orderdate datetime NOT NULL DEFAULT GETDATE(), orderamount money NOT NULL ) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (5, '4/12/98', 315.19) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (5, '5/30/98', 1929.04) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (1, '1/03/98', 2039.82) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (1, '1/22/98', 445.29) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (4, '4/05/98', 689.39) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (7, '3/21/98', 1598.23) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (7, '3/21/98', 445.77) INSERT order_emp (employeeID, orderdate, orderamount) VALUES (7, '3/22/98', 2178.98) GO

Mg. Jorge Medi@nero A.

Pag. 12

MS-SQL Server Programacin Back End

SET NOCOUNT OFF CREATE INDEX emp_order_ind ON order_emp (orderID, employeeID)

D. Utilizar la opcin FILLFACTOR Este ejemplo utiliza la clusula FILLFACTOR establecida en 100. Un valor de FILLFACTOR de 100 llena cada pgina completamente y slo es til cuando se sabe que los valores de los ndices de una tabla no cambiarn nunca. SET NOCOUNT OFF USE tempDB IF EXISTS (SELECT name FROM sysindexes WHERE name = 'zip_ind') DROP INDEX authors.zip_ind GO USE tempDB GO CREATE NONCLUSTERED INDEX zip_ind ON authors (zip) WITH FILLFACTOR = 100

E. Utilizar IGNORE_DUP_KEY Este ejemplo crea un ndice agrupado nico en la tabla emp_pay. Si se introduce una clave duplicada, las instrucciones INSERT y UPDATE se omiten. SET NOCOUNT ON USE tempDB IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'emp_pay') DROP TABLE emp_pay GO USE tempDB IF EXISTS (SELECT name FROM sysindexes WHERE name = 'employeeID_ind') DROP INDEX emp_pay.employeeID_ind GO USE tempDB GO

Mg. Jorge Medi@nero A.

Pag. 13

MS-SQL Server Programacin Back End

CREATE TABLE emp_pay ( employeeID int NOT NULL, base_pay money NOT NULL, commission decimal(2, 2) NOT NULL ) INSERT emp_pay VALUES (1, 500, .10) INSERT emp_pay VALUES (2, 1000, .05) INSERT emp_pay VALUES (3, 800, .07) INSERT emp_pay VALUES (5, 1500, .03) INSERT emp_pay VALUES (9, 750, .06) GO SET NOCOUNT OFF GO CREATE UNIQUE CLUSTERED INDEX employeeID_ind ON emp_pay(employeeID) WITH IGNORE_DUP_KEY

F. Crear un ndice con PAD_INDEX Este ejemplo crea un ndice del nmero de identificacin de autor en la tabla authors. Sin la clusula PAD_INDEX, SQL Server crea pginas hoja que se encuentran llenas al 10 por ciento, aunque las pginas situadas encima del nivel de hoja se llenan casi completamente. Con PAD_INDEX las pginas intermedias tambin se llenan casi al 10 por ciento. Nota Al menos dos entradas aparecen en las pginas de ndice de los ndices agrupados nicos cuando no se especifica PAD_INDEX.

SET NOCOUNT OFF USE tempDB IF EXISTS (SELECT name FROM sysindexes WHERE name = 'au_id_ind') DROP INDEX authors.au_id_ind GO

Mg. Jorge Medi@nero A.

Pag. 14

MS-SQL Server Programacin Back End

USE tempDB CREATE INDEX au_id_ind ON authors (au_id) WITH PAD_INDEX, FILLFACTOR = 10

G. Crear un ndice de una vista Este ejemplo crear una vista y un ndice de esa vista. A continuacin, se incluyen dos consultas que utilizan la vista indizada. USE Northwind GO --Set the options to support indexed views. SET NUMERIC_ROUNDABORT OFF GO SET ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QU OTED_IDENTIFIER,ANSI_NULLS ON GO --Create view. CREATE VIEW V1 WITH SCHEMABINDING AS SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Revenue, OrderDate, ProductID, COUNT_BIG(*) AS COUNT FROM dbo.[Order Details] od, dbo.Orders o WHERE od.OrderID=o.OrderID GROUP BY OrderDate, ProductID GO --Create index on the view. CREATE UNIQUE CLUSTERED INDEX IV1 ON V1 (OrderDate, ProductID) GO --This query will use the above indexed view. SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev, OrderDate, ProductID FROM dbo.[Order Details] od, dbo.Orders o WHERE od.OrderID=o.OrderID AND ProductID in (2, 4, 25, 13, 7, 89, 22, 34) AND OrderDate >= '05/01/1998' GROUP BY OrderDate, ProductID ORDER BY Rev DESC

Mg. Jorge Medi@nero A.

Pag. 15

MS-SQL Server Programacin Back End

--This query will use the above indexed view. SELECT OrderDate, SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev FROM dbo.[Order Details] od, dbo.Orders o WHERE od.OrderID=o.OrderID AND DATEPART(mm,OrderDate)= 3 AND DATEPART(yy,OrderDate) = 1998 GROUP BY OrderDate ORDER BY OrderDate ASC

Vase tambin ALTER DATABASE CREATE DATABASE CREATE STATISTICS CREATE TABLE Disear un ndice DROP INDEX DROP STATISTICS ndices INSERT SET sp_autostats sp_createstats sp_dbcmptlevel sp_dboption sp_helpindex sp_spaceused sysindexes

Mg. Jorge Medi@nero A.

Pag. 16

Anda mungkin juga menyukai