Ticout Outsourcing Center

Explotemos la Tecnología

Ticout Outsourcing Center - Explotemos la Tecnología

Primeros pasos con Vectorwise

1. Introducción

Actian Vectorwise, és una solución para el Big Data, donde el tiempo de respuesta es demasiado largo debido a grandes volumenes de datos. Vectorwise sin grandes inversiones, pretende ayudarle a solucionar este problema.

Vectorwise introduce una tecnología revolucionaria, rediseñando la arquitectura de la base de datos de forma que se acople perfectamente a las CPUs más modernas. Como resultado, Vectorwise puede ejecutar las consultas mucho más rápido que cualquier otra base de datos con el mismo hardware. Vectorwise, almacena la información por columnas en lugar de filas, de esta forma sólo cargará en memoria las columnas necesarias para ejecutar una consulta, además de forma automática comprime los datos. La ejecución en paralelo, nos asegura el máximo rendimiento en la ejecución de las consultas. Soporta los estándares de las bases de datos relacionales incluyendo ANSI SQL y conectividad mediante JDBC, ODBC y .Net.

 

2. Presentación del Esquema TPCH

El objetivo de este tutorial, es aprender los primeros pasos con Actian Vectorwise. Para esto usaremos el esquema de datos TPCH (http://www.tpc.org/tpch/). Es un esquema, usado por todos los fabricantes de bases de datos para realizar tests de rendimiento. El esquema simula la base de datos de una empresa de transportes a nivel internacional, tendremos facturas, clientes, proveedores.

El esquema consta de 8 tablas. A continuación presentamos el esquema y después describiremos cada una de las tablas que lo forman. Además mostramos el SQL necesario para crear las tablasa. Este SQL lo ponemos en un fichero plano para poder ejecutarlo desde la Shell de Vectorwise, aunque tiene su herramienta GUI, preferimos usar su interface de comandos de esta forma este tutorial puede ser seguido desde el sistema operativo Linux.

Esquema TPCH

Nota: En Vectorwise, el código SQL que se ejecuta desde un fichero plano, tiene que terminar con \p\g

2.1 Tabla Part

CREATE TABLE part (
p_partkey INTEGER not null ,
p_name VARCHAR(55) not null,
p_mfgr CHAR(25) not null,
p_brand CHAR(10) not null,
p_type VARCHAR(25) not null,
p_size INTEGER not null,
p_container CHAR(10) not null,
p_retailprice DECIMAL(18,2) not null,
p_comment VARCHAR(23) not null
, PRIMARY KEY (p_partkey)
; \p\g

Tabla Part

2.2 Tabla Supplier

CREATE TABLE supplier (
s_suppkey INTEGER not null ,
s_name CHAR(25) not null,
s_address VARCHAR(40) not null,
s_nationkey INTEGER not null,
s_phone CHAR(15) not null,
s_acctbal DECIMAL(18,2) not null,
s_comment VARCHAR(101) not null
, PRIMARY KEY (s_suppkey)
); \p\g

Tabla Supplier

2.3 Tabla PartSupp

CREATE TABLE partsupp (
ps_partkey INTEGER not null,
ps_suppkey INTEGER not null,
ps_availqty INTEGER not null,
ps_supplycost DECIMAL(18,2) not null,
ps_comment VARCHAR(199) not null
, PRIMARY KEY (ps_partkey, ps_suppkey)
, FOREIGN KEY (ps_partkey) REFERENCES  part , FOREIGN KEY (ps_suppkey) REFERENCES  supplier
); \p\g

Tabla PartSupp

2.4 Tabla Customer

CREATE TABLE customer (
c_custkey INTEGER not null,
c_name VARCHAR(25) not null,
c_address VARCHAR(40) not null,
c_nationkey INTEGER not null,
c_phone CHAR(15) not null,
c_acctbal DECIMAL(18,2) not null,
c_mktsegment CHAR(10) not null,
c_comment VARCHAR(117) not null
, PRIMARY KEY (c_custkey)
); \p\g

Tabla Customers

2.5 Tabla Orders

CREATE TABLE orders (
o_orderkey INTEGER not null,
o_custkey INTEGER not null,
o_orderstatus CHAR(1) not null,
o_totalprice DECIMAL(18,2) not null,
o_orderDATE DATE not null,
o_orderpriority CHAR(15) not null,
o_clerk CHAR(15) not null,
o_shippriority INTEGER not null,
o_comment VARCHAR(79) not null
, PRIMARY KEY (o_orderkey)
, FOREIGN KEY (o_custkey) references customer
); \p\g

Tabla Orders

2.6 Tabla LineItem

CREATE TABLE lineitem (
l_orderkey INTEGER not null,
l_partkey INTEGER not null,
l_suppkey INTEGER not null,
l_linenumber INTEGER not null,
l_quantity DECIMAL(18,2) not null,
l_extendedprice DECIMAL(18,2) not null,
l_discount DECIMAL(18,2) not null,
l_tax DECIMAL(18,2) not null,
l_returnflag CHAR(1) not null,
l_linestatus CHAR(1) not null,
l_shipDATE DATE not null,
l_commitDATE DATE not null,
l_receiptDATE DATE not null,
l_shipinstruct CHAR(25) not null,
l_shipmode CHAR(10) not null,
l_comment VARCHAR(44) not null
, PRIMARY KEY (l_orderkey, l_linenumber) , FOREIGN KEY (l_orderkey) references orders , FOREIGN KEY (l_partkey) REFERENCES part , FOREIGN KEY (l_suppkey) REFERENCES supplier
); \p\g

Tabla LineItem

2.7 Tabla Nation

CREATE TABLE nation (
n_nationkey INTEGER not null,
n_name CHAR(25) not null,
n_regionkey INTEGER not null,
n_comment VARCHAR(152) not null
, PRIMARY KEY (n_nationkey)
, FOREIGN KEY (n_regionkey) REFERENCES region
); \p\g

Tabla Nation

2.8 Tabla Region

CREATE TABLE region (
r_regionkey INTEGER not null,
r_name CHAR(25) not null,
r_comment VARCHAR(152) not null
, PRIMARY KEY (r_regionkey)
); \p\g

Tabla Region

3. Crear la Base de Datos

La base de datos, se puede administrar completamente desde su herramienta visual, aunque en este tutorial lo haremos todo desde la shell usando comandos. Accedemos a la Shell de Vectorwise, siendo un usuario con privilegios en la base de datos y ejecutamos el comando createdb nombrebd. Donde nombrebd es el nombre de la base de datos a crear.

createdb tpch10gb

Crear una base de datos en Vectorwise

Para crear las tablas, usaremos el sql que hemos visto anteriormente. La forma de ejecutar un script desde la Shell es sql nombredb < nombrefichero.sql Suponiendo que nuestra base de datos se llame tpch10gb y el script de texto scriptTablas.sql, la forma de ejecutarlo sería:

sql tpch10gb < scriptTablas.sql

4. Generar valores para las tablas

TPCH, no sólo nos proporciona un esquema, sino que el código fuente para generar un generador de valores para estas tablas. Nos descargamos de la web del TPCH el código fuente y lo compilamos. El generador, tiene diferentes opciones desde generar ficheros de un determinado volumen a generar sólo ficheros para una de las tablas. Como ejemplo generamos valores para una base de datos de 10gb

dbgen –vf –s 10

El resultado son 8 ficheros, por nombre tendrán el nombre de la tabla con extensión tbl.

5. Carga de los datos

Al igual que en la mayoría de bases de datos, Vectorwise incluye su propio cargador. Tiene dos formas diferentes de cargar los datos, mediante script (herencia de la base de datos Ingres) o con la herramienta vwload.

5.1 Carga con Script Copy

Para usar el script de carga, tenemos la instrucción copy, su forma de trabajar es indicar para cada campo su separador y el separador de registro e indicar el nombre del fichero a cargar con su ruta. Vamos a mostrar un ejemplo:

COPY supplier(
s_suppkey = 'c0|',
s_name  = 'c0|',
s_address  = 'c0|',
s_nationkey = 'c0|',
s_phone = 'c0|',
s_acctbal = 'c0|',
s_comment = 'c0nl')
FROM 'C:/tpch/datos/supplier.tbl'
\p\g

En este script deseamos cargar la tabla Supplier, en nuestro fichero de datos, cada campo está separado por el carácter ‘|’ y el separador de registro ‘nl’, la ruta del fichero de donde cargar es c:/tpch/datos/supplier.tbl

Si deseamos cargar todas las tablas con este método, tenemos que crear en un mismo fichero un script como el anterior, pero para cada una de las tablas que deseamos cargar. En este ejemplo se entenderá mejor:

COPY region(
r_regionkey = 'c0|',
r_name = 'c0|',
r_comment = 'c0nl')
FROM 'C:/tpch/sqlServer1gb/region.tbl' \p\g

COPY nation(
n_nationkey = 'c0|',
n_name = 'c0|',
n_regionkey = 'c0|',
n_comment = 'c0nl')
FROM 'C:/tpch/sqlServer1gb/nation.tbl' \p\g

Una vez tenemos el script de carga preparado, entramos a la shell de Vectorwise y lo ejecutamos con la ayuda del comando sql nombredb < ficheroScript: (http://docs.actian.com/ingres/10.0/database-administrator-guide/1939-copy-into-unload-data-and-copy-from-reload-data)

sql tpch10gb < load.sql

5.2 El comando vwload

Uno de los problemas de usar el anterior método de carga, es tener que crear un script indicando cada una de las columnas, por lo que puede ser engorroso. Vectorwise incluye un cargador nuevo, llamado vwload, este se ejecuta desde la Shell de Vectorwise. Los parámetros más importantes son: (http://docs.actian.com/ingres-vectorwise/2.0/user-guide/1846-vwload-commandload-data-into-a-vectorwise-table)

  • -t: nombre tabla
  • -f: separador campo
  • x n: número máximo de errores permitidos
  • -l nombrefile.log: nombre del fichero de log

vwload –f ‘|’ -t nation –x 50 –l nation.log tpch10gb

6. Optimizar la base de datos

Una de las tareas que siempre tenemos que hacer al terminar de cargar una base de datos en Vectorwise o después de que esta, haya sido modificada intensivamente (updates, deletes, cargas incrementales) es optimizarla. Desde la Shell de Vectorwise vamos a ejecutar la instrucción: optimizedb –zfq nombrebd

optimizedb –zfq tpch10gb

7. Consultas SQL de TPCH

TPCH propone una serie de 21 consultas, usadas por los distintos fabricantes de bases de datos para verificar sus resultados. Estas consultas para Vectorwise son:

Q1. Resumen de precios

SELECT l_returnflag, l_linestatus, sum(l_quantity) as sum_qty,
sum(l_extendedprice) as sum_base_price,
sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
avg(l_quantity) as avg_qty, avg(l_extendedprice) as avg_price,
avg(l_discount) as avg_disc, count(*) as count_order
FROM lineitem
WHERE l_shipdate &lt;= date '1998-12-01' - interval '90' day
GROUP BY l_returnflag, l_linestatus
ORDER BY l_returnflag, l_linestatus;

Q2. Coste mínimo de proveedores

SELECT TOP 100
s_acctbal, s_name, n_name, p_partkey, p_mfgr,s_address, s_phone, s_comment
FROM part, supplier, partsupp, nation, region
WHERE p_partkey = ps_partkey AND s_suppkey = ps_suppkey
AND p_size = 15 AND p_type like '%BRASS'
AND s_nationkey = n_nationkey AND n_regionkey = r_regionkey
AND r_name = 'EUROPE' AND ps_supplycost = (
SELECT MIN(ps_supplycost)
FROM partsupp, supplier, nation, region
WHERE p_partkey = ps_partkey AND s_suppkey = ps_suppkey
AND s_nationkey = n_nationkey AND n_regionkey = r_regionkey
AND r_name = 'EUROPE'
)
ORDER BY s_acctbal DESC, n_name, s_name, p_partkey;

Q3. Prioridad de Envío

SELECT TOP 10
l_orderkey, sum(l_extendedprice * (1 - l_discount)) as revenue,
o_orderdate, o_shippriority
FROM customer, orders, lineitem
WHERE c_mktsegment = 'BUILDING' AND c_custkey = o_custkey
AND l_orderkey = o_orderkey AND o_orderdate &lt; '1995-03-15'
AND l_shipdate &gt; '1995-03-15'
GROUP BY l_orderkey, o_orderdate, o_shippriority
ORDER BY revenue DESC, o_orderdate;

Q4. Orden de Prioridad verificada

SELECT o_orderpriority, count(*) as order_count
FROM orders
WHERE o_orderdate &gt;= date '1993-07-01'
AND o_orderdate &lt; date '1993-07-01' + interval '3' month
AND EXISTS (
SELECT *
FROM lineitem
WHERE l_orderkey = o_orderkey AND l_commitdate &lt; l_receiptdate
)
GROUP BY o_orderpriority
ORDER BY o_orderpriority;

Q5. Cambio en las previsiones de ingresos

SELECT sum(l_extendedprice * l_discount) as revenue
FROM lineitem
WHERE l_shipdate &gt;= date '1994-01-01'
AND l_shipdate &lt; date '1994-01-01' + interval '1' year
AND l_discount between .06 - 0.01 and .06 + 0.01
AND l_quantity &lt; 24;

Q6. Volumen de envío

SELECT supp_nation, cust_nation, l_year, sum(volume) as revenue
FROM
(
SELECT n1.n_name as supp_nation, n2.n_name as cust_nation,
extract(year from l_shipdate) as l_year,
l_extendedprice * (1 - l_discount) as volume
FROM supplier, lineitem, orders, customer, nation n1, nation n2
WHERE s_suppkey = l_suppkey AND o_orderkey = l_orderkey
AND c_custkey = o_custkey AND s_nationkey = n1.n_nationkey
AND c_nationkey = n2.n_nationkey AND (
(n1.n_name = 'FRANCE' and n2.n_name = 'GERMANY')
Or (n1.n_name = 'GERMANY' and n2.n_name = 'FRANCE')
)
AND l_shipdate BETWEEN date '1995-01-01' AND date '1996-12-31'
) as shipping
GROUP BY supp_nation, cust_nation, l_year
ORDER BY supp_nation, cust_nation, l_year;

Q7. Mercado nacional

SELECT o_year,
sum(case
when nation = 'BRAZIL' then volume
else 0
end) / sum(volume) as mkt_share
FROM (
SELECT extract(year from o_orderdate) as o_year,
l_extendedprice * (1 - l_discount) as volume,
n2.n_name as nation
FROM part, supplier, lineitem, orders, customer,
nation n1, nation n2, region
WHERE p_partkey = l_partkey AND s_suppkey = l_suppkey
AND l_orderkey = o_orderkey AND o_custkey = c_custkey
AND c_nationkey = n1.n_nationkey AND n1.n_regionkey = r_regionkey
AND r_name = 'AMERICA' AND s_nationkey = n2.n_nationkey
AND o_orderdate between date '1995-01-01' and date '1996-12-31'
AND p_type = 'ECONOMY ANODIZED STEEL'
) as all_nations
GROUP BY o_year
  ORDER BY o_year;

Q8. Beneficio por el tipo de producto

SELECT nation, o_year, sum(amount) as sum_profit
FROM
(
SELECT n_name as nation, extract(year from o_orderdate) as o_year,
l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount
FROM part, supplier, lineitem, partsupp, orders, nation
WHERE s_suppkey = l_suppkey AND ps_suppkey = l_suppkey
AND ps_partkey = l_partkey AND p_partkey = l_partkey
AND o_orderkey = l_orderkey AND s_nationkey = n_nationkey
AND p_name like '%green%'
) as profit
GROUP BY nation, o_year
ORDER BY nation, o_year desc;

Q9. Artículos devueltos

SELECT top 20 c_custkey, c_name, sum(l_extendedprice * (1 - l_discount)) as revenue,
c_acctbal, n_name, c_address, c_phone, c_comment
FROM customer, orders, lineitem, nation
WHERE c_custkey = o_custkey AND l_orderkey = o_orderkey
AND o_orderdate &gt;= date '1993-10-01'
AND o_orderdate &lt; date '1993-10-01' + interval '3' month
AND l_returnflag = 'R' AND c_nationkey = n_nationkey
GROUP BY c_custkey, c_name, c_acctbal, c_phone, n_name, c_address, c_comment
ORDER BY revenue desc;

Q10. Identificación de stock

SELECT ps_partkey, sum(ps_supplycost * ps_availqty) as value
FROM partsupp, supplier, nation
WHERE ps_suppkey = s_suppkey AND s_nationkey = n_nationkey
AND n_name = 'GERMANY'
GROUP BY ps_partkey
HAVING sum(ps_supplycost * ps_availqty) &gt; (
SELECT sum(ps_supplycost * ps_availqty) * 0.0001000000
FROM partsupp, supplier, nation
WHERE ps_suppkey = s_suppkey AND s_nationkey = n_nationkey
AND n_name = 'GERMANY'
)
ORDER BY value desc;

Q11. Consulta de modos de envío y de prioridad

SELECT l_shipmode,
sum(case
when o_orderpriority = '1-URGENT'
or o_orderpriority = '2-HIGH'
then 1
else 0
end) as high_line_count,
sum(case
when o_orderpriority &lt;&gt; '1-URGENT'
and o_orderpriority &lt;&gt; '2-HIGH'
then 1
else 0
end) as low_line_count
FROM orders, lineitem
WHERE o_orderkey = l_orderkey AND l_shipmode in ('MAIL', 'SHIP')
AND l_commitdate &lt; l_receiptdate AND l_shipdate &lt; l_commitdate
AND l_receiptdate &gt;= date '1994-01-01'
AND l_receiptdate &lt; date '1994-01-01' + interval '1' year
GROUP BY l_shipmode
ORDER BY l_shipmode;

Q12. Distribución de clientes

SELECT c_count, count(*) as custdist
FROM (
SELECT c_custkey, count(o_orderkey) as c_count
FROM customer left outer join orders on
c_custkey = o_custkey
AND o_comment not like '%special%requests%'
GROUP BY c_custkey
) as c_orders
GROUP BY c_count
ORDER BY custdist desc, c_count desc;

Q13. Efecto de las promociones

SELECT 100.00 * sum(case
when p_type like 'PROMO%'
then l_extendedprice * (1 - l_discount)
else 0
end) / sum(l_extendedprice * (1 - l_discount)) as promo_revenue
FROM lineitem, part
WHERE l_partkey = p_partkey AND l_shipdate &gt;= date '1995-09-01'
AND l_shipdate &lt; date '1995-09-01' + interval '1' month;

Q14. Proveedor Top

CREATE VIEW revenue0 (supplier_no, total_revenue) as
SELECT l_suppkey, sum(l_extendedprice * (1 - l_discount))
FROM lineitem
WHERE l_shipdate &gt;= date '1996-01-01'
AND l_shipdate &lt; date '1996-01-01' + interval '3' month
GROUP BY l_suppkey;

SELECT s_suppkey, s_name, s_address, s_phone, total_revenue
FROM supplier, revenue0
WHERE s_suppkey = supplier_no AND total_revenue = (
SELECT max(total_revenue)
FROM revenue0
)
ORDER BY s_suppkey;

  DROP VIEW revenue0;

Q15. Relación Partes/Proveedor

SELECT p_brand, p_type, p_size, count(distinct ps_suppkey) as supplier_cnt
FROM partsupp, part
WHERE p_partkey = ps_partkey
AND p_brand &lt;&gt; 'Brand#45'
AND p_type not like 'MEDIUM POLISHED%'
AND p_size in (49, 14, 23, 45, 19, 3, 36, 9)
AND ps_suppkey not in (
SELECT s_suppkey
FROM supplier
WHERE s_comment like '%Customer%Complaints%'
)
GROUP BY p_brand, p_type, p_size
ORDER BY supplier_cnt desc, p_brand, p_type, p_size;

Q16. Orden de rentas de pequeñas cantidades

SELECT sum(l_extendedprice) / 7.0 as avg_yearly
FROM lineitem, part
WHERE p_partkey = l_partkey AND p_brand = 'Brand#23'
AND p_container = 'MED BOX' AND l_quantity &lt; (
SELECT 0.2 * avg(l_quantity)
FROM lineitem
WHERE l_partkey = p_partkey);

Q17. Clientes con grandes volúmenes

SELECT TOP 20
c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice, sum(l_quantity)
FROM customer, orders, lineitem
WHERE o_orderkey IN (
SELECT l_orderkey
FROM lineitem
GROUP BY l_orderkey
HAVING sum(l_quantity) &gt; 300
)
AND c_custkey = o_custkey
AND o_orderkey = l_orderkey
GROUP BY c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice
ORDER BY o_totalprice desc, o_orderdate;

Q18. Descuentos en la facturación

SELECT sum(l_extendedprice* (1 - l_discount)) as revenue
FROM lineitem, part
WHERE
(
p_partkey = l_partkey AND p_brand = 'Brand#12'
AND p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
AND l_quantity &gt;= 1 AND l_quantity &lt;= 1 + 10
AND p_size BETWEEN 1 AND 5
AND l_shipmode IN ('AIR', 'AIR REG')
AND l_shipinstruct = 'DELIVER IN PERSON'
)
OR
(
p_partkey = l_partkey AND p_brand = 'Brand#23'
AND p_container IN ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
AND l_quantity &gt;= 10 AND l_quantity &lt;= 10 + 10
AND p_size BETWEEN 1 AND 10
AND l_shipmode IN ('AIR', 'AIR REG')
AND l_shipinstruct = 'DELIVER IN PERSON'
)
OR
(
p_partkey = l_partkey AND p_brand = 'Brand#34'
AND p_container IN ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
AND l_quantity &gt;= 20 AND l_quantity &lt;= 20 + 10
AND p_size BETWEEN 1 AND 15
AND l_shipmode IN ('AIR', 'AIR REG')
AND l_shipinstruct = 'DELIVER IN PERSON');

Q19. Potencial de la promoción

SELECT s_name, s_address
FROM supplier, nation
WHERE s_suppkey IN (
SELECT ps_suppkey
FROM partsupp
WHERE ps_partkey IN (
SELECT p_partkey
FROM part
WHERE p_name like 'forest%'
)
AND ps_availqty &gt; (
SELECT 0.5 * sum(l_quantity)
FROM lineitem
WHERE l_partkey = ps_partkey
AND l_suppkey = ps_suppkey
AND l_shipdate &gt;= date '1994-01-01'
AND l_shipdate &lt; date '1994-01-01' + interval '1' year
)
)
AND s_nationkey = n_nationkey AND n_name = 'CANADA'
ORDER BY s_name;

Q20. Proveedores que tienen órdenes en espera

SELECT TOP 20
s_name, count(*) as numwait
FROM supplier, lineitem l1, orders, nation
WHERE s_suppkey = l1.l_suppkey AND o_orderkey = l1.l_orderkey
AND o_orderstatus = 'F' AND l1.l_receiptdate &gt; l1.l_commitdate
AND EXISTS (
SELECT *
FROM lineitem l2
WHERE l2.l_orderkey = l1.l_orderkey
AND l2.l_suppkey &lt;&gt; l1.l_suppkey
)
AND NOT EXISTS (
SELECT *
FROM lineitem l3
WHERE l3.l_orderkey = l1.l_orderkey
AND l3.l_suppkey &lt;&gt; l1.l_suppkey
AND l3.l_receiptdate &gt; l3.l_commitdate
)
AND s_nationkey = n_nationkey AND n_name = 'SAUDI ARABIA'
GROUP BY s_name
ORDER BY numwait desc, s_name;

Q21. Oportunidad de ventas globales


SELECT cntrycode, count(*) as numcust, sum(c_acctbal) as totacctbal
FROM (
SELECT substring(c_phone, 1, 2) as cntrycode, c_acctbal
FROM customer
WHERE substring(c_phone, 1, 2) IN ('13', '31', '23', '29', '30', '18', '17')
AND c_acctbal &gt; (
SELECT avg(c_acctbal)
FROM customer
WHERE c_acctbal &gt; 0.00
AND substring(c_phone, 1, 2) IN ('13', '31', '23', '29', '30', '18', '17')
)
AND NOT EXISTS (
SELECT *
FROM orders
WHERE o_custkey = c_custkey
)
) as custsale
GROUP BY cntrycode
ORDER BY cntrycode;

8. Conclusiones

En este pequeño tutorial, hemos introducido la base de datos analítica Vectorwise. Hemos aprendido a crear bases de datos, crear las tablas y cargar los datos de dos formas diferentes. Además hemos presentado el esquema TPCH, que nos sirve para hacer comparativas de rendimiento con otras bases de datos de otros fabricantes. Los resultados que saque, comparándolos con otros sistemas de bases de datos seguro que le sorprenden y además en Vectorwise no necesita crear índices.