viernes, 19 de agosto de 2016

SELECT INTO vs INSERT INTO on Columnstore

SELECT INTO vs INSERT INTO on Columnstore

By Ramya Makam, (first published: 2015/06/09)

Introduction

There were many enhancements in SQL Server 2014 and one amongst them is the fact that SELECT INTO now operates with parallelism. How does that help us if we need to use it on tables with clustered columnstore indexes? This article compares SELECT INTO and INSERT INTO under different scenarios, and the best approach preferred.

Explanation

I considered a table, test_source, containing 50 million rows for my tests. The space used by this table without any index on it is 23.8GB. A screenshot of the space used is shown below.

Scenario 1

Let us consider the following scenario where the source table, test_source, has a clustered columnstore index on it, and the destination table, test_dest, requires a clustered columnstore index to be created on it. This is shown in the table below.
Source table has cci index on it?
Destination table requires cci index on it?
yes
yes
First, I used “SELECT INTO” from test_source to test_dest. I then created a clustered columnstore index on the destination table. The observations are shown below. First is the output of the SELECT INTO statement:

Let’s see the space used by the table, “test_dest”.

The datafile has grown to 23.8 GB and log file has grown to 555MB.
I then created a clustered columnstore index on the destination table “test_dest” and observations are below.

Space used by the table test_dest is 3 GB

The datafile has grown to 26.8 GB and logfile has grown to 555 MB. The total time taken for the SELECT INTO + Create columnstore is 22 minutes.
Now let us consider the following scenario where we create the table first, then create clustered columnstore index and insert the data. The observations are shown below.

The space used by the table “test_dest” is shown below

The datafile has grown to 3.01 GB and log file has grown to 132 MB. The space used by the database now is 3.1 GB

The total time taken for creating the table, clustered columnstore index and inserting the data is 30 minutes. 
When comparing these two scenarios, we can easily notice that SELECT INTO is faster than INSERT INTO. However, SELECT INTO consumes more space. INSERT INTO is a little bit slower but doesn’t cause space issues, even when the datafile has less free space. Having free space of 3.01 GB is enough for the INSERT INTO operation whereas SELECT INTO requires 23.8 GB for the operation to complete.

Scenario 2

Let’s consider the following scenario where source table “test_source” has clustered columnstore index on it and destination table “test_dest” doesn’t require clustered columnstore index to be created on it.
source table has cci index on it ?
Destination table requires cci index on it ?
yes
no
First, I used SELECT INTO from source table to destination table and then created clustered columnstore index on the destination table. The observations are shown below.
This is the output of the SELECT INTO statement:

Let’s see the space used by the table, test_dest.

The datafile has grown to 23.8 GB and log file has grown to 555MB. The total time taken for SELECT INTO is 17 minutes.
Now let’s consider the following scenario where we create the table first and insert the data. The observations are shown below.

The space used by the table, test_dest, is shown below

The datafile has grown to 23.8 GB GB and log file has grown to 43.5 GB. The space used by the database is now 67.3 GB

The total time taken for creating the table and inserting the data is 25 minutes.
When comparing these two scenarios, we notice that SELECT INTO is faster and consumes less log size than inserting the data using INSERT INTO. SELECT INTO is faster because it operates in parallel and is a bulk operation from behind, whereas INSERT INTO is a single threaded operation and consumes more log space when destination table is a rowstore.

Scenario 3

Let us consider the following scenario where the source table doesn’t have a clustered columnstore index on it and the destination table requires a clustered columnstore index to be created on it.
source table has cci index on it ?
Destination table requires cci index on it ?
no
yes
First, I used SELECT INTO from the source table to the destination table and then created a clustered columnstore index on the destination table. The observations are mentioned below. This is the output of select into statement

Let’s see the space used by the table, test_dest.

The datafile has grown to 23.8 GB and log file has grown to 555MB.
I then created a clustered columnstore index on the destination table, and the observations are below.

Space used by the table test_dest is 3 GB.

The datafile has grown to 26.8 GB and the log file has grown to 555 MB. The total time taken for SELECT INTO + Create columnstore is 22 minutes.
Now let’s consider the following scenario where we create the table first, then create clustered columnstore index and insert the data. The observations are shown below.

The space used by the table, test_dest, is shown below.

The datafile has grown to 2.98 GB and log file has grown to 109 MB. The space used by the database is now 3.1 GB.

The total time taken for creating the table, creating the clustered columnstore index, and inserting the data is 28 minutes.
When comparing these two scenarios, we can easily notice that SELECT INTO is faster than INSERT INTO. However, SELECT INTO consumes more space. INSERT INTO is a little bit slower but doesn’t cause space issue even when the datafile has less free space. Free space of 3.01 GB is enough for the INSERT INTO operation whereas SELECT INTO requires 23.8 GB for the operation to complete.
Below is the comparison of all the scenarios discussed in this article.

Conclusion

We can use either of the approaches among “SELECT INTO” and “INSERT INTO” for performing a table copy. When there are no space issues and we need the operation to complete faster, SELECT INTO is preferred. When there are space issues, INSERT INTO is preferred because operation might be slow but definitely succeeds.
Hope my article was helpful to you.


Fuente: www.sqlservercentral.com  

CodeIgniter


Es un framework PHP para la creación rápida de aplicaciones web. Presentación general del framework y primeras notas para empezar a usarlo.
Probablemente ya sepamos que un framework es un programa para desarrollar otros programas, CodeIgniter, por tanto, es un programa o aplicación web desarrollada en PHP para la creación de cualquier tipo de aplicación web bajo PHP. Es un producto de código libre, libre de uso para cualquier aplicación. Como cualquier otro framework, Codeigniter contiene una serie de librerías que sirven para el desarrollo de aplicaciones web y además propone una manera de desarrollarlas que debemos seguir para obtener provecho de la aplicación. Esto es, marca una manera específica de codificar las páginas web y clasificar sus diferentes scripts, que sirve para que el código esté organizado y sea más fácil de crear y mantener. CodeIgniter implementa el proceso de desarrollo llamado Model View Controller (MVC), que es un estándar de programación de aplicaciones, utilizado tanto para hacer sitios web como programas tradicionales. Este sistema tiene sus características, que veremos en artículos siguientes.
CodeIgniter no es magia, pero contiene muchas ayudas para la creación de aplicaciones PHP avanzadas, que hacen que el proceso de desarrollo más rápido. A la vez, define una arquitectura de desarrollo que hará que programemos de una manera más ordenada y contiene diversas herramientas que ayudan a hacer aplicaciones más versátiles y seguras.
CodeIgniter y otros frameworks PHP pueden ayudarte a dar el salto definitivo como desarrollador PHP, creando aplicaciones web más profesionales y con código más reutilizable, con la diferencia que Code Igniter está creado para que sea fácil de instalar en cualquier servidor y de empezar a usar que cualquier otro framework. Además muchas de sus utilidades y modos de funcionamiento son opcionales, lo que hace que goces de mayor libertad a la hora de desarrollar sitios web.

Características generales de CodeIgniter

Algunos de los puntos más interesantes sobre este framework, sobre todo en comparación con otros productos similares, son los siguientes: Versatilidad: Quizás la característica principal de CodeIgniter, en comparación con otros frameworks PHP. CodeIgniter es capaz de trabajar la mayoría de los entornos o servidores, incluso en sistemas de alojamiento compartido, donde sólo tenemos un acceso por FTP para enviar los archivos al servidor y donde no tenemos acceso a su configuración.
Compatibilidad: CodeIgniter, al menos en el momento de escribir este artículo de desarrolloweb.com, es compatible con la versión PHP 4, lo que hace que se pueda utilizar en cualquier servidor, incluso en algunos antiguos. Por supuesto, funciona correctamente también en PHP 5.
Actualizado: Desde la versión 2 de CodeIgniter ya solo es compatible con la versión 5 de PHP. Para los que todavía usen PHP 4 pueden descargar una versión antigua del framework, como CodeIgniter V 1.7.3, que todavía era compatible. Estas versiones están en la página de descargas de CodeIgniter.
Facilidad de instalación: No es necesario más que una cuenta de FTP para subir CodeIgniter al servidor y su configuración se realiza con apenas la edición de un archivo, donde debemos escribir cosas como el acceso a la base de datos. Durante la configuración no necesitaremos acceso a herramientas como la línea de comandos, que no suelen estar disponibles en todos los alojamientos.
Flexibilidad: CodeIgniter es bastante menos rígido que otros frameworks. Define una manera de trabajar específica, pero en muchos de los casos podemos seguirla o no y sus reglas de codificación muchas veces nos las podemos saltar para trabajar como más a gusto encontremos. Algunos módulos como el uso de plantillas son totalmente opcionales. Esto ayuda muchas veces también a que la curva de aprendizaje sea más sencilla al principio.
Ligereza: El núcleo de CodeIgniter es bastante ligero, lo que permite que el servidor no se sobrecargue interpretando o ejecutando grandes porciones de código. La mayoría de los módulos o clases que ofrece se pueden cargar de manera opcional, sólo cuando se van a utilizar realmente.
Documentación tutorializada: La documentación de CodeIgniter es fácil de seguir y de asimilar, porque está escrita en modo de tutorial. Esto no facilita mucho la referencia rápida, cuando ya sabemos acerca del framework y queremos consultar sobre una función o un método en concreto, pero para iniciarnos sin duda se agradece mucho.
Sin duda, lo más destacable de CodeIgniter es su accesibilidad, ya que podemos utilizarlo en la mayor gama de entornos. Esta es la razón por la que en DesarrolloWeb.com hemos elegido este framework PHP para comenzar un manual que explicará cómo utilizarlo para desarrollar nuestras propias aplicaciones web. En siguientes artículos iremos contando diferentes aspectos de este framework y lo utilizaremos para crear una primera aplicación web. Para continuar puedes leer el artículo Instalación y configuración de CodeIgniter. También puedes ir al Manual de Codeigniter que estamos publicando.

Fuente: http://www.desarrolloweb.com/articulos/codeigniter.html
Video Tutorial (español): Video Tutorial Español (YouTube)

jueves, 30 de junio de 2016

jueves, 9 de junio de 2016

Seguridad en Base de Datos

Este artículo lo vi muy interesante
Lo tome de la pagina:


Seguridad en Base de Datos

Eliezer Molina
junio 6, 2016
 

Seguridad en Base de Datos


Seguridad en Base de Datos, Generalmente nos hemos centrado en asegurar los perímetros de las redes por medio de, firewalls, IDS / IPS y antivirus, claves robustas y demás medidas de seguridad.
Creo que todos sabemos de primera mano o de forma bastante cercana, lo que significa un usuario con altos privilegios administrativos, mejor conocido como Super Admin, root, Administrator, etc. Ya des entender un poco el punto, el problema de la seguridad en base de datos es que no definimos claramente que debe hacer cada usuario.

Seguridad en Base de Datos, qué hacer para lograrlo?


En mi experiencia, he visto que por facilitar el proceso de puesta en marcha de algún sistema, los administradores y/o programadores, no prestan la suficiente atención a los detalles requeridos para garantizar la seguridad en base de datos. Ciertos procesos, no requieren de un nivel de privilegio elevado, en la mayoría de los casos, los programas solo requieren unos pocos accesos a la base de datos que podría garantizar las seguridad en base de datos, por ejemplo: ALTER, CREATE, CREATE TEMPORARY TABLES, DELETE, DROP, INDEX, INSERT, LOCK TABLES, SELECT, UPDATE.
Estos permisos son casi básicos para toda plataforma, un usuario con estos 10 permisos, será capaz de escribir y leer, pero no podrá modificar cierta estructura, para eso necesitaría el permiso de root, lo que asegura un poco el acceso no autorizado, es más, creo que frenaría un poquito las inyecciones SQL que sufren muchos portales.

No es la intención decir, que has hecho un mal trabajo, de seguro inviertes mucho tiempo en desarrollar una aplicación, pero tal vez, solo tal vez, debemos poner un poco mas de esfuerzo en asegurar los permisos que se asignan a los usuarios en pro de la seguridad en base de datos.

Te contaré algo, hace unas semanas, pase por una mediana empresa, allí tenían un sistema de facturación, este sistema necesitaba conexión a MS SQL Server, note de inmediato algunas brechas de seguridad, la primera fue que usaron Admin/admin2016 como usuario y contraseña, respectivamente, estamos hablando de un programa de facturación, control de nomina, inventario, entre otros módulos que se consideran confidenciales y muy apetecibles para los cibercriminales, en la red se notó comportamiento extraño y/o sospechoso, al activa un IPS temporal, vimos que se solicitaba conexión al puerto TCP 3127 hacia Hong Kong, de inmediato imaginamos lo peor, una fuga de información, al inspeccionar el servidor de DB se identifico un registro que se realizaron conexiones desde una ubicación remota y se había programado un respaldo cada 2 horas.

Todo esto por dos descuidos, un usuario despistado con privilegios elevados y una clave de aficionados.

Por eso el consejo de prestar atención, a los privilegios que se asignan a los usuarios de forma que podamos garantizar la seguridad en base de datos de una organización o servidor web que utilices, indaga cuales son los permisos mínimos requeridos y trabaja con ellos.

viernes, 22 de abril de 2016

Comandos utiles para DB's SQL Server

A menudo necesitamos dar mantenimiento por razones de tiempo de respuesta y espacio.
a continuación les muestro una serie de comandos que nos pueden ayudar a mejorar nuestra DB

Estos comandos esta en un ambiente SQL Server 2008R2 SP3

primero para que pueda funcionar los comando poner poner la DB a Recovery Simple

ALTER DATABASE {DB NAME}  SET RECOVERY SIMPLE;
GO
--Luego los comandos:

DBCC SHRINKFILE (N'{db name}' , 46)
DBCC SHRINKDATABASE(N'{db name}' )
DBCC SHRINKFILE (N'{db name}' , 0, TRUNCATEONLY)
DBCC SHRINKFILE (N'{db name_log}' , 1)

---luego retornamos la base de datos a su estado normal

ALTER DATABASE {db name} SET RECOVERY FULL;
GO

NOTA: Estos datos son buenos para optimizar espacio en disco y validar que el tiempo de respuesta mejore, pero si queremos utilizar el log para la recuperación de desastres, luego de ejecutar estos comando ya no podremos hacerlo. Por lo tanto se debe evaluar la frecuencia de la ejecución de dichos comandos.

para ver el porcentaje de uso de el log con relación a la base de datos podemos ejecutar el siguiente comando:

DBCC SQLPERF(LOGSPACE);

adicional esta este link:
https://msdn.microsoft.com/es-es/library/ms188796(v=sql.120).aspx

donde hay mas comandos que nos podrán ayudar a tener bien nuestra DB.

¿que cuentan?




DeepSeek R1: La IA Multifacética que Todo Ingeniero de Software Debería Probar (¡Y es Gratis!)

  Introducción En el mundo de la ingeniería de software, las herramientas que nos ahorran tiempo y resuelven problemas complejos son oro pu...