descargar columnas grandes de la base de datos a través de odbcTengo una columna SQL que es varbinary (MAX).Parece que el ancho de columna de JMP es 65536, por lo que no puedo descargar la columna completa. No parece ser un problema exclusivo de ODBC.
Actualmente estoy haciendo esto uno a la vez simplemente tomando subcadenas hasta que estén todas vacías y concatenándolas en una matriz.
Esto lleva SIEMPRE.
¿Alguien tiene alguna sugerencia sobre formas de optimizar esto?Estoy tratando de evitar el uso de python/sqlcmd/etc. para agarrar las manchas directamente (evitando JMP).
Acceso a los datosRe: descargar columnas grandes de la base de datos vía odbcSi si.Muy apreciado.
Re: descargar columnas grandes de la base de datos vía odbcSólo una nota de que esta limitación hace Parece haber sido eliminado en JMP16.1. ¡Gracias!
Re: descargar columnas grandes de la base de datos vía odbcOpe, mi mal.Servirá. Gracias.
Re: descargar columnas grandes de la base de datos vía odbcHola, @vince_faller .
Esta cuestión debería haberse abordado en JMP 16.1. Envíe un correo electrónico a soporte si ha probado esto en 16.1 y aún observa el mismo comportamiento.
Re: descargar columnas grandes de la base de datos vía odbcHola de nuevo @Dahlia_Watkins , ¿Alguna novedad si esa solicitud de función ha tenido éxito?
Re: descargar columnas grandes de la base de datos vía odbcGracias @Dahlia_Watkins
¿Alguien en Internet sabe si hay una manera de forzar que se proporcione el tamaño de la transacción?
Mi implementación actual es abismalmente lenta (suscripción en grupos de 65536 y concatenación hasta que se haya solucionado el más largo) y no puedo cambiar el controlador; así que estoy en un aprieto.
Re: descargar columnas grandes de la base de datos vía odbcPor bryan_boone el comportamiento se debe a que estos controladores no ajustan la longitud de la columna. Posteriormente, JMP establece una longitud predeterminada de 65536 cuando no se faciliten estos datos.
Agregué una nueva solicitud de función para aumentar este valor ya que JMP puede manejar estos datos.
Mientras tanto, el uso de SQL Server (nativo) parece funcionar.
Re: descargar base de datos de columnas grandes desde la base de datos mediante odbcSí. Usando exactamente la misma cadena de conexión.Re: descargar base de datos de columnas grandes desde la base de datos mediante odbcAh bien. Entonces, dado que estoy usando VARCHAR (MAX), ¿tal vez no haya longitud de columna?
Desafortunadamente, incluso con el bloqueo desactivado no funciona.
Re: descargar base de datos de columnas grandes desde la base de datos mediante odbc@vince_faller ,
¿Está utilizando el mismo controlador ODBC para Python y JMP?
estan
Re: descargar base de datos de columnas grandes desde la base de datos mediante odbc¿Puedes intentar usar:
Preferences( ODBC Disable Block Fetch( 1 ) );
A veces, el controlador ODBC no informa la longitud de la columna.
SQL Server es uno de los controladores que admite la recuperación de bloques (que es mucho más eficiente que una fila a la vez), pero si el controlador no informa la longitud de la columna, se utiliza el valor predeterminado de 65536.
Re: descargar base de datos de columnas grandes desde la base de datos mediante odbcEsto va más allá de mi capacidad de realizar pruebas para comprender lo que está sucediendo.
@briancorcoran ?
Re: descargar base de datos de columnas grandes desde la base de datos mediante odbc@Jeff_Perkinson
Al profundizar más en esto, no puedo explicar este comportamiento.Puedo obtener valores exactamente de la misma tabla y cadena de conexión a través de Python.Por alguna razón, JMP borra la columna tan pronto como llega a 65537.
Names default to here(1);
driver = "ODBC Driver 17 for SQL Server"; // using SQL Server
server = "localhost";
database = "Test";
username = "sa";
password = "REDACTED";
cxn_string = "DRIVER="||driver||";SERVER="||server||";UID="||username||";PWD="||
password||";Database="||database;
cxn = create database connection(cxn_string);
executesql(cxn,
"
CREATE TABLE [dbo].[LargeChar](
[LargeCharID] [bigint] IDENTITY(1,1) NOT NULL,
[SomeBigChar] [varchar](MAX) NOT NULL,
CONSTRAINT [PK_Blob] PRIMARY KEY CLUSTERED
(
[LargeCharID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
"
);
executeSQL(cxn,
"INSERT INTO [LargeChar]
VALUES('"||REPEAT("A", 100000)||"')"
);
dt_download = executeSQL(cxn,
"SELECT SomeBigChar
, SubString(Convert(VARCHAR(MAX), SomeBigChar), 1, 65536) AS Char65536 -- this works
, SubString(Convert(VARCHAR(MAX), SomeBigChar), 1, 65537) AS Char65537 -- this doesn't
FROM [LargeChar]",
"This should work?"
);
show(length(dt_download:SomeBigChar[1]), // full text doesn't show
length(dt_download:Char65536[1]), // text that is only 65536 shows
length(dt_download:Char65537[1]) // text that is one higher? nope
);
//execute SQL(cxn, "DROP TABLE [LargeChar]");
close database connection(cxn);
//Python script returns
/*
0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
Name: SomeBigChar, dtype: object
0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
Name: Char65536, dtype: object
0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
Name: Char65537, dtype: object
*/
¿Hay algo que me falta?O tal vez debajo de Python se esté agregando alguna funcionalidad.
*EDITAR* perdón por tantas ediciones.Espero que no recibas un correo electrónico para cada uno.
Re: descargar base de datos de columnas grandes desde la base de datos mediante odbcMuy relevante.Culpa mía.Algo raro está pasando entonces.
Gracias @Jeff_Perkinson ,
Re: descargar base de datos de columnas grandes desde la base de datos mediante odbc
@vince_faller escribió:
Parece que el ancho de columna de JMP es 65536, por lo que no puedo descargar la columna completa.No parece ser un problema exclusivo de ODBC.
No tengo ninguna idea inmediata sobre su consulta real, pero sí quiero aclarar la afirmación anterior. El ancho máximo para una columna de caracteres en JMP es MUCHO mayor que 65536.
New Table( "untitled 15",
Add Rows( 1 ),
New Column( "repeat",
Character,
"Nominal",
Formula( Repeat( "a", 128000000 ) ),
),
New Column( "length",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Length( :repeat ) ),
)
)
Estoy seguro de que este detalle no es relevante para resolver su problema de velocidad/consulta y es posible que haya entendido mal lo que quiso decir con ancho de columna .