Rendimiento de los tipos de tabla definidos por el usuario en SQL Server
Hemos estado usandoTipos de tabla definidos por el usuario para pasar una lista de enteros a nuestros procedimientos almacenados.
Luego los usamos para unirnos a otras tablas en nuestras consultas de proceso almacenadas.
Por ejemplo:
CREATE PROCEDURE [dbo].[sp_Name]
(
@Ids [dbo].[OurTableType] READONLY
)
AS
SET Nocount ON
SELECT
*
FROM
SOMETABLE
INNER JOIN @Ids [OurTableType] ON [OurTableType].Id = SOMETABLE.Id
Hemos visto un rendimiento muy pobre de esto cuando se usan conjuntos de datos más grandes.
Un enfoque que hemos utilizado para acelerar las cosas es volcar el contenido en una tabla temporal y unirlo en su lugar.
Por ejemplo:
CREATE PROCEDURE [dbo].[sp_Name]
(
@Ids [dbo].[OurTableType] READONLY
)
AS
SET Nocount ON
CREATE TABLE #TempTable(Id INT)
INSERT INTO #TempTable
SELECT Id from @Ids
SELECT
*
FROM
SOMETABLE
INNER JOIN #TempTable ON #TempTable.Id = SOMETABLE.Id
DROP TABLE #TempTable
Esto mejora significativamente el rendimiento, pero quería obtener algunas opiniones sobre este enfoque y cualquier otra consecuencia que no hayamos considerado. También puede ser útil una explicación de por qué esto mejora el rendimiento.
nótese bien a veces es posible que necesitemos pasar algo más que un entero, de ahí que no usemos una lista separada por comas o algo así.