Mostrando entradas con la etiqueta oracle. Mostrar todas las entradas
Mostrando entradas con la etiqueta oracle. Mostrar todas las entradas

20080319

Las 8 preguntas de las consultoras Big-5 al iniciar un proyecto


En el post "Question your work", Jason de 37 signals nos proponía 8 preguntas que debes hacerte antes de iniciar un proyecto (en mi caso para clientes).



Considero estas 8 preguntas muy interesantes y, consciente o inconscientemente, siempre las planteo en los proyectos que abordamos.

Las 8 preguntas originales son estas:

1. ¿Por qué estamos haciendo esto?
2. ¿Qué problema estamos solucionando?
3. ¿Es esto realmente útil?
4. ¿Estamos añadiendo valor?
5. ¿Cambiará la manera de hacer las cosas?
6. ¿Hay alguna manera más fácil de hacerlo?
7. ¿Cuál es el coste de oportunidad?
8. ¿Realmente vale la pena?

Pues resulta que hace unos días tuve una reunión con unos ex-Consultores de una Big-5 que me recordo a mis mejores épocas rodeado de Arturitos en Sony. Entiendo que un director de una consultora high-level, al cabo de los años y con la experiencia acumulada en mil proyectos, resumiría sus ocho preguntas más o menos así:

1. ¿Tiene sangre (pa$ta) el cliente? ¿Está dispuesto a que alguien le chupe la sangre (tiene presupuesto)? Si no es así, más vale echar a correr, no sigas leyendo.
2. ¿Puedo ser yo el que se lleve el proyecto? ¿Tengo algún conocido/pariente/networking dentro del cliente que me ayude a conseguirlo?
3. ¿Es posible que el proyecto que estoy intentando vender sea totalmente inútil, pero tan caro, que el director general de la compañia apruebe el presupuesto, aunque sea para vacilar con sus amigos directores generales mientras juega a golf?
4. ¿Tengo acceso al susodicho director general, el que toma las decisiones, y me da igual lo que opinen el resto de empleados que realmente utilizarán la herramienta?
5. Aunque el proyecto sea un fracaso, ¿tengo algún cabeza de turco a quien culpar? Es ideal escoger algún empleado del cliente, que son los peor vistos por las altas esferas, si puede ser el único que lo ha dado todo por el proyecto, mejor; ¡así seguro que salen más proyectos en el cliente!
6. ¿Soy capaz de incorporar un equipo de Análisis de como mínimo 5 personas y que creen un PowerPoint de mínimo 30 Slides, lleno de obviedades, antes de la firma del proyecto y por supuesto facturar todos estos recursos (de perfil recién licenciado) a precio de MBA de Stanford?
7. ¿Puedo colocar algún consultor mega-experto de Madrid (si estás en Barcelona) o de Barcelona (si estás en Madrid)? Luce un montón, sacarás algo más de margen con las dietas y encima siempre tienes tema de conversación con él. El lunes a media mañana cuando llega: "¿Cómo ha ido el vuelo?" y el viernes después de comer: "¿A qué hora tienes el vuelo?"
8. ¿Tengo algún perfil del tipo high-level-project-manager, si puede ser gordito y bonachón mejor, que sólo vaya a la primera y a la última reunión del proyecto y cuyo propósito principal sea invitar a comer o cenar a toda la cúpula directiva y después tomar unos cubatas y lo que surja?

Como veréis, no soy muy amigo de los consultores de alto nivel, ya que se comen los jugosos presupuestos grandes dejando las migajas que realmente aportan valor para las pequeñas pymes tecnológicas :)

20061122

Unes quantes queries per trobar bottlenecks a Oracle

Totes les queries que es mostren a continuació fan servir les "taules" gv$ que son per instal·lacions en RAC, si teniu versions anteriors substituir gv$ per v$

Tampoc he provat amb diferents versions d'Oracle, a mi em funciona amb Oracle 10gR2

Bloquejos


Query per mirar bloquejos, diu el sql_text que esta bloquejant, pot servir com a pista per eliminar colls d'ampolla provocats per bloquejos.

select t.SQL_TEXT, t.LAST_ACTIVE_TIME, c.owner, c.object_name
, DECODE(l.block, 0, 'Not Blocking', 1, 'Blocking', 2, 'Global') STATUS
, DECODE(a.locked_mode, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(lmode)) MODE_HELD
, DECODE(l.type, 'RT','Redo Log Buffer', 'TD','Dictionary', 'TM','DML', 'TS','Temp Segments', 'TX','Transaction', 'UL','User', 'RW','Row Wait', l.type) LOCK_TYPE
, c.object_type, s.sid, s.serial#, s.status, s.osuser, s.machine, s.logon_time
from gv$sqlarea t
, gv$process p
, gv$lock l
, gv$locked_object a
, gv$session s
, dba_objects c
where s.sid = a.session_id
and a.object_id = c.object_id
and p.addr = s.paddr
and t.ADDRESS=s.SQL_ADDRESS
and (a.object_id = l.id1)
order by s.inst_id, s.username, s.logon_time


Long Ops


Permet veure un històric de sessions que han trigat molt i el seu sql associat, la taula dba_hist_sqltext ha estat tot un descobriment perquè pots mirar sqls històrics que han provocat colls d'ampolla o fins i tot casques de Base de Dades...

select lo.START_TIME, to_char(substr(st.sql_text, 1, 3000)) sql, lo.opname, lo.target, lo.TOTALWORK
from dba_hist_sqltext st
, gv$session_longops lo
where (lo.target_desc is null or lo.TARGET_DESC not like '%$%')
and lo.username!='SYS'
and lo.SQL_ID=st.sql_id
order by lo.start_time desc


FULL SCANS històrics


Aquesta query busca a l'històric de explain plans (un altre descobriment la dba_hist_sql_plan) i treu una estadística dels objectes sobre els que s'han fet mes full scans

select dhsp.object_owner, dhsp.object_name, count(*) num, sum(dhsp.cpu_cost) sum_cpu_cost, min(timestamp) primera_execucio, max(timestamp) ultima_execucio
from Dba_Hist_Sql_Plan dhsp
where dhsp.operation = 'TABLE ACCESS'
and dhsp.options='FULL'
and dhsp.object_owner!='SYS'
and dhsp.object_owner!='SYSTEM'
and dhsp.object_owner!='SYSMAN'
group by dhsp.object_owner, dhsp.object_name
order by count(*) desc, sum(dhsp.cpu_cost) desc
--order by timestamp desc


Full scans històrics amb la query que provoca el full scan


Igual que l'anterior pero et diu la query que esta provocant el full scan en questio

select to_char(substr(dhst.sql_text, 1, 3000)) sql, dhsp.object_owner, dhsp.object_name, count(*)
from dba_hist_sqltext dhst
, Dba_Hist_Sql_Plan dhsp
where dhsp.operation = 'TABLE ACCESS'
and dhsp.options='FULL'
and dhsp.object_owner!='SYS'
and dhsp.object_owner!='SYSTEM'
and dhsp.object_owner!='SYSMAN'
and dhsp.sql_id=dhst.sql_id
group by to_char(substr(dhst.sql_text, 1, 3000)), dhsp.object_owner, dhsp.object_name
order by count(*) desc



Com sempre dic, la millor eina per un DBA cada vegada que esta buscant taules de diccionari noves de versió a versió o busca a cegues informació útil que tingui emmagatzemada internament el gestor de BD, es fer la següent query:


select * from dict;


Que treu totes les taules del diccionari d'Oracle amb una descripció.


Gracies a aquestes queries, al suport del nostre estimat DBA (Manel Palop) i a algun cop de mà extern de Nucli Experts, hem pogut passar de dos penjades de base de dades per setmana a que funcioni el sistema com una seda.

Evidentment, el problema era del desenvolupador (perque no dir-ho, meu !) que havia provocat contenció en una taula per un error de programació.

Però si no fas servir una base de dades perquè la tens ? Per això existeix el Tuning, no ?

:)

20061107

How-to output RFC822 dates in Oracle PL/SQL

There's a little to_char string that can help you in outputting RFC822 dates (the format required for RSS dates) in Oracle PL/SQL.


to_char(sysdate-(1/24),'Dy, DD Mon YYYY hh24:mi:ss','NLS_DATE_LANGUAGE=AMERICAN')||' GMT'


Beware that I've to take one hour off, because I'm in Spain, GMT+1, if you are in a different time zone you only have to add or substract the difference between GMT and your time zone.

I hope you will enjoy.