Индексы, ограничения и язык запросов в PostgreSQL, страница 3

 Total runtime: 0.297 ms

(3 rows)

Мы видим, что с типом индекса BTREE, индекс использовался в двух случаях, при операциях = и between. И при этом наблюдалось уменьшение времени выполнения запроса, приблизительно на 25%.

Индекс типа HASH, использовался всего лишь в одном случае, при операции =. И при этом наблюдалось уменьшение времени выполнения запроса, приблизительно на 70%.

·  Без функционального индекса по полю типа char

shop=# EXPLAIN ANALYSE select * from products where upper(name)='679487264715 61403';

                                             QUERY PLAN

-----------------------------------------------------------------------------

--------------------

 Seq Scan on products  (cost=0.00..26.59 rows=5 width=37) (actual time=1.903..1.911 rows=1 loops=1)

   Filter: (upper((name)::text) = '679487264715 61403'::text)

 Total runtime: 1.934 ms

(3 rows)

shop=# EXPLAIN ANALYSE select * from products where upper(name)!='679487264715 61403';

                                                QUERY PLAN

-----------------------------------------------------------------------------

--------------------------

 Seq Scan on products  (cost=0.00..26.59 rows=1000 width=37) (actual time=0.019..2.177 rows=1004 loops=1)

   Filter: (upper((name)::text) <> '679487264715 61403'::text)

 Total runtime: 2.440 ms

(3 rows)

·  С функциональным индексом по полю типа char

shop=# EXPLAIN ANALYSE select * from products where upper(name)='679487264715 61403';

                                                     QUERY PLAN

-----------------------------------------------------------------------------

------------------------------------

 Index Scan using ind_prod on products  (cost=0.00..8.27 rows=1 width=37) (actual time=0.088..0.089 rows=1 loops=1)

   Index Cond: (upper((name)::text) = '679487264715 61403'::text)

 Total runtime: 0.126 ms

(3 rows)

shop=# EXPLAIN ANALYSE select * from products where upper(name)!='679487264715 61403';

                                                QUERY PLAN

-----------------------------------------------------------------------------

--------------------------

 Seq Scan on products  (cost=0.00..26.59 rows=1004 width=37) (actual time=0.020..2.163 rows=1004 loops=1)

   Filter: (upper((name)::text) <> '679487264715 61403'::text)

 Total runtime: 2.442 ms

(3 rows)

При использовании индекса наблюдалось уменьшение времени выполнения запроса, приблизительно в 10 раз.

·  Наложить ограничения согласно своему варианту. Ограничить поля «цена» и «стоимость» так, чтобы они не содержали значений ниже 10 р. и выше 1500р. Проверить работоспособность ограничений путем добавления в таблицы данных, удовлетворяющих и не удовлетворяющих условиям ограничений.

shop=# ALTER TABLE products ADD CONSTRAINT mega_pr_lower CHECK (priceprod>=10);

ERROR:  check constraint "mega_pr_lower" is violated by some row

shop=# delete from products where priceprod<=10;

DELETE 115

shop=# delete from products where id>5;

DELETE 886

shop=# select * from products;

 id |         name         | kolvo | priceprod | idmaster

----+----------------------+-------+-----------+----------

  1 | Bread                |   500 |      25.5 |        1

  2 | Boots                |   100 |      1000 |        2

  3 | Nektar               |    50 |       100 |        3

  4 | Cake                 |    25 |       400 |        4

  5 | Ice-Cream            |   500 |        40 |        4

(5 rows)

shop=# ALTER TABLE products ADD CONSTRAINT mega_pr_lower CHECK (priceprod>=10);

ALTER TABLE

shop=# ALTER TABLE products ADD CONSTRAINT mega_pr_up CHECK (priceprod<1500);

ALTER TABLE