SQL Server - Duda con ïndices

 
Vista:

Duda con ïndices

Publicado por eljhonb (124 intervenciones) el 16/07/2007 23:08:52
Buenas, tengo una duda con un índice.
La cuestión es la siguiente:
Tengo dos tablas, la tabla 2 tiene un campo A de tipo numérico y está en otra base de datos. La tabla 1 un campo B de tipo varchar pero que almacena datos numéricos.
Cada tabla tiene un índice sobre el campo mencionado. Mi pregunta es:
Al hacer un Join de estas dos tablas sobre estos índices, debo hacer un cast sobre el campo que es de tipo varchar, esto hace que el sqlserver no tome el índice?

ejemplo:
UPDATE TB1
SET TB1.campo1 = TB2.Campo5
FROM TB1 JOIN [otraBD].dbo.TB2 ON A = CAST(B AS NUMERIC)

hago la pregunta porque esta actualización, aparentemente sencilla, está tardando demasiado tiempo, y digo que puede ser porque no está tomando en cuenta el índice para hacer el JOIN..

Gracias por sus respuestas!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Duda con ïndices

Publicado por Isaias (3308 intervenciones) el 16/07/2007 23:12:00
Es totalmente correcto, cuando haces el CAST, se olvida del INDICE, ¿Porque no lo declaras NUMERICO, si solo contiene numeros?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda con ïndices

Publicado por eljhonb (124 intervenciones) el 16/07/2007 23:31:13
bueno, la cuestión es que en ese campo se carga de un archivo plano, que en ocasiones tiene errores en ese campo y que no se pueden omitir pues luego se debe hacer un análisis de esos registros.
Qué otra solución podría plantearse a este tema?
Muchas Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda con ïndices

Publicado por Isaias (3308 intervenciones) el 17/07/2007 01:31:55
Esto debe ser una broma, ¿no?, tienes un INDICE por un campo (¿de que tipo es?) donde se carga un ARCHIVO PLANO !!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda con ïndices

Publicado por eljhonb (124 intervenciones) el 17/07/2007 05:21:32
excúsame, pero no entiendo cual es la broma.
yo dije "ese campo se carga DE un archivo plano" es decir el campo se llena con info que llega de un archivo plano, no dije que el campo carga UN ARCHIVO PLANO.
Creo que tuviste un error de comprensión de lectura ahí. o a lo mejor no me hice entender bien.

Volviendo al tema, te digo que a ninguno de los dos campos se les puede cambiar el tipo. como hacer entonces para que al momento de hacer la comparación no se pierda el indice con un cast?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda con ïndices

Publicado por eljhonb (124 intervenciones) el 17/07/2007 14:22:33
el error que muestra es este:
Cannot resolve collation conflict for equal to operation.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda con ïndices

Publicado por Isaias (3308 intervenciones) el 17/07/2007 19:47:20
Mil disculpas por el anterior post, creo que entendi mal.

El problema que tienes es de COLLATION (intercambio de caracteres entre columnas).

Ejecuta:

sp_help tutabla

Y revisa que tipo de COLLATION tienes declarado en el campo en cuestion, para hacer la comparacion, debes indicarle a SQL SERVER que tipo de collate ocupar

WHERE myColumna SQL_Latin1_General_CP1_CI_AS
= TuOtraColumna SQL_Latin1_General_C1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda con ïndices

Publicado por eljhonb (124 intervenciones) el 17/07/2007 23:40:25
No hay problema, en ocasiones nos equivocamos.

Con esto no omite los índices que existan sobre esos campos?
Muchas Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda con ïndices

Publicado por eljhonb (124 intervenciones) el 18/07/2007 00:01:10
No me hace la consulta.

SELECT *
FROM A JOIN [otraBD].[dbo].[B]
ON A.C1 Modern_Spanish_CI_AS = B.C2 SQL_Latin1_General_CP1_CI_AS

Muestra el siguiente error:

Server: Msg 170, Level 15, State 1, Line 3
Line 3: Incorrect syntax near 'Modern_Spanish_CI_AS'.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda con ïndices

Publicado por Isaias (3308 intervenciones) el 18/07/2007 00:19:48
¿Ya revisaste con SP_HELP tutaba, que COLLATE tienes?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda con ïndices

Publicado por Isaias (3308 intervenciones) el 18/07/2007 00:24:34
Agrega la clausula COLLATE despues del nombre de tu campo.

WHERE campoX COLLATE tuCollate = campoZ COLLATE tuOtroCollate
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda con ïndices

Publicado por eljhonb (1 intervención) el 18/07/2007 00:37:59
Sí, ya ejecute el sp_help para ver que collate tiene cada uno de los campos.
Agregué la clausula COLLATE como me lo indicaste y muestra el siguiente error

Server: Msg 449, Level 16, State 1, Line 1
Collation conflict caused by collate clauses with different collation 'Modern_Spanish_CI_AS' and 'SQL_Latin1_General_CP1_CI_AS'.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ya lo solucioné

Publicado por eljhonb (124 intervenciones) el 18/07/2007 14:59:08
ya lo solucioné, muchas gracias.
el problema era el siguiente:

WHERE campoX COLLATE tuCollate = campoZ COLLATE tuOtroCollate
si haces esto, no estás haciendo nada, pues de todas maneras los dos campos tienen collate´s diferentes.

toes lo que hice fue ponerle el collete de un campo al otro para así hacer que en la consulta los dos tengan el mismo collate.
ej:

C1 tiene collate1
C2 tiene collate2

WHERE C1 COLLATE2 = C2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ya lo solucioné

Publicado por Isaias (3308 intervenciones) el 18/07/2007 19:56:39
Esa PRECISAMENTE es la idea, que con la instruccion COLLATE, cambies el collate que tiene el campo y lo iguales al otro que tiene el OTRO CAMPO.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ya lo solucioné

Publicado por eljhonb (124 intervenciones) el 18/07/2007 20:37:19
haciendo la comparación en estas condiciones sigue manteniendo el índice, es decir, toma el índice que exista sobre el campo y no lo bota como lo hace cuando se hace un CAST, cierto?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar