¿Se puede crear un índice en una variable de tabla en SQL Server 2000?
es decir
DECLARE @TEMPTABLE TABLE (
[ID] [int] NOT NULL PRIMARY KEY
,[Name] [nvarchar] (255) COLLATE DATABASE_DEFAULT NULL
)
¿Puedo crear un índice en Name
?
sql
sql-server
tsql
indexing
table-variable
GordyII
fuente
fuente
CREATE TABLE #T1(X INT); CREATE TABLE #T2(X INT); CREATE INDEX IX ON #T1(X); CREATE INDEX IX ON #T2(X);
Respuestas:
La pregunta está etiquetada como SQL Server 2000, pero para beneficio de las personas que desarrollan en la última versión, abordaré eso primero.
SQL Server 2014
Además de los métodos para agregar índices basados en restricciones que se analizan a continuación, SQL Server 2014 también permite especificar índices no únicos directamente con sintaxis en línea en las declaraciones de variables de tabla.
Ejemplo de sintaxis para eso está abajo.
Los índices filtrados y los índices con columnas incluidas no se pueden declarar actualmente con esta sintaxis, sin embargo, SQL Server 2016 lo relaja un poco más. Desde CTP 3.1 ahora es posible declarar índices filtrados para variables de tabla. Según RTM, es posible que las columnas incluidas también estén permitidas, pero la posición actual es que "probablemente no llegarán a SQL16 debido a limitaciones de recursos".
SQL Server 2000 - 2012
Respuesta corta: sí.
Una respuesta más detallada está abajo.
Las tablas tradicionales en SQL Server pueden tener un índice agrupado o están estructuradas como montones .
Los índices agrupados pueden declararse como únicos para no permitir valores de clave duplicados o predeterminados como no únicos. Si no es único, SQL Server agrega silenciosamente un unificador a las claves duplicadas para que sean únicas.
Los índices no agrupados también se pueden declarar explícitamente como únicos. De lo contrario, para el caso no único, SQL Server agrega el localizador de filas (clave de índice agrupada o RID para un montón) a todas las claves de índice (no solo duplicados), esto nuevamente asegura que sean únicos.
En SQL Server 2000 - 2012, los índices de las variables de tabla solo se pueden crear implícitamente creando una restricción
UNIQUE
oPRIMARY KEY
. La diferencia entre estos tipos de restricciones es que la clave primaria debe estar en columnas no anulables. Las columnas que participan en una restricción única pueden ser anulables. (aunque la implementación de restricciones únicas de SQL Server en presencia deNULL
s no es la especificada en el Estándar SQL). Además, una tabla solo puede tener una clave primaria pero múltiples restricciones únicas.Ambas restricciones lógicas se implementan físicamente con un índice único. Si no se especifica explícitamente de lo contrario,
PRIMARY KEY
se convertirá en el índice agrupado y las restricciones únicas no agrupadas, pero este comportamiento puede anularse especificandoCLUSTERED
oNONCLUSTERED
explícitamente con la declaración de restricción (sintaxis de ejemplo)Como resultado de lo anterior, los siguientes índices se pueden crear implícitamente en variables de tabla en SQL Server 2000 - 2012.
El último requiere un poco de explicación. En la definición de la variable de tabla al principio de esta respuesta, el índice no agrupado no único activado
Name
se simula mediante un índice único activadoName,Id
(recuerde que SQL Server agregaría silenciosamente la clave de índice agrupado a la clave NCI no exclusiva de todos modos).También se puede lograr un índice agrupado no único agregando manualmente una
IDENTITY
columna para que actúe como unificador.Pero esta no es una simulación precisa de cómo un índice agrupado no único normalmente se implementaría en SQL Server, ya que esto agrega el "Uniqueifier" a todas las filas. No solo aquellos que lo requieren.
fuente
Debe entenderse que desde el punto de vista del rendimiento no hay diferencias entre las tablas @temp y las tablas #temp que favorecen las variables. Residen en el mismo lugar (tempdb) y se implementan de la misma manera. Todas las diferencias aparecen en características adicionales. Vea este artículo increíblemente completo: /dba/16385/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server/16386#16386
Aunque hay casos en los que no se puede usar una tabla temporal, como en una tabla o funciones escalares, para la mayoría de los casos anteriores a v2016 (donde incluso se pueden agregar índices filtrados a una variable de tabla), simplemente puede usar una tabla #temp.
El inconveniente de usar índices con nombre (o restricciones) en tempdb es que los nombres pueden entrar en conflicto. No solo teóricamente con otros procedimientos, sino a menudo con bastante facilidad con otras instancias del procedimiento en sí mismo que tratarían de poner el mismo índice en su copia de la tabla #temp.
Para evitar conflictos de nombres, algo como esto generalmente funciona:
Esto asegura que el nombre siempre sea único, incluso entre ejecuciones simultáneas del mismo procedimiento.
fuente
Si la variable de tabla tiene datos grandes, en lugar de la variable de tabla (@table) cree la tabla temporal (#table). La variable de tabla no permite crear índice después de insertar.
Crear tabla con índice agrupado único
Insertar datos en la tabla Temp "#Table"
Crear índices no agrupados.
fuente