viernes, 15 de julio de 2016

Indices particion

DECLARE @db_id SMALLINT;
DECLARE @object_id INT;


SET @db_id = DB_ID(N'NombreDb');
SET @object_id = OBJECT_ID(N'NOmbreTabla');

    SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , 'LIMITED');

SELECT
    object_id AS objectid,
    index_id AS indexid,
    partition_number AS partitionnum,
    avg_fragmentation_in_percent AS frag

FROM sys.dm_db_index_physical_stats (@db_id, @object_id, NULL , NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;



DECLARE @schemaname nvarchar(130);
DECLARE @objectname nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @partitioncount bigint;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @command nvarchar(4000);

DECLARE @pFrag INT

set @objectid =757577737

set  @indexid=17

  SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
        FROM sys.objects AS o
        JOIN sys.schemas as s ON s.schema_id = o.schema_id
        WHERE o.object_id = @objectid;

         SELECT @indexname = QUOTENAME(name)
        FROM sys.indexes
        WHERE  object_id = @objectid AND index_id = @indexid;
        SELECT @partitioncount = count (*)
        FROM sys.partitions
        WHERE object_id = @objectid AND index_id = @indexid;

        select  @objectname,@schemaname,@indexname,@partitioncount
       
        SELECT       
            @pFrag=avg_fragmentation_in_percent
        FROM sys.dm_db_index_physical_stats (12, 757577737, @indexid , NULL, 'LIMITED')
        WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;
       
        SELECT  @indexname AS Nombre ,@pFrag Fragmentacion
        IF @pFrag>30
        BEGIN
            IF CHARINDEX('PK',@indexname,0)=0
            BEGIN
                SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD with(ONLINE = ON)';
            END

        END
        ELSE
        BEGIN
            IF CHARINDEX('PK',@indexname,0)=0                
                SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE with(ONLINE = ON)';
        END
       
         --

          select @command;



ALTER INDEX [IX_SMOUTBOX_DATE_CLIENT] ON [dbo].[SmsOutBox] REORGANIZE with(ONLINE = ON)


--DECLARE @document VARCHAR(100)
--SELECT @document = 'Reflectors are vital safety' +
--                   ' components of your bicycle.';
--SELECT CHARINDEX('X', @document, 5);


jueves, 21 de agosto de 2014

Variables de sustitución


En todas las publicaciones anteriores hemos ejecutado consultas con columnas, valores y condiciones fijos, vamos a hacer nuestras consultas dinámicas, donde siempre se ejecute la misma consulta con valores diferentes.
El uso de las variables de sustitución está limitado SQL Plus o SQL Developer.
Veamos un ejemplo de las variables de sustitución:
SELECT
  *
FROM hr.employees
WHERE employee_id=&id_del_empleado;
Al momento de ejecutar la consulta, se despliega una ventana solicitando el valor que va a ir en la variable de sustitución &id_del_empleado:


Para este caso se buscó el empleado con id 204:

Se debe tener en cuenta los tipos de datos, realmente lo que hace la variable de sustitución es pedir un valor y ese valor es remplazado textualmente sin alguna modificación, si consultamos un valor de tipo carácter o cadena de caracteres, de deben poner las comillas simples en la ventana donde pide el valor, veamos un ejemplo donde consultamos por el nombre del empleado:
SELECT
   employee_id
  ,last_name
  ,hire_date
  ,job_id
FROM hr.employees
WHERE last_name=&apellido_del_empleado;


Veríamos un error por tipo de dato

Si el al  ejecutar la consulta lo encerramos en comillas simples, de estamos diciendo que es una cadena de caracteres y se ejecuta sin algún error:


Así se pueden manejar los caracteres, las cadenas de caracteres y fechas.
Las variables de sustitución pueden ser usadas en las clausulas SELECT, WHERE y ORDER BY.
Veamos un ejemplo:
SELECT
   employee_id
  ,last_name
  ,hire_date
  ,&columna_a_mostrar
FROM hr.employees
WHERE last_name=&apellido_del_empleado
ORDER BY &ordenado_por;

El resultado seria:


Usando doble ampersand en variables de sustitución
Se usa doble ampersand (&&) para definir las variables de sustitución que se están reusando:
SELECT
   employee_id
  ,last_name
  ,hire_date
  ,&&columna
FROM hr.employees
WHERE last_name='Whalen'
ORDER BY &&columna;


Observemos que la variable de sustitución es solo una en las dos cláusulas que se usa, se muestra solo una ventana pidiendo una sola vez el valor y la función del doble ampersand es reusarese valor en los dos lados donde se usa, el resultado seria:


Recuerde que usted puede definir sus variables a usar

Siguiente tema: comandos  DEFINE y VERIFY

viernes, 15 de agosto de 2014

ORDER BY Usando la cláusula para ordenar registros

En ocasiones es necesario ordenar los registros devueltos o recuperados de la consulta.
Con la cláusula ORDER BY se puede ordenar los registros recuperados de forma
                ASC        : Ascendente “Esta forma es la que por defecto usa ORACLE” y
                DESC      : Orden descendente.
La cláusula ORDER BY es la última que se ubica en una consulta SQL.
Si no se usa la cláusula ORDER BY, el orden de los registros recuperados es indefinido.
Se puede usar la palabra clave NULLS FIRST O NULLS LAST para indicar que los valores nulos de la columna que se están ordenando, se muestren al principio o al final.
La estructura de una consulta con la cláusula ORDER BY es:
SELECT                  expresión
FROM                   tabla
[WHERE condición o condiciones]            
[ORDER BY {columnas, expresiones, posición numérica} [ASC|DESC]]

Miremos algunos ejemplos:
SELECT
    last_name
   ,job_id
   ,salary
FROM hr.employees
WHERE  salary < 3000
ORDER BY last_name;


Por defecto se ordena en orden ascendente, si usamos la palabra clave ASC obtendríamos el mismo resultado.
SELECT
    last_name
   ,job_id
   ,salary
FROM hr.employees
WHERE  salary < 3000
ORDER BY last_name ASC;


Si usamos  la palabra clave DESC ordena de mayor a menor.
SELECT
    last_name
   ,job_id
   ,salary
FROM hr.employees
WHERE  salary < 3000
ORDER BY last_name DESC;


Los valores ordenados para las columnas de números es en orden ascendente desde el 0 hasta Infinito, para los valores de cadena de caracteres es de la A a la Z, para los valores de fechas van primero las fechas anteriores, es decir: va primero 13-JAN-01 que 21-APR-08


Veamos un ejemplo de cómo se usa NULLS FIRST o NULLS LAST
SELECT
     last_name
    ,hire_date
    ,department_id
FROM hr.employees
ORDER BY department_id DESC NULLS FIRST;


Si usamos NULLS FIRST  dejamos los nulos al inicio del resultado o de los registros recuperados.
Por el contrario  NULLS LAST los deja al final de los registros recuperados.
SELECT
     last_name
    ,hire_date
    ,department_id
FROM hr.employees
ORDER BY department_id DESC NULLS LAST;


Ordenar por posición numérica
Así como podemos ordenar por el nombre de la columna, también podemos ordenar por orden numérico,
En la siguiente consulta vamos a analizar el posicionamiento o como está definido el orden numérico:
SELECT
     last_name
    ,hire_date
    ,department_id
FROM hr.employees
ORDER BY 1;


Cuando hablamos de ordenamiento numérico definimos que las columnas que se van a consultar o mostrar, tienen o se les asigna un valor numérico, para el caso de nuestra consulta:
last_name          : tiene el numero 1
hire_date            : tiene el numero 2
hire_date            : tiene el numero 3
department_id : tiene el numero 4

Si deseamos ordenar por la columna hire_date debemos usar ORDER BY 2 así:
SELECT
     last_name
    ,hire_date
    ,department_id
FROM hr.employees
ORDER BY 2;
El resultado de esta consulta es:



La proxima publicacion : Variables de sustitución (Substitution variables )

sábado, 9 de agosto de 2014

Reglas de precedencia






Se pueden usar paréntesis “()” para modificar o sobrescribir las reglas de precedencia.
Las reglas de precedencia determina el orden con que se evalúan y calculan las expresiones.
En la tabla de precedencia se indica el orden con que se ejecutan por defectos las reglas, sin embargo de ser necesario, se pueden modificar encerrando en paréntesis la expresión que quiera que se evalué primero.
La consulta
SELECT
    last_name
   ,job_id
   ,salary
FROM hr.employees
WHERE job_id = 'SA_REP'
  OR job_id = 'AD_PRES'
  AND salary > 15000;




Evalúa primero las expresiones relacionadas en el AND
   job_id = 'AD_PRES'
AND salary > 15000
El resultado del AND  de esas expresiones lo evalúa luego con el OR
job_id = 'SA_REP'
  OR resultado del AND


En esta misma consulta  podemos sobrescribir las reglas de precedencia con paréntesis.
SELECT
    last_name
   ,job_id
   ,salary
FROM hr.employees
WHERE (job_id = 'SA_REP'
  OR job_id = 'AD_PRES')
  AND salary > 15000;


Primero evalúa lo que está en paréntesis,
        (job_id = 'SA_REP'
  OR job_id = 'AD_PRES')

 el resultado de esa evaluación lo evalúa con la expresión AND
Resultado del parrentesis

AND salary > 15000

viernes, 8 de agosto de 2014

Operadores lógicos AND, OR o NOT, definiendo condiciones


Una condición lógica es evalúa el resultado de dos condiciones que devuelven un solo resultado, basado en esas condiciones evaluadas.
Un registro es devuelto o mostrado solo si el resultado  general es verdadero.




Todos los ejemplos vistos hasta este tema solo habían tenido una sola condición verdadera en su cláusula WHERE.


Usando el operador lógico AND
El operador lógico AND requiere que las dos componentes de las condiciones evaluadas sean verdaderas.
Es decir, si necesito todos los empleados que ganen $2600 y en su job_id contengan  el prefijo “SH”, es necesario usar el operador lógico AND así:
SELECT
   last_name
  ,job_id
  ,salary
FROM hr.employees
WHERE salary=2600
  AND job_id LIKE 'SH%';





La tabla de la verdad indica el comportamiento de la evolución de los componentes  






Usando el operador OR

El operador OR requiere que alguna delas dos componentes de la condición sean verdaderas.
Si es necesitamos  mostrar todos los empleados que ganen $2600 o en su job_id contengan el prefijo “SH”, es necesario usar el operador OR asi:
SELECT
   last_name
  ,job_id
  ,salary
FROM hr.employees
WHERE salary=2600
  OR job_id LIKE '%SH%';




El operador OR busca todos los registros que en su salario “salary” sean igual a 2600 sin importar el “job_id” que tengan, pero también busca todos los id de trabajo “job_id” que contengan el prefijo “SH” sim importa el “salary” que tengan.
Imegn operador 4






Operador lógico NOT

El operador lógico NOT indica todo lo que no sea, es decir si necesitamos todos los registros a excepción de algunos cuantos, podemos usar el operador NOT.
Pongamos el caso hipotético que necesitamos todos los empleados  que su “job_id” no sean AC_ACCOUNT, FI_ACCOUNT, SH_CLERK, ST_CLERK, usaríamos una consulta asi:
SELECT
    last_name
   ,job_id
   ,salary
FROM hr.employees
WHERE job_id NOT IN ('AC_ACCOUNT','FI_ACCOUNT','SH_CLERK','ST_CLERK');






Su tabla de la verdad es:



miércoles, 6 de agosto de 2014

Operadores de comparación






Los operadores de comparación son usados en condiciones que compara una expresión con otro valor o expresión, son usados en la cláusula WHERE.


Usando operadores de comparación
Digamos que se desea extraer el nombre y el salario de todos los empleados que ganen menos o  $3000.
SELECT
  last_name,
  salary
FROM hr.employees
WHERE salary <= 3000;
El resultado seria:


Si queremos buscar un valor en un rango de valores debemos usar el operador BETWEEN
SELECT
  last_name,
  salary
FROM hr.employees
WHERE salary BETWEEN 2900 AND 3000;

Donde 2900 es el valor límite inferior y 3000 es el valor límite superior
El resultado de la consulta seria:


Operador IN
Se usa el operador IN para evaluar los valores que están en la columna evaluada, si el valor que está en la columna evaluada esta en los valores o lista  que contiene el operador IN, el registro es mostrado.
Es decir, si deseamos que se muestre solo los salarios de los empleados que ganan  ‘3000’,’2500’ y ‘2300’, podemos ejecutarla consulta:
SELECT
  last_name,
  salary
FROM hr.employees
WHERE salary IN ('3000','2500','2300');




Cabe agregar que si la columna evaluada no contiene uno de los valores relacionados en la lista que recibe el operador IN, no será mostrado.



Operador LIKE
Quizás no se conozca el valor exacto que desea buscar, con el operador LIKE, puede usar un comodín o parte de la palabra o valor a buscar.  
El operador LIKE, busca en una cadena de caracteres que se especifique, si existe un carácter o expresión en el valore de la columna que contenga la cadena o carácter, retorna true y devuelve el valor encontrado.
Si deseamos traer todos los nombres de los empleados que inicien con la letra “S”, deberías consultalos asi:
SELECT
   last_name
  ,salary
FROM hr.employees
WHERE last_name LIKE 'S%';
El resultadode ejecutar esta consulta es:



También se puede usar el símbolo “_” para representar un solo carácter, si queremos traer todos los empleados  que en su segunda letra tenga la letra “a” ejecutaríamos la consulta:
SELECT
   last_name
  ,salary
FROM hr.employees
WHERE last_name LIKE '_a%';




Es necesario usar el identificador de escape “\” en caso de tener en el campo a filtrar, en nuestro caso el job_id contenga o haga parte de la cadena el carácter “_”, consultemos los empleados con su nombre y id de trabajo “job_id”:
SELECT
   last_name
  ,job_id
FROM hr.employees;  




Si deseáramos consultar todos los job_id  que iniciaran con la cadena de caracteres “SA_”  sería necesario escapar  el carácter “_”, debido a que Oracle toma el carácter como un solo carácter después de la cadena “SA”, en este caso usaríamos la consulta:
SELECT
   last_name
  ,job_id
FROM hr.employees
WHERE job_id LIKE '%SA\_%' ESCAPE '\';


Donde ESCAPE ‘\’ es como le indicamos al operador de comparación LIKE que el carácter “_” hace parte de la cadena que vamos a buscar.
Operador IS NULL
Este operador identifica busca las columnas que contengan un nulo, si fuera necesario identificar cuales empleados tiene una comisión pct nula, podemos ejecutar la consulta:
SELECT
   last_name
  ,job_id
  ,commission_pct
FROM hr.employees
WHERE commission_pct IS NULL;



De igual forma los para el operador de comparación IS NOT NULL  indica todos los que no tengan una comisión pct nula.

Cadena de caracteres y fechas


Las cadenas de caracteres y fechas deben ser encerrados en comillas simples (‘).
Los valores carácter son CASE-SENSITIVE.
Los Valores fecha son FORMAT-SENSITIVE.
Las fechas por defecto se muestran en un formato DD-MON-RR.

Digamos que deseamos mostrar todos los empleados que su apellido sea “Grant”
SELECT
  last_name,
  department_id
FROM hr.employees
WHERE last_name ='Grant';
El resultado de la consulta será:


Si ejecutamos la misma consulta solo cambiando el valor que estamos buscando de “Grant” a “grant”
SELECT
  last_name,
  department_id
FROM hr.employees
WHERE last_name ='grant';

El resultado será:



Para las fechas ocurre lo mismo con el formato, como se mencionó anteriormente, el formato de la fecha por defecto es DD-MON-RR, esto hace que al consultar una fecha, deber ser consultada con elformato requerido, asi:
SELECT
  last_name,
  hire_date,
  department_id
FROM hr.employees
WHERE hire_date='07-JUN-02';



Pero si cambiamos el formato
SELECT
  last_name,
  hire_date,
  department_id
FROM hr.employees
WHERE hire_date='07-06-02';

El resultado sería diferente:



Las bases de datos Oracle, almacena la información internamente en un formato numérico, representando Siglos, años, meses, días, horas  y segundos.