Seleccionar filas aleatorias en PostgreSQL (RANDOM y TABLESAMPLE)

En ocasiones es necesario obtener filas aleatorias de una tabla, sobre todo cuando se realizan pruebas a los datos  en cuestión. PostgreSQL permite obtener datos aleatorios, inicialmente se podía hacer con la funciones RANDOM(), pero luego de la versión 9.5 agregaron el estándar TABLESAMPLE SQL 2003 para dicha actividad, siguiendo con la política de PostgreSQL de evolución y apegándose al estándar definido. Pues veamos en que consiste:

En el ejemplo se trabajará con la tabla customers  que tienen 20000 registros

Obtener aproximadamente el 50% de los datos de la tabla, antes de la versión 9.5


dell=# SELECT count(*) FROM customers where RANDOM() <=0.5;
count
-------
10009
(1 fila)

Obtener aproximadamente el 50% de los datos de la tabla, desde versión 9.5 se utiliza TABLESAMPLE, existen dos métodos SYSTEM y BERNOULLI, los cuales puede verse sus especificaciones en la documentacion oficial al respecto, que según la misma el método SYSTEM resulta más rápido que el BERNOULLI, pero el BERNOULLI es más disperso en la muestra.

 


dell=# SELECT count(*) FROM customers TABLESAMPLE SYSTEM(50);
count
-------
9766
(1 fila)

dell=# SELECT count(*) FROM customers TABLESAMPLE BERNOULLI(50);
count
-------
10061
(1 fila) 

Como se puede observar se permite obtener datos aleatorios de una tabla en PostgreSQL, destacar además que la solución del estándar TABLESAMPLE es más rápida que la del RANDOM, pero bueno usted es libre de elegir la solución a utilizar.

Nos vemos en otra 😉

Peticiones http desde PostgreSQL

Hola a todos, pues si como se lee en el título de la entrada, hacer peticiones http desde dentro del motor de base de datos de código abierto más avanzado del mundo es posible, y todo gracias al mecanismo de extensiones que posee PostgreSQL, del cual ya he dicho que soy FAN. Que podemos hacer un un cliente http desde dentro de PostgreSQL, pues hacer peticiones WEB a sitios o servicios  restful, etc. Por ejemplo, puede que necesitemos hacer desde el motor la descarga de un sitio web para su posterior procesamiento y simplemente leer un JSON que retorna una petición restful. Para todo esto se puede utilizar la extensión pgsql-http, desarrollada por Paul Ramsey, que también tiene otras contribuciones a PostgreSQL.

Pues manos a la obra, instalaremos y probemos que tal Sigue leyendo

JSONB un JSON superior en PostgreSQL– parte 2

En una entrada previa les comentaba sobre el tipo de datos JSONB en PostgreSQL, y de las ventajas que tiene sobre JSON, resulta que la versión 9.5 de PostgreSQL liberó varias funcionalidades nuevas con este novedoso tipo de dato en los motores relacionales de bases de datos, entre las que figuran están los nuevos operadores y funciones:

 

Operator Description
|| Concatenate two jsonb values into a new jsonb value
-(text) Delete key/value pair or string element from left operand. Key/value pairs are matched based on their key value.
-(int) Delete the array element with specified index (Negative integers count from the end). Throws an error if top level container is not an array.
#- Delete the field or element with specified path (for JSON arrays, negative integers count from the end)

Veamos como funcionan estos nuevos operadores

Sigue leyendo

Leer filas borradas o actualizadas en PostgreSQL

Hace un tiempo lei sobre una extensión llamada pg_dirtyread, que como su nombre indica te permite leer datos sucios de una tabla  que aun no se le ha realizado vaccum, recuerden que el vaccum elimina o permite reutilizar es espacio de las  tuplas muertas, realmente no la había probado, pero me decidí hacerlo ahora luego de mucho tiempo para ver que tal. En realidad hay que tener claro que  es solo leer datos que han sido eliminados o actualizados y que aun no has realizado vaccum en esa tabla, también aclarar que puede generar “INCONSISTENCIA EN LA BD”, pero en el algunos casos puede ser útil, pues probemos que tal funciona:

Se descarga de  aquí la extensión

Sigue leyendo

Seguridad por Filas en PostgreSQL 9.5 (Row Level Security)

Si como ven el título se puede lograr el Row Level Security (RLS) desde PostgreSQL 9.5, fascinante esta funcionalidad, quedaron atrás los trucos con las vistas para lograr el RLS en PostgreSQL, para ver la documentación puede visitar aquí

 

La sitanxis básica es:

CREATE POLICY name ON table_name [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ] [ TO { <trole_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ] [ USING ( using_expression> ) ] [ WITH CHECK ( check_expression ) ]

Sigue leyendo