descargando 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 para 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ándose en una matriz.
Esto lleva SIEMPRE.
¿Alguien tiene alguna sugerencia sobre cómo optimizar esto?Estoy tratando de evitar el uso de python/sqlcmd/etc. para agarrar los blobs directamente (evitando JMP).
secuencias de comandosRe: descargar columnas grandes de la base de datos a través de odbcSi si.Muy apreciado.
Re: descargar columnas grandes de la base de datos a través de odbcSolo una nota de que esta limitación lo hace parece haber sido eliminado en JMP16.1. ¡Gracias!
Re: descargar columnas grandes de la base de datos a través de odbcOpe, mi mal.Servirá. Gracias.
Re: descargar columnas grandes de la base de datos a través de odbcHola, @vince_faller .
Este problema 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 a través de odbcHola de nuevo @Dahlia_Watkins , ¿alguna noticia si esa solicitud de función ha tenido alguna tracción?
Re: descargar columnas grandes de la base de datos a través de 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 (subíndices en grupos de 65536 y concatenación hasta que se ha solucionado el más largo) y no puedo cambiar el controlador; así que estoy en un pequeño lío.
Re: descargar columnas grandes de la base de datos a través de odbcPor bryan_boone el comportamiento se debe a que estos controladores no reajustan la longitud de la columna. Posteriormente, JMP establece una duración 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 la base de datos de columnas grandes desde la base de datos a través de odbcSí. Usando exactamente la misma cadena de conexión.Re: descargar la base de datos de columnas grandes desde la base de datos a través de odbcAh bien. Entonces, dado que estoy usando VARCHAR (MAX), ¿quizás no haya una longitud de columna?
Desafortunadamente, incluso con la recuperación de bloques desactivada, no funciona.
Re: descargar la base de datos de columnas grandes desde la base de datos a través de odbc@vince_faller ,
¿Está utilizando el mismo controlador ODBC para Python y JMP?
Stan
Re: descargar la base de datos de columnas grandes desde la base de datos a través de 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 usa el valor predeterminado de 65536.
Re: descargar la base de datos de columnas grandes desde la base de datos a través de odbcEsto va más allá de mi capacidad de prueba para comprender lo que está sucediendo.
@briancorcoran ?
Re: descargar la base de datos de columnas grandes desde la base de datos a través de odbc@Jeff_Perkinson
Mirando más en esto, no puedo explicar este comportamiento.Puedo obtener valores 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 estoy perdiendo?O tal vez debajo de Python está agregando alguna funcionalidad.
*EDIT* perdón por tantas ediciones.Espero que no recibas un correo electrónico para cada uno.
Re: descargar la base de datos de columnas grandes desde la base de datos a través de odbcMuy relevante.Culpa mía.Algo raro está pasando entonces.
Gracias @Jeff_Perkinson ,
Re: descargar la base de datos de columnas grandes desde la base de datos a través de odbc
@vince_faller escribió:
Parece que el ancho de columna para JMP es 65536, por lo que no puedo descargar la columna completa.No parece ser un problema exclusivo de ODBC.
No tengo pensamientos inmediatos sobre su consulta real, pero quiero aclarar la declaración anterior. El ancho máximo de 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 no haya entendido lo que quiso decir con ancho de columna .