2010-10-10 19 views
12

Oracle permite especificar la precisión del tipo TIMESTAMP en una tabla: el número de dígitos en la parte fraccional del campo de fecha y hora SECOND. ¿Hay alguna desventaja de especificar la precisión máxima TIMESTAMP(9)?¿Cuáles son las desventajas de elegir una mayor precisión de marca de tiempo en Oracle?

Una de las razones por las que podría pensar es que esta información puede usarse para obtener resultados más bonitos de las herramientas de Oracle.

Un máximo de 9 dígitos sugiere que el campo está almacenado como un entero de 4 bytes, por lo que no debería tener ninguna implicación en el rendimiento. Corrija si estoy equivocado aquí.

Respuesta

14

No hay inconvenientes, utilice la marca de tiempo (9) si tiene sentido.

La marca de tiempo (9) y la marca de tiempo (1) utilizan la misma cantidad de espacio, y su rendimiento es idéntico. Solo pude encontrar un caso en el que hubo una diferencia de rendimiento, y en ese caso la marca de tiempo (9) fue en realidad más rápida que la marca de tiempo (1).

(Les ahorraré las muchas líneas de código aburrida insertar en marca de tiempo (1) y la marca de tiempo (9) y la comparación de diferentes columnas operaciones con ellos.)

Esto demuestra que utilizan la misma cantidad de el espacio (la inserción de muchos valores y comparando dba_segments):

--Create tables with timestamps and populate them with the same data (with different precision) 
--Set initial and next to a low value so we can closely check the segment size) 
create table timestamp1 (t1 timestamp(1), t2 timestamp(1), t3 timestamp(1), t4 timestamp(1), t5 timestamp(1)) 
storage(initial 65536 next 65536); 

insert into timestamp1 
select current_timestamp(1), current_timestamp(1), current_timestamp(1), current_timestamp(1), current_timestamp(1) 
from dual connect by level <= 100000; 

create table timestamp9 (t1 timestamp(9), t2 timestamp(9), t3 timestamp(9), t4 timestamp(9), t5 timestamp(9)) 
storage(initial 65536 next 65536); 

insert into timestamp9 
select current_timestamp(9), current_timestamp(9), current_timestamp(9), current_timestamp(9), current_timestamp(9) 
from dual connect by level <= 100000; 


--Segment size is identical 
select segment_name, bytes from dba_segments where segment_name in ('TIMESTAMP1', 'TIMESTAMP9'); 

--SEGMENT_NAME BYTES 
--TIMESTAMP1  8388608 
--TIMESTAMP9  8388608 

Esto es donde marca de tiempo (9) es más rápido, cuando se utiliza current_timestamp, que es probable que necesite usar en algún momento de generar los datos. Pero solo estamos hablando de la diferencia entre aproximadamente 0.175 y 0.25 segundos en mi escritorio lento para generar 100K marcas de tiempo. No estoy seguro de por qué la marca de tiempo (9) es más rápida, tal vez las marcas de tiempo siempre se generan como marcas de tiempo (9) y luego se redondean a otras precisiones.

--current_timestamp(9) is slightly faster than current_timestamp(1) 
select count(*) from 
(
    select * 
    from dual 
    --where current_timestamp(9) = current_timestamp(9) 
    where current_timestamp(1) = current_timestamp(1) 
    connect by level <= 100000 
); 

EDITAR: La diferencia de rendimiento existe en 10g pero no en 11g.

0

El problema es el rendimiento. Debe cambiarlo con precisión. Los números más pequeños se readen y escriben en menos instrucciones de CPU. Una instrucción de CPU demora menos de un nanosegundo, pero si su servidor realiza millones de transacciones, es posible que disminuya el rendimiento y esto sugiere que adopte menos precisión o incluso ninguna precisión (redondear todas las marcas de tiempo a los segundos es bastante aceptable en la mayoría de los casos) , incluso en la banca).

Pero si usted, por alguna razón, es decir. el registro del sistema en tiempo real, necesita más precisión, se le obliga a utilizar una mayor precisión y, por lo tanto, obtener una disminución del rendimiento. Si su servidor no procesa una gran cantidad de tps, casi no tiene impacto en el rendimiento, pero si no necesita precisión, está desperdiciando memoria.

Espero haber sido de ayuda. Si desea compartir con nosotros sus requisitos de DB, podemos ayudarlo a elegir su mejor compromiso.

+0

¿En qué se diferencia TIMESTAMP (1) exactamente de TIMESTAMP (9) desde la perspectiva del rendimiento? Las segundas fracciones no se almacenan como un entero de todos modos, por lo que no debería afectar a la CPU en absoluto en las búsquedas, por ejemplo. ¿Estás seguro de que TIMESTAMP (1) ocupa menos memoria internamente que TIMESTAMP (9)? – Leonid

+0

¡Acaba de llegar al punto! SQL es declarativo, no tiene ninguna garantía de que TIMESTAMP (1) sea más pequeño que TIMESTAMP (9). Por ejemplo, Oracle para la plataforma de 64 bits puede decidir almacenar todas las marcas de tiempo, sin importar su elección, como enteros de 64 bits sin decírselo. Pero si especifica TIMESTAMP (9), Oracle le garantiza que nunca perderá precisión. Acerca del rendimiento, repito, podría notar una pérdida de rendimiento solo en ** cargas muy pesadas **, lo que podría ser improbable o no según su aplicación –

+0

Mi pregunta es de dónde viene ** la pérdida de rendimiento ** en caso de indicación de la hora. si Oracle usa enteros para almacenar fracciones de segundo? TIMESSTAMP aquí en cuestión es de tipo Oracle y no tiene nada que ver con SQL. – Leonid

0

La diferencia no radica en el uso técnico del tipo de datos Timestamp, sino en la aplicación. FERC y NERC a menudo requieren una cierta precisión cuando se usan en las aplicaciones etiquetadas critical infrastructure y como tales, usarán la mayor precisión disponible.

Por supuesto, hacer los trajes felices con su secuencia de eventos registros requiere a menudo haciendo más que establecido por CIP-002 through CIP-009

0

No hay desventajas si siempre va a utilizar los datos como "fecha/fecha y hora" tipo de datos dentro de Oracle y en el nivel medio, sin embargo, debe ver cómo su aplicación/solución completa está utilizando esa columna.

  • ¿Está truncando los datos antes de mostrarlos?
  • ¿Es un requisito de cumplimiento y se lee principalmente?
  • ¿Está convirtiendo esa columna en una cadena para compararla con otra columna?
  • ¿Es un requisito para la auditoría o para la captura de pedidos?

No se preocupe demasiado por las lecturas y escribe las diferencias de rendimiento, no hay importancia, evalúe sus requisitos generales como un todo, desde el almacenamiento hasta la IU.

Cuestiones relacionadas