rendimiento de consultas
7.2.3. VELOCIDAD de las Consultas SELECT
En general, cuando se quiere hacer un SELECT lento ... DONDE consulta más rápida, lo primero que debe hacer es comprobar si se puede añadir un índice. Todas las referencias entre las diferentes tablas normalmente se debe hacer con los índices. Usted puede utilizar la sentencia EXPLAIN para determinar los índices que se utilizan para una SELECT. Consulte Sección 7.4.5, "como utiliza MySQL LOS índices" y Sección 7.2.1, "Sintaxis de EXPLAIN (Obtener Información about sin SELECT)".
Algunos consejos generales para acelerar las consultas en tablas MyISAM:
•
Para ayudar a MySQL mejores optimizar las consultas, use ANALYZE TABLE o myisamchk - analizar en una mesa después de que se ha cargado con datos. Esto actualiza un valor para cada parte de índice que indica el número medio de filas que tienen el mismo valor. (Para los índices únicos, esto es siempre 1.) MySQL utiliza para decidir qué índice para elegir cuando se une a dos tablas en función de una expresión no constante. Puede comprobar el resultado del análisis de la tabla usando SHOW INDEX FROM tbl_name y examinar el valor de cardinalidad. myisamchk - description - verbose muestra información sobre la distribución del índice.
•
Para ordenar un índice y datos de acuerdo con un índice, utilice myisamchk - sort-index - sort-records = 1 (si desea ordenar el índice 1). Esta es una buena manera de hacer las consultas más rápidamente si usted tiene un índice único de la que quieres leer todos los registros en orden de acuerdo con el índice. Tenga en cuenta que la primera vez que ordena una gran mesa de esta manera, puede tomar mucho tiempo.
7.2.2. Estimar el renidimiento De Una consulta
En la mayoría de los casos, se puede estimar el rendimiento contando disco busca. Para las tablas pequeñas, generalmente se puede encontrar una fila en un disco seek (porque el índice es probablemente en caché). Para tablas grandes, se puede estimar que, mediante índices B-tree, necesita esta cantidad de busca para encontrar una fila: log (row_count) / log (index_block_length / 3 * 2 / (Index_length + data_pointer_length)) + 1.
En MySQL, un bloque de índice es generalmente 1024 bytes y el puntero de datos suele ser 4 bytes. Para ver una tabla 500000-fila con una longitud de índice de 3 bytes (medio entero), la fórmula indica log (500000) / log (1024/3 * 2 / (3 4)) + 1 = 4 busca.
Este índice requeriría de almacenamiento de alrededor de 500 000 * 7 * 3/2 = 5,2 MB (suponiendo un búfer de índice típico relleno proporción de 2/3), por lo que probable que gran parte del índice en la memoria y por lo tanto necesitan una o dos llamadas a leer los datos para encontrar la fila.
Para las escrituras, sin embargo, necesita cuatro solicitudes de acceso (como arriba) para saber dónde colocar el nuevo índice y, normalmente, de dos pretende actualizar el índice y escribir la fila.
Tenga en cuenta que la discusión anterior no significa que el rendimiento de las aplicaciones degenera lentamente log N. Mientras todo se almacena en caché por el sistema operativo o el servidor MySQL, las cosas son sólo marginalmente más lento que la tabla se hace más grande. Después de los datos es demasiado grande para ser almacenado en caché, las cosas empiezan a ir mucho más lento hasta que las aplicaciones sólo están vinculados por búsquedas en disco (que aumentan en log N). Para evitar esto, aumentar el tamaño de la caché de claves como los datos crece. Para tablas MyISAM, el tamaño de clave de caché se controla mediante la variable de sistema key_buffer_size. Consulte Sección 7.5.2, "afinar Lista de parámetros del Servidor".
Debian / Ubuntu Tips & Tricks nos sugiere dos consejos párr mejorar El Tiempo de Respuesta de MySQL, basado en la ONU Caso proprio.
Muchas veces, un Pesar de Que El Sistema Operativo sí encuentre con Una Carga de Trabajo normal, MySQL Florerias mostrarse algoritmo lento.
Hay Muchas Formas párr mejorar El Tiempo de Respuesta del Servidor MySQL, Aquí nos enfocaremos en dos Formas:
■ Deshabilitar la Resolución de Nombre
■ Modificar el tamano de la caché
La Primera Opción es deshabilitar la Resolución de NOMBRES, de ESTA forma el Servidor no pierde Tiempo Intentando convertir NOMBRES de Dominio a IP. El Unico Inconveniente Sera Que deberas USAR Solamente Direcciones IP párrafo Definir los permisos.
Ademas, Por Una Cuestión de Seguridad No Se Recomienda Nunca USAR NOMBRES de Dominio o nombres de host en la Autenticación de MySQL.
Para deshabilitar la Resolución de NOMBRES de Dominio Debes correr el demonio de MySQL (mysqld) con el Argumento-skip-name-resolve, o bien, en el archivo de configuracion / etc / my.cnf agregar la entrada ¿skip-name-resolve.
[Mysqld]
.....
......
skip-name-resolve
Observa los Resultados del siguiente sencillo de referencia:
■ Con Resolución de NOMBRES, el Servidor sí tarda Entre dos y tres Segundos en responder:
fecha; mysql-u root-h 192.168.1.4, la fecha
Vie Jul 21 23:56:58 CEST 2006
ERROR 1130 (00000): Host .168.1.3 '192 'no tiene permiso para conectarse a este servidor MySQL
Vie Jul 21 23:57:00 CEST 2006
■ Sin Resolución de NOMBRES, el Servidor Responde instantaneamente:
fecha; mysql-u root-h 192.168.1.4, la fecha
Vie Jul 21 23:56:37 CEST 2006
ERROR 1130 (00000): Host .168.1.3 '192 'no tiene permiso para conectarse a este servidor MySQL
Vie Jul 21 23:56:37 CEST 2006
La Segunda pertenezcan Recomendación es Activar la caché de Consultas (chache consulta). La caché de Consultas guarda el Texto de la ONU SELECT junto al Resultado Que FUE Enviado al Cliente. Si despues sí recibe Una consulta identica el Servidor Recupera los Datos de la caché en Vez de ejecutar la consulta NuevaMente.
Para chequear la consulta chache ejecuta:
mysql> SHOW STATUS LIKE 'Qcache%';
Para ver el Estado de la Misma:
mysql> VARIABLES LIKE '% query_cache%' Show;
Para change Tamano de la Misma:
mysql> SET GLOBAL query_cache_size = 52428800;
Para mantener la configuracion de la Misma, heno Que Modificar el archivo / etc / my.cnf:
[Mysqld]
...
...
query_cache_size = 52428800
query_cache_type = 1
7.1.4. El Paquete de Pruebas de RENDIMIENTO (benchmarks) de MySQL
This section deberia Contener Una Descripción Técnica del Paquete de Pruebas de RENDIMIENTO de MySQL (ASI COMO del crash-me), Pero ESA Descripción Aun no ha Sido Escrita. Sin embargo, Florerias hacerse Una buena idea de Como hacer Pruebas de RENDIMIENTO viendo el Código y los Resultados Dentro del Directorio sql-bench en el Código fuente de la Distribución de MySQL.
La finalidad de Este Paquete de Pruebas de RENDIMIENTO es visualizar QUÉ Operaciones sí Realizan bien y Cuales lo Hacen pobremente en Cada Implementación de SQL.
ESTAS Pruebas de RENDIMIENTO ningún hijo múltiples hilo, Asi Que Miden El Tiempo Mínimo párr las Operaciones Realizadas. Se Planea agregar en la ONU Futuro Pruebas múltiples hilo al Paquete.
Para USAR el Paquete, Deben satisfacerse the following requirements:
•
El Paquete de Pruebas de RENDIMIENTO SE proporciona con el Código fuente de la Distribución de MySQL. Also Florerias descargar Distribución Una liberada de http://dev.mysql.com/downloads/, o USAR Nuestro repositorio de Código fuente (ver Sección 2.8.3, "Instalar desde el Árbol de Código fuente de Desarrollo").
•Los guiones de las Pruebas de RENDIMIENTO estan Escritos en Perl y Usan el módulo de Perl DBI to enter a los Servidores de Bases de Datos, Asi Que DBI debe Estar Instalado. Also es Necesario el Controlador DBI especifico párrafo Cada Servidor al Que se QUIERE realizar las Pruebas. Por EJEMPLO, párrafo ProBar MySQL, PostgreSQL y DB2, debe Tener los módulos DBD :: mysql, DBD :: Pg y DBD :: DB2 instalados. Ver Sección 2.13, "Notas Sobre la Instalación de Perl".
Una Vez Retrieved el Código fuente de la Distribución de MySQL, el Paquete de Pruebas de RENDIMIENTO SE encuentra en el Directorio sql-bench. Para ejecutar las Pruebas de RENDIMIENTO, compílese MySQL, váyase al Directorio sql-bench y ejecútese el script de run-all-tests:shell> cd sql-benchshell> perl run-all-tests - server = nombre_servidor
nombre_servidor debe servi Uno De Los Servidores soportados. Para Obtener La Lista Completa de options y Servidores soportados, invóquese el comando:-all-tests de ejecución shell> perl - helpEl script de crash-me also no está SITUADO Dentro del Directorio sql-bench. crash-me intenta Determinar QUÉ Características Soporta Una de base de Datos y Cuales hijo suspensión Capacidades y limitations. Ésto lo consigue ejecutando Consultas
El Mas de factor Importante párrafo HACER UN Sistema Rápido es Do Diseño Básico. Ademas, es necessary CONOCER los Procesos Que cumple el Sistema y Cuales hijo suspensión cuellos de botella. En la Mayoría de los Casos cuellos de botella NACEN de the following FACTORES:
•
Búsqueda en Disco. El disco de NECESITA Cierto Tiempo párr ENCONTRAR UN Paquete de Datos. Con discos Modernos, El Tiempo Medio párr Esto Es usualmente Menor a 10 ms, Asi Que en Teoría sí pueden HACER 100 busquedas porción Segundo. Este Tiempo Mejora Lentamente con los discos nuevos soles y es muy Difícil optimizarlo párr Una sola tabla. La Manera de optimizar El Tiempo de búsqueda es Distribuir los Datos Dentro de Mas de las Naciones Unidas discoteca.
•
Lectura y escritura en la discoteca. De Cuando el disco de sí encuentra en la posicion correcta viene, NECESITAMOS leer los Datos. Los discos Modernos transfieren al Menos 10-20MB / s. Esto Es Mucho Más Fácil de optimizar QUE LAS busquedas, PUESTO QUE PODEMOS Read in Paralelo from múltiplos discotecas.
•
Ciclos de CPU. De Cuando TENEMOS Datos en la memoria principal NECESITAMOS procesarlos párrafo Obtener Resultado algun. Tener los tablas Pequenas es comparacion Con La CANTIDAD De memoria Es El mas Factor Común de limitacion. Pero con tablas Pequeñas, la Rapidez no es usualmente el Problema.
•
Ancho de banda de Memoria. CUANDO EL CPU NECESITA Más Datos de Los Que Florerias Almacenar en la memoria caché de la CPU, el ancho principal de la memoria sí convierte en sin cuello de botella. Es Poco Común en la Mayoría de Casos, Pero debe tenerse en Cuenta.
miércoles, 17 de abril de 2013
martes, 16 de abril de 2013
Creación De Indices en BD Veterinaria
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cdcol |
| mysql |
| performance_schema |
| phpmyadmin |
| test |
| veterinaria |
| webauth |
+--------------------+
8 rows in set (0.05 sec)
mysql> use veterinaria;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_veterinaria |
+-------------------+
| antenfermedades |
| caracteristicas |
| clientes |
| direccion |
| hmedica |
| info |
| mascota |
| mconsulta |
| servicios |
+-------------------+
10 rows in set (0.00 sec)
mysql> describe info;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| num | int(11) | NO | PRI | NULL | |
| NombreC | varchar(25) | YES | | NULL | |
| NombreM | varchar(25) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.82 sec)
mysql> create index part_of_name on info (num(4));
Query OK, 0 rows affected (0.65 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> create index part_of_num on info (num(4));
Query OK, 0 rows affected (0.57 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> create index part_of_NombreC on info (NombreC(25));
Query OK, 0 rows affected (0.26 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> create index part_of_NombreM on info (NombreM(25));
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> describe mascota;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| NumP | int(11) | NO | PRI | NULL | |
| nombre | varchar(15) | YES | | NULL | |
| peso | float | YES | | NULL | |
| sexo | varchar(1) | YES | | NULL | |
| raza | varchar(15) | YES | | NULL | |
| FNacimiento | varchar(10) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
6 rows in set (0.13 sec)
mysql> create index infmascota on mascota (sexo(1));
Query OK, 5 rows affected (0.20 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> create index infraza on mascota (raza(15));
Query OK, 5 rows affected (0.60 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> describe servicios;
ERROR 1146 (42S02): Table 'veterin.servicios' doesn't exist
mysql> describe servicio;
ERROR 1146 (42S02): Table 'veterin.servicio' doesn't exist
mysql> describe servicios;
ERROR 1146 (42S02): Table 'veterin.servicios' doesn't exist
mysql> describe clientes;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| NumCliente | int(11) | NO | PRI | NULL | |
| nombrec | varchar(25) | YES | | NULL | |
| direccion | varchar(25) | YES | | NULL | |
| telefono | varchar(15) | YES | | NULL | |
| oficio | varchar(25) | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.49 sec)
mysql> create index FClientes on clientes(NumClientes(11));
ERROR 1072 (42000): Key column 'NumClientes' doesn't exist in table
mysql> create index FClientes on clientes(NumCliente(4));
Query OK, 5 rows affected (0.59 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> create index FTelefono on clientes(telefono(15));
Query OK, 5 rows affected (0.54 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> exit
Creacion de Indices en Mysql y Oracle
Creación de Índices
.
Un índice es una estructura
interna que el sistema puede usar para encontrar uno o más registros en una
tabla de forma rápida. En efecto, un índice de base de datos es,
conceptualmente, similar a un índice encontrado al final de cualquier libro de
texto. De la misma forma que el lector de un libro acudiría a un índice para
determinar en qué páginas se encuentra un determinado tema, un sistema de base
de datos leerá un índice para determinar las posiciones de registros
seleccionados por una consulta SQL. En otras palabras, la presencia de un
índice puede ayudar al sistema a procesar algunas consultas de un modo más
eficiente.
Un índice de
base de datos se crea para una columna o grupo de columnas. La figura siguiente
muestra un índice (XCNOMBRE) basado en la columna CNOMBRE de la tabla CURSO.
Observemos que el índice, a diferencia de la tabla CURSO, representa valores
CNOMBRE en orden. Además, el índice es pequeño en relación con el tamaño de la
tabla. Por lo tanto, es, probablemente, más fácil que el sistema busque el
índice para localizar un registro con un valor CNOMBRE dado, a que explore toda
la tabla en busca de ese valor. Por ejemplo, el índice XCNOMBRE podría ser muy
útil al sistema cuando ejecute la siguiente sentencia SELECT.
Tenemos tres tipos de índices.
El primero corresponde a las
claves primarias, que como vimos, también se pueden crear en la parte de
definición de columnas. La sintaxis para definir claves primarias es:
definición_columnas | PRIMARY
KEY (index_nombre_col,...)
mysql>
CREATE TABLE ciudad4(nombre CHAR(20) NOT NULL,
poblacion
INT NULL DEFAULT 5000,
PRIMARY
KEY (nombre));
Pero esta forma tiene más
opciones, por ejemplo, entre los paréntesis podemos especificar varios nombres
de columnas, para construir claves primarias compuestas por varias columnas:
mysql> CREATE TABLE mitabla1 (id1 CHAR(2) NOT NULL,
id2 CHAR(2) NOT NULL,
texto CHAR(30),
PRIMARY
KEY (id1, id2));
El segundo tipo de índice
permite definir índices sobre una columna, sobre varias, o sobre partes de
columnas. Para definir estos índices se usan indistintamente las opciones KEY o
INDEX.
mysql>
CREATE TABLE mitabla2(id INT, nombre CHAR(19), INDEX (nombre));
O su equivalente:
mysql>
CREATE TABLE mitabla3(id INT, nombre CHAR(19), KEY (nombre));
También podemos crear un índice
sobre parte de una columna:
mysql> CREATE TABLE mitabla4(id INT, nombre CHAR(19), INDEX
(nombre(4)));
Indices En Oracle
Creacion de indices en oracle
Los indices se usan para mejorar el rendimiento de las operaciones sobre una tabla.
En general mejoran el rendimiento las SELECT y empeoran (minimamente) el rendimiento de los INSERT y los DELETE.
Una vez creados no es necesario nada más, oracle los usa cuando es posible (ver EXPLAIN PLAN).
Tipos de indices en ORACLE
Lectura/Escritura
B-tree(arboles binarios)
Functional Based
Reserve key
Solo Lectura
Bitmap
Bitmap join
Index-organized table(algunas veces usados en lectura/escritura)
Cluster y hash cluster
Domail(muy especificos en aplicaciones Oracle)
En oracle existen tres tipos de indices:
1)Table Index:
CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name
ON [esquema.]table_name [tbl_alias]
(col [ASC | DESC]) index_clause index_attribs
2)Bitmap Join Index:
CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name
ON [esquema.]table_name [tbl_alias]
(col_expression [ASC | DESC])
FROM [esquema.]table_name [tbl_alias]
WHERE condition [index_clause] index_attribs
3)Cluster Index:
CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name
ON CLUSTER [esquema.]cluster_name index_attribs
Creacion
Bitacora Veterinaria
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> ;
ERROR:
No query specified
mysql> ;
ERROR:
No query specified
mysql> use veterinaria;
Database changed
mysql> show tables;
+---------------------+
| Tables_in_veterinaria |
+---------------------+
| clientes |
| mascota |
| veterinaria |
+---------------------+
3 rows in set (4.19 sec)
mysql> drop table clientes;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
mysql> exit
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database edgarI;
Query OK, 1 row affected (0.81 sec)
mysql> create table clientes(num int not null primary key,nombre varchar(25),direccion varchar(25),telefono varchar(15),oficio varchar(25));
ERROR 1046 (3D000): No database selected
mysql> use edgarI;
Database changed
mysql> create table clientes(num int not null primary key,nombre varchar(25),direccion varchar(25),telefono varchar(15),oficio varchar(25));
Query OK, 0 rows affected (4.99 sec)
mysql> insert into clientes values(1,'Edgar Harry','Los Matorrales #4532','6457843','carpintero');
Query OK, 1 row affected (2.12 sec)
mysql> create table mascota(num int not null primary key,nombre varchar(15),peso float(4),sexo varchar(1),raza varchar(15),FNacimiento varchar(10));
Query OK, 0 rows affected (0.68 sec)
mysql> insert into mascota values(001,'Cane',4.5,'M','pitbull','20-02-2010');
Query OK, 1 row affected (0.63 sec)
mysql> select*from clientes;
+-----+-------------+----------------------+----------+------------+
| num | nombre | direccion | telefono | oficio |
+-----+-------------+----------------------+----------+------------+
| 1 | Edgar Harry | Los Matorrales #4532 | 6457843 | carpintero |
+-----+-------------+----------------------+----------+------------+
1 row in set (0.44 sec)
mysql> select*from mascota;
+-----+--------+------+------+---------+-------------+
| num | nombre | peso | sexo | raza | FNacimiento |
+-----+--------+------+------+---------+-------------+
| 1 | Cane | 4.5 | M | pitbull | 20-02-2010 |
+-----+--------+------+------+---------+-------------+
1 row in set (0.04 sec)
+-----+-------------+
| num | nombre |
+-----+-------------+
| 1 | Edgar Harry |
+-----+-------------+
1 row in set (0.13 sec)
mysql> select nombre from clientes mascota;
+-------------+
| nombre |
+-------------+
| Edgar Harry |
+-------------+
1 row in set (0.01 sec)
mysql> drop table mascota;
Query OK, 0 rows affected (5.49 sec)
mysql> drop table clientes;
Query OK, 0 rows affected (0.74 sec)
mysql> create table mascota(NumP int not null primary key,nombre varchar(15),peso float(4),sexo varchar(1),raza varchar(15),FNacimiento varchar(10));
Query OK, 0 rows affected (1.45 sec)
mysql> create table clientes(NumCliente int not null primary key,nombre varchar(25),direccion varchar(25),telefono varchar(15),oficio varchar(25));
Query OK, 0 rows affected (0.25 sec)
mysql> alter table mascota add clientes varchar(25)references clientes(NumCliente);
Query OK, 0 rows affected (3.92 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select*from clientes;
Empty set (0.90 sec)
mysql> insert into clientes values(1,'Edgar Harry','Los Matorrales #4532','6457843','carpintero');
Query OK, 1 row affected (0.25 sec)
mysql> insert into clientes values(2,'Alejandro Saenz','Oasis #4543','6454343','carnicero');
Query OK, 1 row affected (0.21 sec)
mysql> insert into mascota values(1,'Cane',4.5,'M','pitbull','20-02-2010');
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> show create table mascota;
mysql> select*from mascota;
+------+--------+------+------+---------+-------------+----------+
| NumP | nombre | peso | sexo | raza | FNacimiento | clientes |
+------+--------+------+------+---------+-------------+----------+
| 1 | Cane | 4.5 | M | pitbull | 20-02-2010 | 1 |
+------+--------+------+------+---------+-------------+----------+
1 row in set (0.07 sec)
mysql> insert into mascota values(2,'Aleman',15.5,'M','pastorAleman','12-03-2009',2);
Query OK, 1 row affected (0.12 sec)
mysql> select mascota.nombre clientes.nombre from mascota clientes;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.nombre from mascota clientes' at line 1
mysql> select*from clientes;
+------------+-----------------+----------------------+----------+------------+
| NumCliente | nombre | direccion | telefono | oficio |
+------------+-----------------+----------------------+----------+------------+
| 1 | Edgar Harry | Los Matorrales #4532 | 6457843 | carpintero |
| 2 | Alejandro Saenz | Oasis #4543 | 6454343 | carnicero |
+------------+-----------------+----------------------+----------+------------+
2 rows in set (0.00 sec)
+--------+--------------------+
| nombre | Nombre Propietario |
+--------+--------------------+
| Cane | Edgar Harry |
| Aleman | Alejandro Saenz |
+--------+--------------------+
2 rows in set (0.12 sec)
+--------+-----------------+
| nombre | nombre |
+--------+-----------------+
| Cane | Edgar Harry |
| Aleman | Alejandro Saenz |
+--------+-----------------+
2 rows in set (0.01 sec)
mysql> select*from clientes;
+------------+-----------------+----------------------+----------+------------+
| NumCliente | nombre | direccion | telefono | oficio |
+------------+-----------------+----------------------+----------+------------+
| 1 | Edgar Harry | Los Matorrales #4532 | 6457843 | carpintero |
| 2 | Alejandro Saenz | Oasis #4543 | 6454343 | carnicero |
+------------+-----------------+----------------------+----------+------------+
2 rows in set (0.00 sec)
mysql> select mascota.nombre,clientes.nombre from mascota,clientes ;
+--------+-----------------+
| nombre | nombre |
+--------+-----------------+
| Cane | Edgar Harry |
| Aleman | Edgar Harry |
| Cane | Alejandro Saenz |
| Aleman | Alejandro Saenz |
+--------+-----------------+
4 rows in set (0.00 sec)
mysql> select distinct mascota.nombre,clientes.nombre from mascota,clientes ;
+--------+-----------------+
| nombre | nombre |
+--------+-----------------+
| Cane | Edgar Harry |
| Aleman | Edgar Harry |
| Cane | Alejandro Saenz |
| Aleman | Alejandro Saenz |
+--------+-----------------+
4 rows in set (0.13 sec)
+--------+-----------------+
| nombre | nombre |
+--------+-----------------+
| Cane | Edgar Harry |
| Aleman | Alejandro Saenz |
+--------+-----------------+
2 rows in set (0.00 sec)
mysql> insert into mascota values(003,'lord',10,'M','labrador','15-04-2011',3);
Query OK, 1 row affected (0.75 sec)
mysql> select*from clientes;
+------------+-----------------+----------------------+----------+--------------+
| NumCliente | nombre | direccion | telefono | oficio |
+------------+-----------------+----------------------+----------+--------------+
| 1 | Edgar Harry | Los Matorrales #4532 | 6457843 | carpintero |
| 2 | Alejandro Saenz | Oasis #4543 | 6454343 | carnicero |
| 3 | Omar Ruiz | Centro #7834 | 6324354 | Ing.Sistemas |
| 4 | Ivan Morales | Revolucion #0942 | 6891254 | ContadorP |
| 5 | Oscar Hernandez | Mezquital #4412 | 6677667 | Electrico |
| 6 | Jose Salas | Americas #1972 | 1876578 | Medico |
+------------+-----------------+----------------------+----------+--------------+
6 rows in set (0.00 sec)
mysql> select*from mascotas;
ERROR 1146 (42S02): Table 'edgari.mascotas' doesn't exist
mysql> select*from mascota;
+------+--------+------+------+----------------+-------------+----------+
| NumP | nombre | peso | sexo | raza | FNacimiento | clientes |
+------+--------+------+------+----------------+-------------+----------+
| 1 | Cane | 4.5 | M | pitbull | 20-02-2010 | 1 |
| 2 | Aleman | 15.5 | M | pastorAleman | 12-03-2009 | 2 |
| 3 | lord | 10 | M | labrador | 15-04-2011 | 3 |
| 4 | pinky | 3 | M | Chihuahua | 11-02-2012 | 4 |
| 5 | pelusa | 1.5 | M | french poodle | 02-01-2013 | 5 |
| 6 | BigDog | 50 | M | Schnauzer | 05-08-2008 | 6 |
+------+--------+------+------+----------------+-------------+----------+
6 rows in set (0.00 sec)
mysql> select mascota.nombre,clientes.nombre from mascota,clientes where clientes.NumCliente=mascota.clientes;
+--------+-----------------+
| nombre | nombre |
+--------+-----------------+
| Cane | Edgar Harry |
| Aleman | Alejandro Saenz |
| lord | Omar Ruiz |
| pinky | Ivan Morales |
| pelusa | Oscar Hernandez |
| BigDog | Jose Salas |
+--------+-----------------+
6 rows in set (0.00 sec)
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
mysql> select mascota.nombre,clientes.nombre from mascota,clientes where clientes.NumCliente=mascota.clientes;
+--------+-----------------+
| nombre | nombre |
+--------+-----------------+
| Cane | Edgar Harry |
| Aleman | Alejandro Saenz |
| lord | Omar Ruiz |
| pinky | Ivan Morales |
| pelusa | Oscar Hernandez |
| BigDog | Jose Salas |
+--------+-----------------+
6 rows in set (0.01 sec)
mysql> select *from mascota;
+------+--------+------+------+----------------+-------------+----------+
| NumP | nombre | peso | sexo | raza | FNacimiento | clientes |
+------+--------+------+------+----------------+-------------+----------+
| 1 | Cane | 4.5 | M | pitbull | 20-02-2010 | 1 |
| 2 | Aleman | 15.5 | M | pastorAleman | 12-03-2009 | 2 |
| 3 | lord | 10 | M | labrador | 15-04-2011 | 3 |
| 4 | pinky | 3 | M | Chihuahua | 11-02-2012 | 4 |
| 5 | pelusa | 1.5 | M | french poodle | 02-01-2013 | 5 |
| 6 | BigDog | 50 | M | Schnauzer | 05-08-2008 | 6 |
+------+--------+------+------+----------------+-------------+----------+
6 rows in set (0.00 sec)
mysql> exit;
jueves, 11 de abril de 2013
Roolback, commit, recovery de un sgbd
En tecnologías de base de datos,
un rollback es una operación que devuelve a la base de datos a algún estado
previo. Los Rollbacks son importantes para la integridad de la base de datos, a
causa de que significan que la base de datos puede ser restaurada a una copia
limpia incluso después de que se han realizado operaciones erróneas. Son
cruciales para la recuperación de crashes de un servidor de base de datos;
realizando rollback(devuelto) cualquier transacción que estuviera activa en el
tiempo del crash, la base de datos es restaurada a un estado consistente.
En SQL, ROLLBACK es un comando que causa que
todos los cambios de datos desde la última sentencia BEGIN WORK, o START
TRANSACTION sean descartados por el sistema de gestión de base de datos
relacional (RDBMS), para que el estado de los datos sea "rolled
back"(devuelto) a la forma en que estaba antes de que aquellos cambios
tuvieran lugar.
Una sentencia ROLLBACK también publicará
cualquier savepoint existente que pudiera estar en uso.
En muchos dialectos de SQL, ROLLBACKs son
específicos de la conexión. Esto significa que si se hicieron dos conexiones a
la misma base de datos, un ROLLBACK hecho sobre una conexión no afectará a
cualesquiera otras conexiones. Esto es vital para el buen funcionamiento de la
Concurrencia.
A funcionalidad de rollback está normalmente
implementada con un Log de transacciones, pero puede también estar implementada
mediante control de concurrencia.
Hacer un recovery en MySQL
Si queremos realizar una copia de seguridad desde entornos
Windows, deberemos utilizar la línea de comandos ("cmd"). Para abrir
la línea de comandos en Windows podemos ir al menú Inicio>Ejecutar, escribir
cmd y pulsar enter). Se nos abrir la línea de comandos de Windows. Ahora hemos
de situarnos en la carpeta donde tenemos instalados los binarios de MySQL por
ejemplo: c:\mysql\bin (esta ruta depende de donde instalaste MYSQL) y
escribimos el mismo comando que en linux:
mysqldump --opt -u nombredeusuario -p basededatos tabla1
> archivodebackup.txt
Recovery de una base
de datos InnoDB
Para una base de datos transaccional (de tipo InnoDB o BDB)
y de gran tamaño, se
puede utilizar este comando
mysqldump --opt -q --single-transaction -u nombredeusuario
-p basededatos tabla1 >
archivodebackup.txt
El parámetro -q es útil para bases de datos de gran tamaño.
mysql> CREATE TABLE innotest (campo INT NOT NULL
PRIMARY KEY) TYPE = InnoDB;
Query OK, 0 rows affected (0.10 sec)
mysql> INSERT INTO innotest VALUES(1);
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO innotest VALUES(2);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO innotest VALUES(3);
Query OK, 1 row affected (0.04 sec)
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
3 rows in set (0.00 sec)
De
acuerdo, nada espectacular. Ahora veamos como usar transacciones.
mysql> BEGIN;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
+-------+
4 rows in set (0.00 sec)
Si en
este momento ejecutamos un ROLLBACK, la transacción no será completada, y los
cambios realizados sobre la tabla no tendrán efecto.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.06 sec)
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
3 rows in set (0.00 sec)
Ahora
vamos a ver que sucede si perdemos la conexión al servidor antes de que la
transacción sea completada.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
+-------+
4 rows in set (0.00 sec)
mysql> EXIT;
Bye
Cuando
obtengamos de nuevo la conexión, podemos verificar que el registro no se
insertó, ya que la transacción no fue completada.
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 449 to server version:
4.0.13
Type 'help;' or 'h' for help. Type 'c' to clear the
buffer.
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
3 rows in set (0.00 sec)
Ahora
vamos a repetir la sentencia INSERT ejecutada anteriormente, pero haremos un
COMMIT antes de perder la conexión al servidor al salir del monitor de MySQL.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.02 sec)
mysql> EXIT;
Bye
Una vez
que hacemos un COMMIT, la transacción es completada, y todas las sentencias SQL
que han sido ejecutadas previamente afectan de manera permanente a las tablas
de la base de datos.
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 450 to server version:
4.0.13
Type 'help;' or 'h' for help. Type 'c' to clear the
buffer.
mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
+-------+
4 rows in set (0.00 sec)
mysql> CREATE TABLE ventas(
-> id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> producto VARCHAR(30) NOT NULL,
-> cantidad TINYINT NOT NULL) TYPE = InnoDB;
Query OK, 0 rows affected (0.96 sec)
Insertamos un registro.
mysql> INSERT INTO ventas VALUES(0,'Gansito marinela',3);
Query OK, 1 row affected (0.16 sec)
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto | cantidad |
+----+------------------+----------+
| 1 | Gansito marinela | 3 |
+----+------------------+----------+
1 row in set (0.01 sec)
Ahora vamos a iniciar una
transacción con la sentencia BEGIN.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
Actualizamos el registro.
mysql> UPDATE ventas SET cantidad=4 WHERE id=1;
Query OK, 1 row affected (0.07 sec)
Líneas correspondientes: 1 Cambiadas: 1 Avisos: 0
Verificamos que los cambios han
sucedido.
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto | cantidad |
+----+------------------+----------+
| 1 | Gansito marinela | 4 |
+----+------------------+----------+
1 row in set (0.00 sec)
Si queremos deshacer los
cambios, entonces ejecutamos un ROLLBACK.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.06 sec)
Verificamos que se deshicieron
los cambios.
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto | cantidad |
+----+------------------+----------+
| 1 | Gansito marinela | 3 |
+----+------------------+----------+
1 row in set (0.00 sec)
Vamos a actualizar el registro
usando otra transacción.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE ventas SET cantidad=2 WHERE id=1;
Query OK, 1 row affected (0.00 sec)
Líneas correspondientes: 1 Cambiadas: 1 Avisos: 0
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto | cantidad |
+----+------------------+----------+
| 1 | Gansito marinela | 2 |
+----+------------------+----------+
1 row in set (0.00 sec)
Vamos a confirmar que deseamos
los cambios.
mysql> COMMIT;
Query OK, 0 rows affected (0.05 sec)
En este momento los cambios son
permanentes y definitivos.
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto | cantidad |
+----+------------------+----------+
| 1 | Gansito marinela | 2 |
+----+------------------+----------+
1 row in set (0.00 sec)
Oracle
Declaraciones de control de
transacciones gestionar los cambios realizados por las sentencias DML.
¿Qué es una transacción?
Una transacción es un conjunto de
sentencias SQL de Oracle, que traten como una sola unidad. Es decir, todos los
estados deben llevar a cabo con éxito o ninguna de las sentencias se ejecutan
debería.
Para el control de las transacciones
de Oracle no hace permanente instrucciones DML a menos que lo cometió. Si no
confirmar la transacción y que se apague o se bloquea el sistema entonces la
transacción es respaldada rollo.
Declaraciones TCL disponibles en
Oracle son
COMMIT: Hacer cambios realizados
en la transacción permanente.
ROLLBACK: Revertir el estado de
la base de datos para el último punto de confirmación.
SAVEPOINT: Se utiliza para
especificar un punto en operación a la que más tarde puede revertir.
COMMIT
Para que los cambios realizados
en un número de transacción permanente la sentencia COMMIT.
La sintaxis de la sentencia
COMMIT es
COMMIT [WORK] [COMENTARIO 'tu
comentario "];
De trabajo es opcional.
COMENTARIO también es opcional,
especifique esta opción si desea identificar la transacción en DBA_2PC_PENDING
diccionario de datos.
Ejemplo
insertar en emp (empno, Ename,
sal) valores (101, 'Abid', 2300);
cometerlo;
ROLLBACK
Para deshacer los cambios realizados en una
transacción de dar rollback comunicado. Rollback restaurar el estado de la base
de datos para el último punto de confirmación.
Ejemplo:
eliminar de emp;
rollback / * deshacer los cambios
* /
SAVEPOINT
Especifique un punto de una
operación a la que más tarde se puede deshacer.
Ejemplo
insertar en emp (empno, Ename,
sal) values (109, 'Sami', 3000);
un punto de retorno;
insertar en los valores dept (10,
'Ventas', 'Hyd');
punto de retorno b;
insertar en los valores SALGRADE
('III', 9000,12000);
Ahora, si se le da
revertir a una;
Entonces fila de SALGRADE mesa y
sección será respaldado por rodar. Ahora usted puede cometer la fila insertada
en la tabla emp o deshacer la transacción.
Si usted le da
rollback para b;
A continuación, la fila se
inserta en la tabla SALGRADE será respaldado por rollo. Ahora usted puede
cometer la fila insertada en dept tabla y la tabla emp o revertir a un punto de
retorno o rodar completamente respaldado la transacción.
Si usted le da
rollback;
Entonces las transacciones
completas se rollo respaldó.
Si usted le da
cometerlo;
Suscribirse a:
Entradas (Atom)