Archive for December, 2006

Seriedad de las empresas hoy en dia

December 27, 2006

No he podido resistir contar esta pequeña historia que estoy viendo.

Este año una empresa decidio outsourcear su departamento de Base de Datos a una empresa de servicios (aunque llamen a ellos mismos una consultora, no lo son). Pues hasta aqui todo normal y bien, esto de Outsourcing parece que esta de moda pero tambien algunos se estan dando cuenta que lo de ahorro no esta tan claro como se pinta. De hecho los de Gartner (estos que pon y quitan ellos mismos) predice que se va a reducir la tendencia de Outsourcing de aqui a 2010.

Cuando vas a concursar en un proyecto de Outsourcing el cliente te hace llegar informaciones sobre su plataforma de produccion y cuales son los perfiles que necesitan para cubrir los servicios. En este caso se necesitaba gente de base de datos y un perfil especifico para cubrir servicios de soporte de Oracle Aplicaciones (el ERP de Oracle) mas conocido en el extranjero como Applications DBA. Resulta que la empresa que se llevo el proyecto lleva seis meses y no son capaces de encontrar a nadie para el puesto de Apps DBA, es mas no saben ni lo que tiene el cliente! No saben que modulos utiliza, ni la version, ni la version de RDBMS, ni la version de Sistema Operativo. Y yo me pregunto como puedes pasar 6 meses buscando a alguien sin saber lo que buscas?

Esto es la seriedad de un multinacional con mas de 1000 empleados, no son los unicos pero peores pocos habra. De momento tiene lo que se merece, palmando pasta pagando a uno de la competencia y dando una pesima imagen al cliente.

Si pretendes de ir de Elite antes de todo un poquito de seriedad por favor.

Oracle 11g en 2007

December 24, 2006

Parece que la version nueva de la base de datos no va a tardar mucho en aparecer. Saldra entre el el segundo o tercer trimestre de 2007.
Como siempre vendra con cientos de funcionalidades nuevas (la 10g vino con cuatro cientas y pico si no recuerdo mal).
Uso de NFS para RAC (cliente nativo de NFS), replay de SQL, migración online de aplicaciones, indices invisibles para el Optimizador, compilador nativo de PL/SQL, mejoras de funciones de expresiones regulares etc.

Como evitar join 2000 veces

December 11, 2006

Hace un par de semanas se me quejaron los usuarios que les iba a pedales la aplicacion, un ERP que lee datos de otro CRM.

Esta era la consulta:

 
SELECT COUNT(*)
FROM VSA_PARTIES_V PARTIES,
     VGIA_SOLICITUDES_V SOLICITUDES
WHERE PARTIES.CUST_ACCOUNT_ID = SOLICITUDES.CLIENTE_ID
AND   PARTIES.JGZZ_FISCAL_CODE = :b1
AND SOLICITUDES.SOL_ESTADO NOT IN ('Cerrada','Anulada' )

15   14  NESTED LOOPS (Cost=19 Card=1 Bytes=61)
16   15    VIEW OF ‘VSA_PARTIES_V’ (Cost=13 Card=2 Bytes=50)
17   16      SORT (GROUP BY) (Cost=13 Card=2 Bytes=200)
18   17        FILTER
19   18          NESTED LOOPS (OUTER)
20   19            NESTED LOOPS (Cost=7 Card=2 Bytes=176)
21   20              TABLE ACCESS (BY INDEX ROWID) OF ‘HZ_PARTIES’ (Cost=4 Card=1 Bytes=65)
22   21                INDEX (RANGE SCAN) OF ‘HZ_PARTIES_N10' (NON-UNIQUE) (Cost=3 Card=1)
23   20              TABLE ACCESS (BY INDEX ROWID) OF ‘CS_INCIDENTS_ALL_B’ (Cost=3 Card=707915 Bytes=16282045)
24   23                INDEX (RANGE SCAN) OF ‘CS_INCIDENTS_N2' (NON-UNIQUE) (Cost=2 Card=707915)
25   19            TABLE ACCESS (BY INDEX ROWID) OF ‘HZ_CUST_ACCOUNTS’ (Cost=2 Card=2447425 Bytes=29369100)
26   25              INDEX (UNIQUE SCAN) OF ‘HZ_CUST_ACCOUNTS_U1' (UNIQUE) (Cost=1 Card=2447425)
27   15    TABLE ACCESS (BY INDEX ROWID) OF ‘CS_INCIDENTS_ALL_B’ (Cost=3 Card=707915 Bytes=25484940)

Las dos tablas del from son en efecto vistas, bastante complejas que no voy a colocar las definicion aqui porque ocupan mazo de sitio. El problema estaba en el paso 15. La condicion de join.

PARTIES.CUST_ACCOUNT_ID = SOLICITUDES.CLIENTE_ID

Resulta que cuando el result set de la vista VSA_PARTIES_V (devuelve 2000 registros) hace join con la vista de VGIA_SOLICITUDES_V, el valor de PARTIES.CUST_ACCOUNT_ID no varia en los 2000 registros, es decir que hace la join con Nested Loop 2000 veces con el mismo CUST_ACCOUNT_ID. Cada busqueda por Nested Loop eran 70000 consistent gets, la query en si leia 140 millones de consistent gets y tardaba 1 hora aproximadamente. Consegui reducir a 1.5 segundos, reduciendo de 2000 busquedas a una con funciones analiticas.

 
SELECT COUNT (*)
  FROM (SELECT ROW_NUMBER () OVER (PARTITION BY party_id, jgzz_fiscal_code,
                                                party_name, cust_account_id, orig_system_reference,
                                                codigo_empresa ORDER BY jgzz_fiscal_code) rn,
               x.*
          FROM vsa_parties_v x) parties,
       apps.vgia_solicitudes_v solicitudes
 WHERE parties.cust_account_id = solicitudes.cliente_id
   AND parties.jgzz_fiscal_code = :b1
   AND solicitudes.sol_estado NOT IN (’cerrada’, ‘anulada’)
   AND rn = 1

Trabajando con las vistas hay que tener mucho cuidado con el uso de ROWNUM, Funciones de Agrupacion y Funciones Analiticas por posible reescritura de Query por Oracle (complex view merging, push predicates etc.). La otra solucion era modificar la definicion de vista para que haga un distinct CUST_ACCOUNT_ID sin embargo la opcion no era viable porque yo no desarrolle la aplicacion y no sabia en donde mas se utilizaba estas vistas, cambiando la vista podria afectar a otras funcionalidades.

Eres un Monstruo eBay!

December 8, 2006

He leido una presentacion sobre la arquitectura de eBay, verdaderamente IMPRESIONANTE!

Los datos hablan por si mismos:
200 millones de usuarios registrados
2 Petabytes de datos
26000 millones de SQL por dia!
100000 lineas de codigo nuevo cada 2 semana

eBayForum 2006

Oracle 10.2.0.3 Patchset

December 8, 2006

Llevaba tiempo esperando que se libere el patchset 10.2.0.3, basicamente motivado por las instalaciones de RAC que he estado haciendo y por los whitepapers de Openworld 2006. Pues bien ya esta disponible desde hace una semana sin embargo no para las plataformas que esperaba (Solaris Sparc 64 y Linux x64). De momento esta para Linux 32 Bit y Microsoft Windows 32 Bit.

La salida de 10.2.0.3 supone otra posibilidad mas para RAC, ahora es posible utilizar Reliable Datagram Sockets con Infiniband, interconexion de altas prestaciones.

Update 2007-01-02: Disponible el patchset 10.2.0.3 para Solaris Sparc 64, desde el 1 de enero de 2007.
Update 2007-01-03: Disponible el patchset 10.2.0.3 para Linux x64, Windows x64 y Windows IA64
Update 2007-01-10: No aplicar el patchset 10.2.0.3 para Solaris Sparc 64, Oracle lo esta revisando. El parche no es compatible con Veritas Filesystem! Note:405825.1 en Metalink.