Particionar Tablas en SQL Server

Cuando el numero de registros de una tabla es muy elevado, el rendimiento puede degradarse. Tenemos la posibilidad de dividirla en trozos; es decir particionarla. En ciertos escenarios permite mejorar el rendimiento en consultas y en operaciones masivas de mantenimiento.

  • 1.- En SQL OnPremise debemos definimos las particiones (espacios donde ubicar los datos). Por ejemplo a nivel físico podemos distribuir las particiones en diferentes unidades de disco.
    ALTER DATABASE [BackupOfCSPBillingSoftengPartition2]
    ADD FILEGROUP HalfYear1
    GO
    ALTER DATABASE [BackupOfCSPBillingSoftengPartition2]
    ADD FILEGROUP HalfYear1b
    GO
    ALTER DATABASE [BackupOfCSPBillingSoftengPartition2]
    ADD FILEGROUP HalfYear2
    GO
    ALTER DATABASE [BackupOfCSPBillingSoftengPartition2]
        ADD FILE 
        (
        NAME = HalfYear1,
        FILENAME = 'd:\Backup\PartitioningDB1.ndf',
            SIZE = 3072 KB, 
            MAXSIZE = UNLIMITED, 
            FILEGROWTH = 10024 KB
        ) TO FILEGROUP HalfYear1
    
    ALTER DATABASE [BackupOfCSPBillingSoftengPartition2]
        ADD FILE 
        (
        NAME = HalfYear1b,
        FILENAME = 'd:\Backup\PartitioningDB2.ndf',
            SIZE = 3072 KB, 
            MAXSIZE = UNLIMITED, 
            FILEGROWTH = 10024 KB
        ) TO FILEGROUP HalfYear1b
    
    ALTER DATABASE [BackupOfCSPBillingSoftengPartition2]
        ADD FILE 
        (
        NAME = HalfYear2,
        FILENAME = 'd:\Backup\PartitioningDB3.ndf',
            SIZE = 3072 KB, 
            MAXSIZE = UNLIMITED, 
            FILEGROWTH = 10024 KB
        ) TO FILEGROUP HalfYear2
    
  • 2.- Crear la función que genera la distribución de Hash. Por ejemplo, genera valores diferentes para cada periodo de medio año.
    CREATE PARTITION FUNCTION [iluUssageDatePartition](datetime) 
    AS RANGE LEFT FOR VALUES (N'2017-01-01T00:00:00', N'2017-06-01T00:00:00', N'2019-01-01T00:00:00')
    
  • 3.- Asigna para cada valor de Hash que partición le corresponde.
    • En SQL OnPremise. Asigna cada valor la partición:
      CREATE PARTITION SCHEME [iluUssageDatePartition] 
      AS PARTITION [iluUssageDatePartition] ALL TO ([PRIMARY]);TO ([HalfYear1], [HalfYear1b], [HalfYear2], [PRIMARY])
      
    • En SQL Azure se asigna todas a la PRIMARIA ya que no tenemos acceso al disco del servidor. Pero asignar las particiones genera internamente optimizaciones en el motor de almacenamiento de SQL Azure. 😉
      CREATE PARTITION SCHEME [iluUssageDatePartition] 
      AS PARTITION [iluUssageDatePartition] ALL TO ([PRIMARY]);
      
  • 4.- Indicar en la tabla que vamos usar la partición.
    • En Tabla Nueva:
      CREATE TABLE [dbo].[InvoiceLineUssage](
      	[InvoiceLineUssageId] [bigint] IDENTITY(1,1) NOT NULL,
              [UsageDate] [datetime] NOT NULL,
              ....
              
              CONSTRAINT [PK_InvoiceLineUssage] PRIMARY KEY NONCLUSTERED 
      (
      	[InvoiceLineUssageId] ASC
      )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
      ) ON ON [iluUssageDatePartition]([UsageDate])
      
    • En Tabla Existente:
      ALTER TABLE [dbo].[InvoiceLineUssage] ADD  CONSTRAINT [PK_InvoiceLineUssage] PRIMARY KEY NONCLUSTERED 
      (
      	[InvoiceLineUssageId] ASC
      )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
      
      
      CREATE CLUSTERED INDEX [ClusteredIndex_on_iluUssageDatePartition_636416817899691987] ON [dbo].[InvoiceLineUssage]
      (
      	[UsageDate]
      )WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [iluUssageDatePartition]([UsageDate])
      
      
      DROP INDEX [ClusteredIndex_on_iluUssageDatePartition_636416817899691987] ON [dbo].[InvoiceLineUssage]
      
Anuncios
Publicado en Sql Azure | Deja un comentario

Optimizaciones con WebPack

En esta entrada se describen las mejoras que podemos obtener WebPack.

Transpilador

Permite usar javascript ES6/7 transformandolo a javascript ES5. Para ello usamos babel-loader.

  • 1.- Instalar el paquete:
    npm i babel-loader babel-core babel-preset-env --save
    
  • 2.- Añadir en la configuración en el webpack.config.js.
        module: {
            rules: [
                {
                    test: /\.js$/,
                    exclude: /node_modules/,
                    use: {
                        loader: 'babel-loader',
                        options: {
                            presets: ['env']
                        }
                    }
                }]
        }
    

Minificar

Genera un javascript de tamaño más reducido.

  • Elimina espacios adicionales, saltos de línea y sangrías.
  • Elimina comentarios.
  • Cambia nombres de nombres de variables y funciones haciendolos más cortos.

Para ello usamos UglifyJsPlugin:

  • 1.- Instalar el paquete:
    npm i uglifyjs-webpack-plugin --save
    
  • 2.- Añadir en la configuración en el webpack.config.js.
    plugins: [
        new webpack.optimize.UglifyJsPlugin()
    ]
    

Compresión

Los servidores de aplicación sirven los ficheros de javascript comprimidos (gzip), pero el nivel de compresión no es el óptimo (también se requiere capacidad de proceso para realizar la compresión). Podemos generar los javascript comprimidos con un menor tamaño usando un nivel más elevado de compresión y evitando procesado en el servidor. Por ejemplo usando CompressionWebpackPlugin.

  • 1.- Instalar el paquete:
    npm i compression-webpack-plugin --save
    
  • 2.- Añadir en la configuración en el webpack.config.js.
                new CompressionPlugin({
                    asset: "gz/[file].gz[query]",
                    algorithm: "gzip",
                    test: /\.(js|html)$/,
                    threshold: 10240,
                    minRatio: 0.8  //Default
                })
    
  • 3.- Para evitar que el IIS vuelva a comprimir los ficheros ya comprimidos. Añadir las siguientes entraras en el web.config.
    <system.webServer>
        <staticContent>
           <mimeMap fileExtension=".js.gz" mimeType="application/javascript" />
        </staticContent>
    </system.webServer>
    
      <location path="dist/gz">
        <system.webServer>
          <urlCompression doStaticCompression="false" doDynamicCompression="false" dynamicCompressionBeforeCache="false" />
          <httpProtocol>
            <customHeaders>
              <add name="content-encoding" value="gzip" />
            </customHeaders>
          </httpProtocol>
        </system.webServer>
      </location>
    
  • 4.- Se generan dos ficheros el normal y el nuevo fichero comprimido de extensión .js.gz. En el html referenciaremos este nuevo fichero.
Publicado en web | Deja un comentario

Webpack

WebPack es un paquete npm que permite procesar, empaquetar y minimificarlo los ficheros Javacript, CSS, TypeStript,…
Los pasos a realizar:

  • 1.- Definir las dependencias en nuestros ficheros (js, css…) mediante:
    • import ‘path/to/file’
    • require(‘path/to/file’)
  • 2.- Definir el fichero webpack.config.js con la configuración.
  • 3.- Ejecutar la configuración, mediante:
    • webpack -d –color: Para entorno de desarrollo
    • webpack -p –color: Para entorno de producción

Webpack.config.js

El Webpack.config.js es un fichero json que se estructura con los siguientes atributos:

  • entry: Es el fichero inicial que servirá de base para calcular las dependencias. Se pueden generar diferentes grupos de ficheros o chunks.
  • output: Es el/los ficheros generados y a exportar.
  • module: Contiene definiciones para trabajar con diferentes formatos: Javascript, css, jpg… Los loaders permiten realizar transformaciones del código fuente; como por ejemplo de: CoffeeScript, TypeScript, ESNext (Babel), Sass, Less, Stylus
  • plugins: Contiene las operaciones y su configuración. Por ejemplo, UglifyjsWebpackPlugin para mimificar el javascript, comprimirlo mediante CompressionPlugin

Acceso Externo a WebPack

El resultado se pude exportar como una líbreria para poder acceder externamente mediante javascript. Asi tenemos la posibilidad de compaginar el uso clasico y el nuevo sistema. 😉

  • 1.- En el fichero definimos export, con la variable o método que nos interesa.
    var globalize = require("globalize");
    export const translate = globalize;
    //export function helloWorld() { console.log('hello World') }
    
  • 2.- Añadir en Webpack.config.js queremos tenerlo disponible como una librería. En este caso una variable de nombre EntryPoint.
    module.exports = {
        ...
        output: {
            filename: '[name].js',
            path: __dirname + '/dist',
            libraryTarget: 'var',
            library: 'EntryPoint'
        },
        ...
    }
    
  • 3.- Incluir el fichero generado por el WebPack.
  • 4.- Acceder desde otro javascript (fuera del webpack ;-)) o script en el html.
    var objectoGlobalize = window.EntryPoint.translate;
    console.log(objectoGlobalize.formatMessage("helloWorld"));
    

Soporte para Visual Studio

  • Disponemos de la extensión WebPackTaskRunner que nos integra los comandos de WebPack en el interfaz de Visual Studio.
Publicado en web | Etiquetado | 1 Comentario

Npm

Npm es el gestor de paquetes de Node.js; el equivalente de Nuget para Visual Studio. Los paquetes que instala son ficheros de Javascript; por lo que nos aporta la capacidad de añadir dependencias de Javascript en nuestros proyectos Web. Por defecto se instala con Visual Studio 2017; aunque podemos instalarlo manualmente al instalar Node.js.

Se describen los pasos para añadir a un proyecto Web existente:

  • 1.- Abrir el interprete de comandos (Command Prompt)
  • 2.- Ubicarse en el directorio del proyecto
  • 3.- Ejecutar npm init -y. Esto genera el fichero de depedencias package.json (El equivalente al packages.config de Nuget).
  • 4.- Incorporar el fichero de dependencias en nuestro proyecto Web.

Para descargar los paquetes de Javascript:

  • 1.- Abrir el interprete de comandos (Command Prompt)
  • 2.- Ubicarse en el directorio del proyecto
  • 3.- Ejecutar npm install paquete –save. El parametro –save añade la dependencia en el fichero de depedencias package.json.
  • 4.- En el directorio node_modules ha descargado el paquete y sus paquetes dependientes.

Comandos Utiles

  • npm install: Descarga todos los paquetes definidos en el package.json.
  • npm run task: En el package.json podemos definir una sección scripts con comandos a ejecutar. Por ejemplo npm run build:
      {
        "dependencies": {
             "cldr-data": "^31.0.2",
             "globalize": "^1.3.0",
             "webpack": "^3.4.1"
        },
        "scripts": {
             "test": "echo \"Error: no test specified\" && exit 1",
             "build": "webpack -p --color"
        }
      }
    
  • npm ls: Muestra las versiones de los paquetes actualmente decargados.
  • npm update: Descarga las ultimas versiones de los paquetes disponibles.
  • npm show [package]@* version: Muestra las versiones disponibles en el repositorio de npm para el paquete indicado. Por ejemplo: npm show bootstrap@* version.

Integración con Build in Visual Studio Team Services

Normalmente npm se utiliza con otros frameworks de ejecución de Tareas como Gulp, Bower, WebPack… Vamos a explicar el método más simple que disponemos npm para incorporar esta plataforma en los CI builds en Visual Studio Team Services sin usar estos frameworks.

  • 1.- Añadir tarea npm install para descargar los paquetes en el entorno build.
  • 2.- Añadir una tarea de copia para copiar la parte de los paquetes que nos interese en un directorio.
  • 3.- Subir el directorio a producción con una tarea de Azure App Service Deploy. Al deployar como Web Deploy desmarcamos el eliminar los ficheros en el destino. 😉

Librerías

Buscador de librerías de npm

Publicado en web | 1 Comentario

Azure Key Vault

Que es Azure Key Vault

Es un servicio de Azure donde podemos almacenar información sensible como claves, passwords, cadenas de conexión, certificados…

Existen dos tipos de claves:

  • Keys: Claves criptográficas con la clave publica y privada (JSON Web Key). Este tipo de claves nos permiten firmar, verificar, cifrar o descifrar datos.
  • Secrets: Datos sensibles como contraseñas o certificados.

Pasos para Usar en una Web App

Azure Key Vault nos permite almacenar la información sensible que normalmente existe en nuestros web.config de un modo más seguro.

  • 1.- Crear una aplicación.
  • 2.- Dar derechos a la aplicación creada para acceder al servicio de Azure.
  • 3.- Instalar el paquete de NuGet Microsoft.Azure.KeyVault en nuestra aplicación.
  • 4.- Añadir la siguiente clase en la aplicación.
        public class SecretService
        {
            public static async Task<string> GetToken(string authority, string resource, string scope)
            {
                var authContext = new AuthenticationContext(authority);
                ClientCredential clientCred = new ClientCredential(WebConfigurationManager.AppSettings["ApplicationId"],
                            WebConfigurationManager.AppSettings["ApplicationSecret"]);
                AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCred);
    
                if (result == null)
                    throw new InvalidOperationException("Failed to obtain the JWT token");
    
                return result.AccessToken;
            }
            public string GetSecret(String secretName)
            {
                var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetToken));
                var secretUri = WebConfigurationManager.AppSettings["SecretUri"] + secretName;
                var sec = kv.GetSecretAsync(secretUri).Result;
                return sec.Value;
            }
        }
    
  • 5.- Configurar en el Application Settings del Web App, las siguientes variables

    También se podrían añadir en web.config aunque es menos recomendable, ya que ofrece menor seguridad 😉

Publicado en Azure, Seguridad, web | Deja un comentario

Glosario de Docker

Docker nos proporciona un entorno de trabajo donde podemos ejecutar nuestras aplicaciones o realizar trabajos. Es decir, un sistema operativo más solamente los paquetes o servicios dependientes que requiera nuestro entorno de trabajo. También podemos incluso usarlo como un entorno de trabajo interactivo para evitar instalar nada en nuestro ordenador.

Componentes de Docker

Container Image

Es la maquina base sobre la que se ejecuta nuestra aplicación. Disponemos para NET principalmente tres tipos y para entornos de desarrollo (build) o producción (runtime):

  • Windows Nano Server para NET Core.
  • Linux (Debian o Alpine) para NET Core.
  • Estas maquinas se obtienen repositorios (Docker Hub, Azure Continer Registry…) donde mediante un tag obtenemos una Container Image en concreto.

    Container

    Es la instancia creada en base al Container Image. A esta instancia se puede asociar unos datos temporales (overlay file system). Ya que en las instancias no deben contener datos persistentes.

    DockerFile

    Fichero con instrucciones para aplicar en la Container Image al crear el Container. Indica tareas adicionales como abrir puertos, acabar de configurar servicios… El proceso de creación del Container se llama build. También hay la posibilidad del Container construido incorporarlo a un repositorio, como Docker Hub.

    docker-compose.yml

    Fichero con instrucciones que indica con que recursos y políticas se ejecutan los Containers. Indica datos como memoria, numero de instancias, reinicio ante caídas, relacionar containers….

    Docker Host

    Es el Servicio que se instala en el Servidor que contiene los Containers.

    • Linux Docker Host sólo soporta Container Images basadas en Linux.
    • Windows Docker Host sólo soporta Container Images basadas en Linux o Windows.

    Cluster

    Es una colección Docker Host; esto nos permite escalar horizontalmente nuestros Container para obtener mayor nivel de servicio. Su gestión se realiza mediante Orquestadores. Los Clusters más conocidos son:

    • Docker Swarm
    • Kubernetes
    • Mesosphere DC/OS
    • Azure Container Service que no tiene su propio Orquestador sino utiliza uno de los anteriores).
    • Azure Service Fabric
    Publicado en DevOps | Deja un comentario

    Build in Visual Studio Team Services

    Visual Studio Team Services nos permite crear un Build que es básicamente un proceso que define una serie de tareas para realizar continuos delevery (devops). Este Build se puede lanzar a demanda o también cuando se realiza un Checkin en el código (Continuos integration).

    Tareas


    Realizan acciones simples; en el siguiente en enlace se describen. Las más destacadas son:

    • Get Resources: Descarga el código fuente del repositorio.
    • NutGet Restore: Obtiene las dependencias de NutGet.
    • Build Solution: Compila el código. Si nuestra aplicación incorpora WebJobs hemos de añadir el parámetro /p:_DestinationType=AzureWebSite en el msbuild.
    • Test: Verifica los test unitarios definidos en el código.
    • Azure App Service Deploy: Copia el paquete de la aplicación a Azure.
    • Publish sysmbols path: Añade información adicional para poder debugar en remoto la aplicación.
    • Publish Artifact: Despliega el paquete de la aplicación.

    Services EndPoint

    Muchas tareas requieren de la conexión a servicios externos; en este enlace se definen los parámetros de conexión para los diferentes conectores. Estos Services Enpooints se definen para cada proyecto.
    Para el caso de un subscripción de Azure tal como describe el enlace, primero debemos ejecutar un script de PowerShell. Este script crea una aplicación con permisos que se usará en el EndPoint para acceder a la subscripción.

    Publicado en DevOps, Visual Studio | 1 Comentario