Вы находитесь на странице: 1из 16

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________

Clase 2: Estructuras Lgicas y Fsicas(I)


Introduccin a Segmentos, Extents y bloques de datos Bloque de datos

Inittrans, Maxtrans

Extents Segmentos Clusula Storage Introduccin tablespaces, datafiles Tablespaces Datafiles Tablas

Regulares Organizadas por ndices Particionadas Clster

Se puede hacer un repaso de la relacin entre las estructuras lgicas y fsicas....

Relacin estructuras lgicas y fsicas

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________ Estructuras Fsicas: bloque de datos del sistema operativo, datafile, redo log file, control file. Estructuras Lgicas: bloque de datos de Oracle, extent, segmento, tablespace, base de datos.

Bloques de Datos, Extents y Segmentos


Introduccin
Las unidades de asignacin de espacio en la base de datos son los bloques de datos, extents y segmentos. El nivel ms fino de granularidad en que Oracle almacena los datos es el bloque de datos (tambin llamados bloques lgicos, bloques de Oracle o pginas). Un bloque de datos corresponde a un nmero de bytes fsicos de espacio de la base de datos en disco. Un segmento es un conjunto de extents, cada uno de los cuales ha sido asignado a una estructura de datos especficas, pertenecientes a un tablespace. Por ejemplo, cada tabla de datos es almacenada en su propio segmento de datos, mientras que cada ndice de datos es almacenado en su propio segmento de ndices. Si la tabla o ndice es particionado, cada particin es almacenada en su propio segmento.

Bloques de Datos
Oracle maneja el espacio de almacenamiento en datafiles de una base de datos en unidades llamadas bloques de datos. Un bloque de datos es la unidad ms pequea de datos usada por una base de datos. Oracle solicita los datos en mltiplos de los bloques de datos de Oracle y no del sistema operativo. El tamao estndar del bloque se puede conocer consultando el parmetro DB_BLOCK_SIZE. Los tamaos de los bloques de datos deben ser un mltiplo de los tamaos de bloques del sistema operativo, entonado para evitar I/Os innecesarios.

Formato del Bloque de datos


Encabezado El encabezado contiene informacin general del bloque, como la direccin del bloque y el tipo de segmento (datos, ndices).

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________ Directorio de tablas Contiene informacin acerca de las tablas que contienen tuplas en el bloque. Directorio de Registros Contiene informacin de las tuplas actuales en el bloque (incluyendo direcciones para cada row piece trozo de registro en el rea de datos). Despus que el espacio ha sido asignado en el directorio de registros de un bloque de datos, ste no es reclamado cuando el registro es borrado. Oracle reutiliza el espacio slo cuando se insertan nuevos registros en el bloque. Overhead El encabezado del bloque de datos, directorio de tablas y directorio de registros son denominados de forma colectiva como overhead. Datos de los registros Contiene la tabla o datos de ndices. Los registros puede atravesar bloques. Espacio libre El espacio libre es asignado para la insercin de nuevos registros y para la actualizacin de registros que requieran espacio adicional. En los bloques de datos asignados para segmentos de datos de una tabla o clster o para los segmentos de un ndice, el espacio libre puede almacenar registros de transacciones. Un registro de una transaccin es requerido un un bloque para cada instruccin de INSERT, UPDATE, DELETE y SELECT FOR UDATE que accede una o ms registros en el bloque. En la mayora de los SOs un registro de una transaccin requiere 23 bytes.

Manejo del Espacio Libre


El espacio libre en un segmento se maneja mediante el uso de bitmaps en lugar de listas. El espacio liberado por una transaccin de DELETE y UPDATE puede utilizarse para nuevas instrucciones de INSERT si: Las instruccin de INSERT es de la misma transaccin y aparece luego de la instruccin que libera espacio, esta instruccin puede usar el espacio libre inmediatamente. La instruccin de INSERT esta en otra transaccin, no pertenece a aquella que liber el espacio, por lo que debe esperar

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________ por una instruccin de commit de aquella que libera el espacio para poder utilizarlo. El espacio liberado puede o no ser contiguo con el rea de espacio libre en el bloque. Oracle fusiona los espacios libres slo cuando: una instruccin de INSERT o UPDATE intenta usar un bloque que contiene suficiente espacio libre para contener un nuevo trozo de un registro y el espacio libre esta fragmentado.

Parmetros de los bloques


PCTFREE: el parmetro PCTFREE especifica el mnimo porcentaje de un bloque de datos para ser reservado como espacio libre para posibles actualizaciones de registros que han sido insertados en el bloque. PCTUSED: el parmetro PCTUSED especifica el porcentaje mnimo de un bloque que puede ser usado para un registro ms el overhead antes de que nuevos registros sean aadidos al bloque. Despus que un bloque se llena al lmite determinado por el PCTFREE, Oracle considera el bloque no disponible para la insercin de nuevos registros hasta que el porcentaje del bloque cae por debajo del parmetro PCTUSED. Hasta que este no se alcance, Oracle utiliza el espacio libre del bloque de datos slo para actualizaciones de registros que se encuentren en el bloque.

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________

Explicar bien el grfico anterior... INITTRANS y MAXTRANS permiten especificar el nmero inicial y mximo de slots para transacciones concurrentes que se crearn en el bloque que almacene ndices o datos. Los slots de transacciones se utilizan para almacenar la informacin de las transacciones que estn haciendo cambios sobre el bloque de datos en un instante dado. Una transaccin puede utilizar un slot si est cambiando mas de una fila o entrada de un ndice. INITTRANS, cuyo valor por defecto es 1 para los segmentos de datos y 2 para los segmentos de ndices, garantiza un mnimo nivel de concurrencia. Por ejemplo, si INITTRANS se define como 3 para cierto objeto lgico (y por lo tanto para los bloques de datos de los extents incluidos en los segmentos asociados al objeto), se asegura que al menos tres transacciones concurrentes podrn hacer cambios en el bloque. Si se requiere ms espacio (ms transacciones concurrentes requieren de alguno de los bloques de datos en el segmento) el espacio se tomar del espacio libre del bloque. MAXTRANS, cuyo valor por defecto es de 255, delimita el nmero de transacciones que pueden hacer cambios a los datos en un bloque de datos o ndices. Una vez definido, este parmetro garantiza que habr suficiente espacio en el bloque para albergar la informacin del nmero de

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________ transacciones indicadas.

Extents
Un extent es una unidad lgica de asignacin de espacio de almacenamiento en una base de datos hecha de un nmero continuo de bloques de datos. Uno o ms extents hacen un segmento. Cuando el espacio existente en el segmento est completamente usado, Oracle asigna un nuevo extent para el segmento. Cuando se crea una tabla, Oracle asigna el segmento de datos de la tabla con un extent inicial que se corresponde con un nmero de bloques de datos. Si los bloques de datos del extent inicial del segmento llegan a estar llenos y se requiere ms espacio, Oracle asigna un extent incremental para el segmento. Un extent incremental es un extent subsiguiente del mismo tamao que el anterior o ms grande. Por propsitos de mantenimiento, el encabezado del bloque de cada segmento contiene un directorio de los extents en el segmento.

Determinar el nmero y tamao de los extents


Los parmetros de almacenamiento expresados en trminos de extents definen los segmentos. Se pueden especificar estos parmetros en cada tabla y de no hacerlo se utilizan los del tablespace. Antes de Oracle8i, los tablespaces eran creados como dictionary managed. Los tablespaces manejados por el diccionario delegan el registro de la utilizacin del espacio a tablas del diccionario de datos. Desde Oracle8i se pueden crear tablespaces locally managed, que utilizan bitmaps (en lugar de tablas del diccionario de datos) para registrar el espacio libre e utilizado. Debido al mejor desempeo y facilidad de mantenimiento de los tablespaces locally managed se toma como defecto que todos los tablespaces excepto SYSTEM sern locally managed.

Cmo son asignados los Extents?


Inicialmente se determina un datafile candidato en el tablespace y luego se busca en el bitmap del datafile el nmero de bloques libres requeridos. Si el datafile no tiene suficiente espacio libre adyacente, entonces Oracle busca en otro datafile.

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________

En los tablespaces manejados por el diccionario de datos, cuando un segmento requiere un extent ms grande de los extents disponibles, Oracle identifica y combina los extents continuos para formar uno ms grande. sto se denomina fusin de extents. Este proceso no es necesario en los tablespaces manejados localmente, porque los bitmaps registran automticamente el espacio libre.

Cundo son liberados los extents?


En general, los extents de un segmento no son liberados por un tablespaces hasta que se borra el objeto que almacena los datos en el segmento. Cuando Oracle completa la ejecucin de una instruccin que requera un segmento temporal, automticamente borra el segmento temporal y regresa los extents asignados para el segmento al tablespace asociado (como extents libres). Muchas operaciones de ordenamiento pueden usar segmentos de ordenamiento en un tablespace temporal. Estos segmentos de ordenamiento son asignados slo una vez para la instancia y no son liberados despus del ordenamiento, pero permanecen disponibles para muchas otras operaciones de ordenamiento. Slo ocurre cuando se posee un tablespace temporal.

Segmentos
Un segmento es conjunto de extents que contiene todos los datos de una estructura de almacenamiento lgica (como puede ser una tabla) en un tablespace. Por ejemplo para cada tabla, Oracle asigna uno o ms extents para forma un segmento de datos de la tabla. Oracle utiliza 4 tipos de segmentos: Segmentos de Datos Segmentos de ndices

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________


Segmentos Temporales Segmentos de Ordenamiento

Segmentos de Datos
Son utilizados para almacenar los datos de: Una tabla que no es particionada o clster Una particin de una tabla particionada Un clster de tablas

Segmentos de ndices
Cada ndice no particionado tiene un segmento para almacenar sus datos. En el caso de los ndices particionados cada particin tiene un segmento asignado

Segmentos Temporales
Las siguientes operaciones requieren del uso de segmentos temporales:

CREATE INDEX SELECT ... ORDER BY SELECT DISTINCT ... SELECT ... GROUP BY SELECT ... UNION SELECT ... INTERSECT SELECT ... MINUS

Los segmentos temporales se pueden almacenar en cualquier tablespace disponible para el usuario, uno de esos puede ser el tablespace temporal, se usa por defecto cuando el usuario tiene asignado algn tablespace temporal. Si no hay ningn tablespace temporal definido para el usuario se utiliza SYSTEM. Oracle borra los segmentos temporales cuando la instruccin se completa. Las tablas temporales se almacenan en segmentos temporales. Las tablas temporales pueden tener el alcance de una transaccin o de una sesin. Dependiendo de su alcance son borradas cuando la transaccin o la sesin termine.

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________

Segmentos de Ordenamiento
Los segmentos de ordenamiento son usados cuando un segmentos es compartido por muchas operaciones de ordenamiento. Un segmento de ordenamiento existe para cada instancia que lleva a cabo una operacin de ordenamiento en un tablespace dado. Los segmentos de ordenamiento crecen, mediante la peticin de extents, hasta que el tamao del segmento es mayor o igual a la demanda total de almacenamiento de todas las operaciones de ordenamiento activas en una instancia, no son liberados.

Clusula Storage
INITIAL NEXT Tamao, en bytes, del primer extent asignado cuando un segmento es creado. Este parmetro no puede especificarme mediante una instruccin ALTER. Tamao, en bytes, del prximo extent incremental a ser asignado a un segmento. El segundo extent es igual al tamao asignado en NEXT. Los siguientes extents tendrn el tamao del NEXT previo multiplicado por (1 + PCTINCREASE/100). NEXTi=(1+ PCTINCREASE/100) NEXTi-1. Hacer ejemplo... Porcentaje que representa el incremento del tamao del nuevo extent con respecto al anterior extent asignado a un segmento. Si el PCTINCREASE es 0, entonces todos los extents son del mismo tamao. Si el PCTINCREASE es mayor que 0, entonces cada NEXT extent debe ser calculado, y crecer en el porcentaje especificado en el PCTINCREASE. PCTINCREASE no puede ser negativo.

PCTINCREASE

MINEXTENTS

El nmero total de extents para ser asignados cuando el segmento es creado. Esto permite una gran asignacin de espacio en el momento de creacin, an si el espacio contiguo no esta disponible. El nmero total de extents, incluyendo el primero, que pueden ser asignados para un segmento.

MAXEXTENTS

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________

Tablespaces, Datafiles
Una base de datos Oracle consiste de una o ms unidades de almacenamiento lgico llamados tablespaces, que almacenan colectivamente todos los datos de la base de datos. Cada tablespace en una base de datos Oracle consiste de uno o ms archivos llamados datafiles, que son estructuras fsicas del sistema operativo. Los datos de una base de datos son almacenados colectivamente en datafiles que constituyen cada tablespace de la base de datos. Oracle internamente utiliza interfaces estndar de file system para crear y borrar archivos segn lo necesite para las siguientes estructuras de la base de datos: Tablespaces Online redo lo files Control files

Tablespaces Tablespace SYSTEM


Oracle crea el tablespace SYSTEM automticamente cuando la base de datos es creada. El tablespace SYSTEM esta siempre online cuando la base de datos esta abierta. En una base de datos donde el tablespace SYSTEM es locally managed, no pueden crearse tablespaces que manejen los extents mediante el uso del diccionario. El tablespace SYSTEM siempre contiene las tablas del diccionario de datos de la base de datos completa. Las tablas del diccionario de datos estn en el datafile 1. Todos los datos almacenados por causa de programas stored PL/SQL (procedimientos, funciones, paquetes y triggers) residen en el tablespace SYSTEM.

Undo tablespaces
Son utilizados para informacin de undo. Cada transaccin, a penas se ejecuta la primera operacin DML, es asignada a un segmento de undo en el tablespace de undo actual. Si la instancia no tiene un tablespace de undo, la transaccin se asigna al segmento de undo del tablespace SYSTEM. Cada tablespace est compuesto de un conjunto de datafiles de undo que son locally managed. Como otros tipos de tablespaces, los bloques de undo son agrupados en extents y el status de cada

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________ extent es representado en un bitmap.

Tablespace Temporal
Cuando SYSTEM es locally managed sus segmentos no se pueden utilizar como segmentos temporales. Para aquellos manejados por el diccionario de datos si se puede.

Uso de mltiples tablespaces


Se pueden utilizar varios tablespaces para llevar a cabo las siguientes tareas Control de la asignacin del espacio del disco pata una base de datos. Asignacin de cuotas especficas para los usuarios de la base de datos. Control de la disponibilidad de los datos mediante el estado online/offline de los tablespaces Desarrollar backups parciales de la base de datos o operacin de recuperacin Destinar el almacenamiento de los datos entre dispositivos para mejorar el desempeo.

Manejando el espacio en los tablespaces:


El manejo del espacio en los tablespaces se puede llevar a cabo mediante: Tablespaces Locally Managed: el manejo de los extents es realizado por el tablespace Tablespaces Dictionary Managed: el manejo de los extents es realizado por el diccionario de datos. El mtodo para el manejo del espacio en un tablespace se especifica en el momento de la creacin.

Tablespaces Locally Managed:


Un tablespace que maneja sus propios extents mantienen un bitmap en cada datafile para resguardar el registro del estado de los bloques con respecto a si estn ocupados o libres en el datafile. Cada bit en el bitmap corresponde con un bloque o un grupo de bloques. Cuando un extent es asignado o liberado para su reutilizacin, Oracle cambia el valor del bitmap para reflejar el nuevo estado del bloque. Este cambio no genera informacin de rollback debido a que no actualiza las tablas en el diccionario de datos. Entre las ventajas sobre los tablespaces manejados por el diccionario de datos se tiene: El manejo local de los extentes automticamente registra la adyacencia del espacio libre,

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________ eliminando la necesidad de fusionar los extents libres adyacentes. El manejo de los extents localmente evita operaciones de manejo de espacio recursivo. Como las que pueden ocurrir en los tablespaces manejados por el diccionario si el consumo o liberacin de espacio en un extent resulta en otra operacin que consume o libera espacio en una tabla del diccionario de datos o un segmento de rollback.

Cmo se libera el espacio libre y utilizado en un segmento?

Automticamente: Oracle utiliza bitmaps para manejar el espacio libre en el segmento. Un bitmap, es un mapa que describe el estado de cada bloque de datos en un segmento con respecto a la cantidad despacio en el bloque disponible para la insercin de registros. Mientras ms o menos espacio este disponible en un bloque de datos, su nuevo estado es reflejado en el bitmap. Los bitmaps permite a Oracle manejar el espacio libre ms automticamente, de esta manera el manejo del espacio se denomina manejo automtico del espacio del segmento. Manualmente: Oracle utiliza un free list para el manejo del espacio libre en un segmento. Free list son listas de los bloques de datos que tienen espacio disponible para la insercin de tuplas. Manejo manual.

Tablespaces Dictionary Managed


Para un tablespaces que maneja sus extents mediante el uso del diccionario de datos, Oracle actualiza las tablas apropiadas en el diccionario de datos siempre que un extent es asignado o liberado. Oracle adems almacena informacin de rollback por cada actualizacin en las tablas del diccionario de datos. Como las tablas del diccionario de datos y los segmentos de rollback son parte de la base de datos, el espacio que ellos ocupan esta sujeto a las mismas operaciones de manejo de espacio de los otros datos.

Datafiles
Oracle crea un datafile para un tablespace mediante la asignacin de una cantidad especfica de espacio en disco ms el overhead requerido para el encabezado del archivo.

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________ Cuando un datafile es creado, el espacio asignado en disco es reclamado y se le da un formato, pero no contendr ningn dato del usuario. Oracle reserva el espacio para resguardar los datos para segmentos futuros asociados al tablespace. A medida que los datos crecen en el tablespace, Oracle utiliza el espacio libre en el datafile para asignarlo a los extents del segmento. Un objeto de un esquema no corresponde a un datafile especfico. Un datafile es un repositorio para los datos de cualquier objeto en un tablespace especfico. Oracle asigna espacio para los datos asociados con un objeto del esquema en uno o ms datafiles de un tablespace. Por lo cual, un objeto puede atravesar ms de un datafile.

Estructura Fsica para el Almacenamiento de Datos en Tablas


Las tablas son la unidad bsica de almacenamiento de datos en Oracle, se puede escoger entre las siguientes estructuras fsicas de almacenamiento para una tabla:

Tablas Regulares
Tablas heap.

Tablas particionadas
Permiten particionar los datos en piezas ms pequeas y manejables, llamadas particiones o an subparticiones. Los ndices pueden particionarse de la misma manera. Cada particin puede ser manejada individualmente y puede operar independientemente de otras particiones, proveiendo una estructura que puede ser entonada ms apropiadamente para su disponibilidad y desempeo. Se toca en detalle en la siguiente clase.

Tablas Organizadas por ndice


Una tabla organizada por ndice tiene una organizacin que es una variante del rbol B primario. De forma diferente a una tabla ordinaria (heap), cuyos datos son almacenadas como una coleccin no ordenada, los datos para una tabla organizada por ndice son almacenados en un un rbol

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________ B, organizados por la clave primaria. Junto con las columnas de la clave primaria se almacenan el resto de las columnas tambin. Cada entrada en el rbol B contiene: <primary_key_value ,
non_primary_key_column_values> .

Las tablas organizadas por ndice son similares a la configuracin de una tabla ordinaria y un ndice en una o ms de las columnas, pero en lugar de mantener por separado las dos estructuras, una para la tabla y otra para el rbol B, la base de datos mantiene solamente un nico rbol B. En lugar de almacenarse un apuntador (rowid) para recuperar el registro en la tabla, se almacenan las columnas no claves.

Tablas Organizadas por ndice con rea de Overflow Las entradas de un ndice en un rbol B generalmente son bastante pequeas, porque ellas consisten nicamente del valor de la clave y un apuntador (rowid). En las tablas organizadas por ndice, sin embargo, las entradas del rbol B pueden ser grandes, porque ellas consisten de un registro completo. Esto podria afectar el desempeo en caso de ser registros muy grandes. Por ellos Oracle provee la clsula OVERFLOW, se puede especificar un tablespace de overflow, de ser necesario, y el registro se dividir en dos partes, una que ser almacenada en el rbol B y la otra el rea de overflow. Las entradas en el rbol contendrn los valores de la clave primaria, opcionalmente algunas columnas no claves y un apuntador (rowid fsico) sealando al rea de overflow donde se encuentra el resto del registro. Con el OVERFLOW, se pueden utilizar dos clusulas: PCTTHRESHOLD e INCLUDING, para controlar como Oracle determina cuando un registro debe ser almacenado en dos partes y a partir de cul columna se particiona el registro. Usando PCTTHRESHOLD, se puede especificar el valor lmite como un porcentaje del tamao del bloque, si todas las columnas no claves pueden ser acomodadas en ese lmite especificado, el registro

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________ no se particionar. De otra manera comenzando con la primera columna no clave que no pueda ser acomodada, el resto de las columnas no claves ser almacenadas en el rea de overflow. La clusula INCLUDING permite especificar el nombre de la columna, entre las columnas no claves, durante la creacin de la tabla, tal que el resto de las columnas que se encuentren despus de esta columna sern almacenadas en el rea de overflow. Aunque dependiendo del PCTTHRESHOLD, algunas columnas no claves que se encuentren antes de la columna especificada con la clusula INCLUDING podran tener que almacenarse en el rea de overflow.

Tablas Cluster
Son una estructura fsica para almacenar los datos en una tabla. Un cluster es un grupo de tablas que comparten los mismos bloques de datos porque ellas comparten columnas comunes y son usadas juntas frecuentemente. Por ejemplo las tablas employees y departments comparten la columna department_id. Al clusterizar las tablas employees y departments, Oracle almacena fsicamente todos los registro para cada departamento junto con su correspondientes empleados en el mismo bloque de datos, como se muestra a continuacin:

Entre las ventajas que ofrece esta estructura se tiene El I/O de disco reduce para los joins de las tablas clusterizadas.

Clase 2: Estructuras lgicas y fsicas(I) Claudia Gonzlez ___________________________________________________________________________________


El tiempo de acceso mejora para los joins de las tablas clusterizadas. La clave del closter es almacenada slo una vez en el cluster y en el ndice del cluster, sin importar cuantos registros de diversas tablas la contengan. Por lo tanto, se requiere menos espacio para almacenar la estructura del cluster y el ndice que las tablas no clusterizadas.

Hash Clusters Los Hash cluster agrupan las tablas de datos en una manera similar al ndice regular del cluster (que utiliza un ndice en lugar de una funcin de hash). Sin embargo, un registro almacenado en un hash cluster se basa en el resultado de aplicar una funcin de hash al valor de la clave de los registros del cluster. Todos los registros con el mismo valor de la clave son almacenados juntos en el disco. Los Hash cluster son una mejor opcin que el clster regular con un ndice o una tabla indexada cuando una tabla se requiere con frecuencia para consultas de igualdad (por ejemplo para retornar todos los registros para el departamento 10). El valor de la clave de hash resultante apunta directamente al rea n disco que almacena los registros. Para usar hashing se debe crear un hash cluster y cargar las tablas en el cluster. Oracle almacena fsicamente los registros de una tabla en el hash cluster y los retorna de acuerdo a los resultados de la funcin de hash. Oracle usa una funcin de hash para generar una distribucin de los valores numricos, llamados valores de hash, que esta basada en los valores especficos de la clave del cluster. Oracle tiene una estructura de hash? Para una sla tabla se puede usar el hash cluster como una estructura de hash simple.

Вам также может понравиться