anonymous Log in
Search
Recents:
v3.0
gx-l
Me dice un DBA: GeneXus lo hace mal, hace un Index Unique en vez de Constraint
14/01/21 19:08

Gabriel Medina

Replies: 11

Hola Amigos,
*Me dice un DBA:* GeneXus lo hace mal, hace un Index *Unique* en vez de
hacer una Constraint
Y además He creado un índice *unique *que incluye una FK, y le hace un Drop
al índice previo de la FK, cosa que me sorprendió gratamente, pero mi *amigo
DBA *me dice que Gx comete *UN ERROR al *hacer un DROP de un índice
ForeignKey que es óptimo en las búsquedas cuando es de una sola columna.
*CASO:*
*EmpresaTRN:*
*EmpresaId**
*EmpresaNombre*
*DeparatamentoTRN:*
*DepartamentoId**
*DepartamentoNombre*
*DepartamentoCodigo *
*EmpresaId*
-- Como necesito que NO se dupliquen los códigos de departamento dentro de
cada empresa hice un índice
*UNIQUE Compuesto xEmpresaId*DepartamentoCodigo**
Por esta razón Gx borró el indice de la FK x EmpresaId, y dejo un sólo
indice porque con eso *basta*, y a mi me gustó, pero mi amigo el *DBA, *me
dice que está mál que eso no va a ser performante.
-----
Yo estoy conforme y *de acuerdo* con lo que GeneXus hace, alguno de los
participantes del foro podría darme argumentos para convencer al *DBA que
GeneXus hizo lo correcto?*
Muchas gracias por la ayuda!
*TODA respuesta será muy bienvenida y usada -en lo posible- para defender a
mi querido GeneXus.*
--
Saludos,
gab
@gxsoft
-----------------------------------------
Para Suscribirse/Desuscribirse:
http://www.gxtechnical.com/cgi-bin/hforum.exe?2,3,30,1
Por consultas owner-gx-l@gxtech.com.uy
Replies

Enrique Almeida

14/01/21 20:23
Gabriel, podes mirar la preference "Primary Key Definition Property | Article" https://wiki.genexus.com/commwiki/servlet/wiki?7826,Primary%20Key%20Definition%20Property que te deja crear constraints en vez de index. Enrique El jue., 14 de enero de 2021 19:09, Gabriel Medina

leandro79337933

14/01/21 20:58
Hola Gab, hay que ver como es "bajo el capó" en otros RDBMSes, pero en SQL Server no hay diferencias significativas. De aqui (versiones SQL viejas): https://docs.microsoft.com/en-us/previous-versions/sql/legacy/aa224827(v=sql.80)?redirectedfrom=MSDN podemos concluir lo siguiente: """ In summary, we can safely conclude that there's no practical difference between a unique constraint and a unique index other than the fact that the unique constraint is also listed as a constraint object in the database. Since a unique constraint can't be disabled, having the status of a constraint doesn't give the unique constraint any additional behavior beyond a unique index. However, there are several index creation options that aren't available to the ALTER TABLE command that creates a unique constraint. """ y de aqui (versiones SQL más nuevas): https://docs.microsoft.com/en-us/sql/relational-databases/indexes/create-unique-indexes?redirectedfrom=MSDN&view=sql-server-ver15 masomenos lo mismo: """ There are no significant differences between creating a UNIQUE constraint and creating a unique index that is independent of a constraint. Data validation occurs in the same manner, and the query optimizer does not differentiate between a unique index created by a constraint or manually created. However, creating a UNIQUE constraint on the column makes the objective of the index clear. """ Por ultimo, el DROP de la FK EmpresaId en la tabla DepartamentoTRN es, podríamos decir, *correcto*. Funcionalmente necesitas el constraint UNIQUE por EmpresaId + DepartamentoCodigo. Hasta cierto punto es válido lo que indica el DBA que es más óptimo un índice de 1 sola columna. Pero si no se elimina el índice EmpresaId entonces quedarían 2 índices, uno para la FK y otro para el UNIQUE. Esto degradaria más la performance durante los inserts/updates/deletes ya que el motor tiene que mantener 2 índices en lugar de uno. Slds On Thu, Jan 14, 2021 at 7:09 PM Gabriel Medina

Gabriel Medina

15/01/21 12:32
Muchas gracias Enrique, VOY a leer el artículo. NO SABÍA, y ahora te pregunto: vos ves alguna conveniencia de Creacion de Connstrains en vez de UNIQUEs? Tenés alguna recomendación? -- Saludos, gab @gxsoft On Thu, Jan 14, 2021 at 8:23 PM Enrique Almeida

Gabriel Medina

15/01/21 12:34
Hola Leandro, Muchas gracias por tur espuesta. voy a leerlo con detenimiento. Mi pregunta es: Tenés alguna recomendación? -- Saludos, gab @gxsoft On Thu, Jan 14, 2021 at 8:59 PM Leandro Minatel

Enrique Almeida

15/01/21 13:24
Yo prefiero tener índices Unique e integridad referencial en la base (que agrega constraints a la base). El vie., 15 de enero de 2021 12:34, Gabriel Medina

leandro79337933

15/01/21 13:41
Hola Gab, recomendación? bueno, como DBA mi función es administrar las bases de datos, tal como indican sus siglas. Obviamente estoy al servicio de los desarrolladores cuando necesitan asesoramiento, consejos o experiencias sobre el funcionamiento interno de un motor de bd. Jamás juzgaría algo sin saber los motivos que llevaron a esa solución, o mejor dicho, saber el "¿por qué?". Cuando un DBA empieza una frase con "GeneXus lo hace mal", denota que es un tema personal. Como te comentaba en el mail, "*no hay diferencias significativas*" en el UNIQUE con indice vs constraint. Si se hubiese definido con constraint, el SQL Server igualmente termina creando un índice, tal como indica el primer link. Si tu DBA tiene razones técnicas que justifiquen que está mal, me gustaría escucharlas. :) Slds On Fri, Jan 15, 2021 at 12:36 PM Gabriel Medina

leandro79337933

15/01/21 14:46
Hola Enrique, alguna razón en especial para definir las PK como índices unique en lugar de PK? On Fri, Jan 15, 2021 at 1:25 PM Enrique Almeida

Gabriel Medina

19/01/21 06:29
Muchas gracias Enrique. Justamente una de las cosas que nunca estoy seguro es de qué es lo más conveniente. Afortunadamente, en general no me ha tocado decidir este tipo de cosas en *sistemas grandes en producción, *casos en los que las decisiones las toman los *DBA* o responsables. Pero en me caso particular, en mis sistemas que NO son grandes, *muchas veces prefiero* *NO tener* *Referencial *Integrity , porque las reorgs fallan menos, y cuando fallan me causa mucha impotencia... en fin, creo que es por desconocimiento, algunos colegas dicen que 1) *No es eficiente* 2) *La fallas de reorg *que podrían evitarse, son a causa de que la DB ya no está bien en su integridad referencia... 3) Lo que yo digo es que a veces por una "tablita" de poca importancia falla la Reorg, y los cambios importantes no se pueden realizar automáticamente... En fin, está muy mal tener configurado "Declare referencial integrity = *NO"* Por último el mismo amigo (DBA) me ha pasado un script para *Deshabilitar RI*, antes de correr la *Reorg de Gx*, y luego *Habilitar RI*, es un recurso interesante. Si alguno quiere ese Script me lo pide. -- Saludos, gab @gxsoft On Fri, Jan 15, 2021 at 1:25 PM Enrique Almeida

Gabriel Medina

19/01/21 06:40
Hola Leandro, Gracias por tu respuesta. Creo que el argumentaba, que *"era lo que debía hacerse"* que para eso estaba. Pero además el hacer DROP de el *otro índice natural*, de la *FK *el decía que podría afectar la performance y que se debería haber dejado, borrarlo podía quitarle performance a la búsqueda. Por otro lado, te copio lo que le pregunté a Enrique, por si no lo viste: * TEMA *configurar la DB con *Referencial Integrity= : * Justamente una de las cosas que nunca estoy seguro es de qué es lo más conveniente. Afortunadamente, en general no me ha tocado decidir este tipo de cosas en *sistemas grandes en producción, *casos en los que las decisiones las toman los *DBA* o responsables. Pero en me caso particular, en mis sistemas que NO son grandes, *muchas veces prefiero* *NO tener* *Referencial *Integrity , porque las reorgs fallan menos, y cuando fallan me causa mucha impotencia... en fin, creo que es por desconocimiento, algunos colegas dicen que 1) *No es eficiente* 2) *La fallas de reorg *que podrían evitarse, son a causa de que la DB ya no está bien en su integridad referencia... 3) Lo que yo digo es que a veces por una "tablita" de poca importancia falla la Reorg, y los cambios importantes no se pueden realizar automáticamente... En fin, está muy mal tener configurado "Declare referencial integrity = *NO"* Por último el mismo amigo (DBA) me ha pasado un script para *Deshabilitar RI*, antes de correr la *Reorg de Gx*, y luego *Habilitar RI*, es un recurso interesante. Si alguno quiere ese Script me lo pide. -- Saludos, gab @gxsoft On Fri, Jan 15, 2021 at 1:42 PM Leandro Minatel

rdiaz

20/01/21 13:16
Estimado, ayúdame con el Script.

Gabriel Medina

21/01/21 23:09
Hola Rolando, Aqui va cambiar *(**DataBaseName**) por tu DB* Son 2 partes la primera *Desaciva, y la segunda parte Re-Activa.* (antes hace BackUp). ------ -- Script de Deshabilitar Referencial Integrity (DBAFriend Marcos) -- PARTE I Deshabilita RI, PARTE II Habilita RI -- PARTE I --- Deshabilita TODAS las Claves Foraneas DECLARE @TableName nvarchar(100) = ''; DECLARE TableNames CURSOR FOR SELECT TABLE_NAME FROM DataBaseName.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'; OPEN TableNames FETCH NEXT FROM TableNames INTO @TableName WHILE @@fetch_status = 0 BEGIN if CHARINDEX('_ini',@TableName) <= 0 BEGIN if(@TableName != 'sysdiagrams') BEGIN PRINT 'ALTER TABLE ' + @TableName + ' NOCHECK CONSTRAINT ALL' END END FETCH NEXT FROM TableNames INTO @TableName END CLOSE TableNames DEALLOCATE TableNames -- PARTE II --- Habilita las Claves Foraneas DECLARE @TableName nvarchar(100) = ''; DECLARE TableNames CURSOR FOR SELECT TABLE_NAME FROM DataBaseName.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'; OPEN TableNames FETCH NEXT FROM TableNames INTO @TableName WHILE @@fetch_status = 0 BEGIN if CHARINDEX('_ini',@TableName) <= 0 BEGIN if(@TableName != 'sysdiagrams') BEGIN PRINT 'ALTER TABLE ' + @TableName + ' WITH CHECK CHECK CONSTRAINT ALL' END END FETCH NEXT FROM TableNames INTO @TableName END CLOSE TableNames DEALLOCATE TableNames ------ Suerte, gab Ver las Imágenes. https://gabimages.blogspot.com/2021/01/enabledisable-referential-integrity-ms.html -- Saludos, gab @gxsoft On Wed, Jan 20, 2021 at 1:39 PM ROLANDO DIAZ


Back to gx-l