SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler offline
Расширенный SQL в
MySQL и PostgreSQL.
Сравнение
возможностей.
         Даниил Каменский
         sakila@sqlinfo.ru
План доклада

 Расширения SQL
 
     пользовательские переменные
 
     оконные функции
 
     рекурсивные запросы
 
     расширения для работы с таблицами




                                         2
План доклада

 Особенности и отличия базовых функций
  в MySQL и PostgreSQL
 
     типы таблиц, особенности физического
     размещения
 
     работа с индексами
 
     оптимизация подзапросов
 
     дополнительно

                                            3
Польз. переменные MySQL
 
     Поддерживаются с версии 3.23.6
 
     Возможность присваивать значения и
     использовать далее в рамках сессии
 SELECT @min_price:=MIN(`price`) FROM
  `shop`;
 SELECT * FROM `shop` WHERE
  `price`=@min_price;


                                          4
Пример №1: Пики загрузки

 
     Поиск максимального различия между
     смежными значениями




                                          5
Структура таблицы




                    6
Без явной сортировки

 ALTER table `t` ORDER BY `t` ASC;
 SET @data=NULL,@max=0;
 SELECT
  @max:=if(v-@data>@max,v-data,@max),
  @data:=v
 FROM `t`;
 SELECT @max;
                                        7
Сортировка индексом

 CREATE INDEX t_v ON t(t, v);
 SET @data=NULL,@max=0;
 SELECT
  @max:=if(v-@data>@max,v-data,@max),
  @data:=v
 FROM `t` FORCE INDEX (t_v);
 SELECT @max;
                                        8
Сортировка в запросе

 SET @data=NULL,@max=0;
 SELECT
  @max:=if(v-@data>@max,v-data,@max),
  @data:=v
 FROM (SELECT * FROM `t` ORDER BY t);
 SELECT @max;


                                        9
Аналог в модели РБД

 SELECT MAX(
 t1.v - (
            SELECT v FROM t t2
            WHERE t2.t < t1.t
            ORDER BY t2.t DESC LIMIT 1)
 ) FROM t t1;


                                          10
Пример №2

 Оценка загрузки каналов связи за
  определенные временные промежутки




                                      11
Реализация через ПП

 select @c:=0;
 select t, v from (
   select t,
    if (t % 5, @c := @c+v, @c := v) as v,
    if( (t + 1) % 5,1,0) as mark from t) tt
 where mark = 0;
 select sum(v) from t group by (t-(second(t)%5));
                                               12
Детализация запроса




                      13
Длительности выполнения




                          14
Пример №3

Поиск n элементов группы по критерию.
 CREATE TABLE salary
(
   dep_id int, --идентификатор отдела
   emp_id int, --идентификатор работника
   sal int -- зарплата
);

                                           15
Запрос через ПП

 set @n=2, @i=0, @p=0;
 SELECT * FROM
  (SELECT * FROM `salary` ORDER BY
  dep_id ASC, sal DESC) t
 WHERE if (@p=dep_id, @i:=@i+1,(@i:=0) or
  (@p:=dep_id))
 AND @i<@n;

                                        16
Аналог в РБД

 SELECT t1.* FROM salary t1 HAVING (
 (SELECT count(*) FROM `salary` t2
 WHERE t2.dep_id=t1.dep_id AND
  t2.sal>t1.sal) <2
 ) ORDER BY dep_id, sal DESC;




                                       17
SWAP колонок, rownum

 UPDATE t SET field1=field2, field2=field1
 Неправильный результат!
 set @tmp='';
 UPDATE t SET field1=(@tmp:=field1),
  field1=field2, field2=@tmp;


 SET @n:=0;
 SELECT @n:=@n+1 AS rownum, t.* FROM t;
                                             18
Оконные функции
PostgreSQL


  Выполнение вычисления над списком
  строк в таблице, которые так или иначе
  относятся к текущей строке


  Вычисление агрегатного значения без
  использования GROUP BY

                                           19
Примеры функций


lag() – предыдущее значение в разбиении


row_number() – номер строки в разбиении


first_value() – первое значение в разбиении


                                         20
Оконные функции

SELECT dep_id, emp_id, sal,
  100
  * sal::float
  / (sum(sal) OVER (PARTITION BY dep_id))
FROM salary
WHERE dep_id = 1;


                                       21
Макс. перепад через ПП

 В postgresql.conf
 custom_variable_classes = 'lv'


 select set_config ('lv.data', ‘0', true);
 select set_config ('lv.max_value', '0', true);
 select current_setting('lv.data')::integer


                                                  22
Макс. перепад через ОФ

 SELECT max(v) FROM
 (SELECT
 p.v - lag(t.v) OVER (ORDER BY t)
 as v FROM t
 ) tt;



                                    23
Макс. перепад через функцию

 create function public.temp_func() returns int as $$
 DECLARE prev integer; curr integer; max_ integer;
 BEGIN max_ := 0; prev := 0;
 FOR curr IN SELECT v FROM pp LOOP
 if (curr - prev > max_) then max_ := curr - prev;
     end if;
 prev := curr; END LOOP;
 return max_;
 END $$ language plpgsql;
                                                     24
Скорости выполнения
запросов в PostgreSQL
 Таблица на 10,000,000 записей
 Оконные функции: 2,5 cек
 Пользовательские переменные: 13 сек
 Функция на plpgsql: 2 сек
 Запрос с подзапросами: 20 сек



                                       25
Элементы групп через ОФ

 SELECT dep_id, emp_id, sal FROM (
  SELECT
    row_number() OVER (partition BY dep_id
  ORDER BY sal desc ) num,
   dep_id, emp_id, sal
  FROM
   salary ) t
 WHERE num < 3;

                                             26
Рекурсивные запросы


 with [recursive] <имя_алиаса_запроса>
 [ (<список столбцов>) ]
 as (<запрос>)
 <основной запрос>



                                         27
Дерево, структура




                    28
Обход дерева в ширину

 WITH RECURSIVE recursetree(val, id, level, pathstr) AS (
      SELECT val, id, 0, cast('' as text) FROM tree WHERE
      parent_id = 0
  UNION ALL
      SELECT t.val, t.id, rt.level + 1, rt.pathstr || '=>' || t.val::text
      FROM tree t JOIN recursetree rt ON rt.id = t.parent_id
  )
 SELECT space(level) || val, id, level, pathstr
 FROM recursetree ORDER BY level, id;

                                                                        29
Вывод рекурсивного запроса




                             30
Intersect

 SELECT t1.val FROM set_operations_1 t1
  INTERSECT SELECT t2.val FROM
  set_operations_2 t2;
 SELECT val FROM set_operations_1
  WHERE val IN (SELECT val FROM
  set_operations_2);
 SELECT t1.val FROM set_operations_1 t1
  JOIN set_operations_2 t2 using(val);


                                          31
Except

 SELECT t1.val FROM set_operations_1 t1
  EXCEPT SELECT t2.val FROM
  set_operations_2 t2;
 SELECT val FROM set_operations_1 WHERE
  val NOT IN (SELECT val FROM
  set_operations_2);
 SELECT t1.val FROM set_operations_1 t1
  LEFT JOIN set_operations_2 t2 USING (val)
  WHERE t2.val IS NULL
                                          32
33
Работа с таблицами

 ON DUPLICATE KEY
 insert into param(param, val)
   values(‘project_version’,100) on duplicate
   key update val=‘100';
 REPLACE INTO
 replace into param(param, val)
 values(‘project_version’, ‘100’);

                                                34
Работа с таблицами

 INSERT IGNORE
 insert ignore into param(param, val)
   values(‘project_version’,100)
 insert into param(param, val)
 select 'project_version', ‘100' where 1 not in
   (select 1 from param where param =
   'project_version');

                                                  35
Реализация upsert в PG
 CREATE OR REPLACE FUNCTION upsert(id_ integer, val_ integer) RETURNS
   void AS
 $$
 BEGIN
      LOOP
       UPDATE t SET val = val_ WHERE id = id_
       IF found THEN RETURN; END IF;
       BEGIN
         INSERT INTO t(id, val) VALUES (id_, val_); RETURN;
       EXCEPTION WHEN unique_violation THEN
       END;
      END LOOP;
 END; $$ LANGUAGE 'plpgsql';
                                                                   36
Создание правила

 CREATE RULE "t_on_duplicate_ignore" AS
  ON INSERT TO "t"
 WHERE
  EXISTS(SELECT 1 FROM y WHERE
  pk_col = NEW.pk_col_1)
 DO INSTEAD
  NOTHING;

                                          37
Типы таблиц в MySQL

 InnoDB
 MyISAM
 Memory
 Merge
 Archive
 Blackhole


                      38
Типы таблиц в MySQL


 tmp_table_size


 max_heap_table_size


 innodb_table_per_file


                         39
Индексы

Основные типы
Btree
Hash
MySQL – только memory-таблицы
PostgreSQL – hash не рекомендуется



                                     40
Индексные алгоритмы

MySQL: Невозможность использовать составные
 индексы при нестрогом равенстве в начале
SELECT * FROM t WHERE a<3 AND b<5;
Директива USE/IGNORE/FORCE INDEX
PostgreSQL: Невозможность указать индекс
  явно.
Возможность регуляции через
set enable_***scan=1 и set enable_***scan=0

                                              41
Алгоритмы JOIN

MySQL:
nested loop
PostgreSQL:
nested loop join
merge join
hash join


                   42
Функц. и сост. индексы

 CREATE INDEX i ON billing(is_payed)
  WHERE is_payed = false;
 CREATE INDEX i ON users (
 substr(email, strrevpos(email , '.') + 1 )
 );
 CREATE INDEX i ON y(f1 ASC, f2 DESC);


                                              43
MySQL - подзапросы

 SELECT * FROM users WHERE id IN
 (SELECT poster_id FROM posts WHERE
   poster_ip LIKE ‘212.194.55.%’);


 SELECT * FROM users u JOIN posts p ON
  u.id=p.poster_id WHERE p.poster_ip LIKE
  ‘212.194.55.% ’;

                                        44
Анонимные блоки кода

 MySQL:
 CREATE/DROP IF EXISTS/IF NOT EXISTS
 PostgreSQL:
 DO $$ begin
 if exists (select 1 from pg_tables where tablename =
    ‘t') then
 drop table t;end if;
 end $$;

                                                   45
Дополнение
MySQL:
Фальшивые Foreign Keys у таблиц MyISAM
Фальшивые hash-индексы у таблиц не memory
При @@sql_mode <> ‘ANSI’ возможность делать ошибки
  – например
SELECT avg(a), b FROM t;
PostgreSQL:
Отсутствие возможности менять колонки местами 
Генерация исключений в хранимых процедурах



                                                 46
Спасибо за внимание!




                       47
Планы исполнения
запросов
А.
     Запрос с ПП
     Синтаксический анализ запроса
     Создание плана исполнения
     Определение хранилища базы (engine)
     Цикл foreach {
       Обращение к engine
     }
     Б.
     Цикл внутри ХП {
       Синтаксический анализ запроса (курсор)
       Определение хранилища базы (engine)
       Обращение к engine
       Переход к следующему шагу цикла (интерпретатор
     языка SQL)
     }

                                                        48

Mais conteúdo relacionado

Mais procurados

Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Метапрограммирование за гранью приличия
Метапрограммирование за гранью приличияМетапрограммирование за гранью приличия
Метапрограммирование за гранью приличияAlexander Schepanovski
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Ontico
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовtvaleev
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности PythonPyNSK
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Dima Dzuba
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт GuavaEgor Chernyshev
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonPython Meetup
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuningcollabock
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?PyNSK
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6Dmitry Soshnikov
 

Mais procurados (20)

Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Метапрограммирование за гранью приличия
Метапрограммирование за гранью приличияМетапрограммирование за гранью приличия
Метапрограммирование за гранью приличия
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
 
Clojure #1
Clojure #1Clojure #1
Clojure #1
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuning
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 

Destaque

«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев «Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев DevDay
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homeworkchlo464
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homeworkchlo464
 
«Лайфхаки ручного тестирования на мобилках» — Юлия Горлова, 2ГИС
«Лайфхаки ручного тестирования на мобилках» — Юлия Горлова, 2ГИС«Лайфхаки ручного тестирования на мобилках» — Юлия Горлова, 2ГИС
«Лайфхаки ручного тестирования на мобилках» — Юлия Горлова, 2ГИСDevDay
 
Роль аналитика в гибких методологиях разработки
Роль аналитика в гибких методологиях разработкиРоль аналитика в гибких методологиях разработки
Роль аналитика в гибких методологиях разработкиDevDay
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homeworkchlo464
 
Фламп на спидах или ка релизить каждый день
Фламп на спидах или ка релизить каждый деньФламп на спидах или ка релизить каждый день
Фламп на спидах или ка релизить каждый деньDevDay
 
Артём Кудзев «Делайте на работе то, что мотивирует»
Артём Кудзев «Делайте на работе то, что мотивирует»Артём Кудзев «Делайте на работе то, что мотивирует»
Артём Кудзев «Делайте на работе то, что мотивирует»DevDay
 
Релизы? Регулярно по пятницам
 Релизы? Регулярно по пятницам Релизы? Регулярно по пятницам
Релизы? Регулярно по пятницамDevDay
 
Веб 3.0. Футуристический рассказ о будущем интернета и IT
Веб 3.0. Футуристический рассказ о будущем интернета и ITВеб 3.0. Футуристический рассказ о будущем интернета и IT
Веб 3.0. Футуристический рассказ о будущем интернета и ITDevDay
 
Фича готова. Что дальше?
Фича готова. Что дальше?Фича готова. Что дальше?
Фича готова. Что дальше?DevDay
 
Разработка мобильных приложений на HTML5
Разработка мобильных приложений на HTML5Разработка мобильных приложений на HTML5
Разработка мобильных приложений на HTML5DevDay
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...DevDay
 
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС  «Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС DevDay
 
«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных«Велогосипед», Данил Ильиных
«Велогосипед», Данил ИльиныхDevDay
 
Межнодовое взаимодействие. Тонкости работы с Mnesia в кластере.
Межнодовое взаимодействие. Тонкости работы с Mnesia в кластере.Межнодовое взаимодействие. Тонкости работы с Mnesia в кластере.
Межнодовое взаимодействие. Тонкости работы с Mnesia в кластере.DevDay
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homeworkchlo464
 
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»DevDay
 

Destaque (18)

«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев «Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homework
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homework
 
«Лайфхаки ручного тестирования на мобилках» — Юлия Горлова, 2ГИС
«Лайфхаки ручного тестирования на мобилках» — Юлия Горлова, 2ГИС«Лайфхаки ручного тестирования на мобилках» — Юлия Горлова, 2ГИС
«Лайфхаки ручного тестирования на мобилках» — Юлия Горлова, 2ГИС
 
Роль аналитика в гибких методологиях разработки
Роль аналитика в гибких методологиях разработкиРоль аналитика в гибких методологиях разработки
Роль аналитика в гибких методологиях разработки
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homework
 
Фламп на спидах или ка релизить каждый день
Фламп на спидах или ка релизить каждый деньФламп на спидах или ка релизить каждый день
Фламп на спидах или ка релизить каждый день
 
Артём Кудзев «Делайте на работе то, что мотивирует»
Артём Кудзев «Делайте на работе то, что мотивирует»Артём Кудзев «Делайте на работе то, что мотивирует»
Артём Кудзев «Делайте на работе то, что мотивирует»
 
Релизы? Регулярно по пятницам
 Релизы? Регулярно по пятницам Релизы? Регулярно по пятницам
Релизы? Регулярно по пятницам
 
Веб 3.0. Футуристический рассказ о будущем интернета и IT
Веб 3.0. Футуристический рассказ о будущем интернета и ITВеб 3.0. Футуристический рассказ о будущем интернета и IT
Веб 3.0. Футуристический рассказ о будущем интернета и IT
 
Фича готова. Что дальше?
Фича готова. Что дальше?Фича готова. Что дальше?
Фича готова. Что дальше?
 
Разработка мобильных приложений на HTML5
Разработка мобильных приложений на HTML5Разработка мобильных приложений на HTML5
Разработка мобильных приложений на HTML5
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
 
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС  «Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС
 
«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных
 
Межнодовое взаимодействие. Тонкости работы с Mnesia в кластере.
Межнодовое взаимодействие. Тонкости работы с Mnesia в кластере.Межнодовое взаимодействие. Тонкости работы с Mnesia в кластере.
Межнодовое взаимодействие. Тонкости работы с Mnesia в кластере.
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homework
 
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»
 

Semelhante a SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение возможностей

СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8Technopark
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...CocoaHeads
 
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Javametaform
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLNikolay Pisarev
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
 
лабораторная работа 8
лабораторная работа 8лабораторная работа 8
лабораторная работа 8student_kai
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...
Долгожданный релиз pg_pathman 1.0 / Александр Коротков,  Дмитрий Иванов (Post...Долгожданный релиз pg_pathman 1.0 / Александр Коротков,  Дмитрий Иванов (Post...
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...Ontico
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данныхAlex Polorotov
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данныхVitaliy Trenkenshu
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...pgdayrussia
 
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolПаттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolAlexandre Kalendarev
 
0045
00450045
0045JIuc
 
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQLCodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQLCodeFest
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and ClojureVasil Remeniuk
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Ivan Muratov
 

Semelhante a SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение возможностей (20)

лабраб 2
лабраб 2лабраб 2
лабраб 2
 
СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Java
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQL
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
лабраб 7
лабраб 7лабраб 7
лабраб 7
 
My sql 0
My sql 0My sql 0
My sql 0
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
лабораторная работа 8
лабораторная работа 8лабораторная работа 8
лабораторная работа 8
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...
Долгожданный релиз pg_pathman 1.0 / Александр Коротков,  Дмитрий Иванов (Post...Долгожданный релиз pg_pathman 1.0 / Александр Коротков,  Дмитрий Иванов (Post...
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данных
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данных
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
 
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolПаттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере Tarantool
 
0045
00450045
0045
 
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQLCodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
 

Mais de DevDay

«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений ТютюевDevDay
 
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий МузюкинDevDay
 
«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья ПастушковDevDay
 
Фреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковФреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковDevDay
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковDevDay
 
Devops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevDay
 
Inversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковInversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковDevDay
 
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь КудринDevDay
 
«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим БерёзкинDevDay
 
«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета АлексеенкоDevDay
 
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоМанипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоDevDay
 
Лабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовЛабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовDevDay
 
«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя ПономарёвDevDay
 
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...DevDay
 
«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел СташевскийDevDay
 
«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья ТаратухинDevDay
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис РечкуновDevDay
 
Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»DevDay
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»DevDay
 
Распределенные приложения и Azure Service Bus
Распределенные приложения и Azure Service BusРаспределенные приложения и Azure Service Bus
Распределенные приложения и Azure Service BusDevDay
 

Mais de DevDay (20)

«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев
 
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
 
«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков
 
Фреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковФреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр Бирюков
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей Солодовников
 
Devops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим Пашук
 
Inversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковInversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий Кожевников
 
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
 
«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин
 
«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко
 
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоМанипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
 
Лабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовЛабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим Ипполитов
 
«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв
 
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
 
«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский
 
«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
 
Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»
 
Распределенные приложения и Azure Service Bus
Распределенные приложения и Azure Service BusРаспределенные приложения и Azure Service Bus
Распределенные приложения и Azure Service Bus
 

SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение возможностей

  • 1. Расширенный SQL в MySQL и PostgreSQL. Сравнение возможностей. Даниил Каменский sakila@sqlinfo.ru
  • 2. План доклада Расширения SQL  пользовательские переменные  оконные функции  рекурсивные запросы  расширения для работы с таблицами 2
  • 3. План доклада Особенности и отличия базовых функций в MySQL и PostgreSQL  типы таблиц, особенности физического размещения  работа с индексами  оптимизация подзапросов  дополнительно 3
  • 4. Польз. переменные MySQL  Поддерживаются с версии 3.23.6  Возможность присваивать значения и использовать далее в рамках сессии SELECT @min_price:=MIN(`price`) FROM `shop`; SELECT * FROM `shop` WHERE `price`=@min_price; 4
  • 5. Пример №1: Пики загрузки  Поиск максимального различия между смежными значениями 5
  • 7. Без явной сортировки ALTER table `t` ORDER BY `t` ASC; SET @data=NULL,@max=0; SELECT @max:=if(v-@data>@max,v-data,@max), @data:=v FROM `t`; SELECT @max; 7
  • 8. Сортировка индексом CREATE INDEX t_v ON t(t, v); SET @data=NULL,@max=0; SELECT @max:=if(v-@data>@max,v-data,@max), @data:=v FROM `t` FORCE INDEX (t_v); SELECT @max; 8
  • 9. Сортировка в запросе SET @data=NULL,@max=0; SELECT @max:=if(v-@data>@max,v-data,@max), @data:=v FROM (SELECT * FROM `t` ORDER BY t); SELECT @max; 9
  • 10. Аналог в модели РБД SELECT MAX( t1.v - ( SELECT v FROM t t2 WHERE t2.t < t1.t ORDER BY t2.t DESC LIMIT 1) ) FROM t t1; 10
  • 11. Пример №2 Оценка загрузки каналов связи за определенные временные промежутки 11
  • 12. Реализация через ПП select @c:=0; select t, v from ( select t, if (t % 5, @c := @c+v, @c := v) as v, if( (t + 1) % 5,1,0) as mark from t) tt where mark = 0; select sum(v) from t group by (t-(second(t)%5)); 12
  • 15. Пример №3 Поиск n элементов группы по критерию. CREATE TABLE salary ( dep_id int, --идентификатор отдела emp_id int, --идентификатор работника sal int -- зарплата ); 15
  • 16. Запрос через ПП set @n=2, @i=0, @p=0; SELECT * FROM (SELECT * FROM `salary` ORDER BY dep_id ASC, sal DESC) t WHERE if (@p=dep_id, @i:=@i+1,(@i:=0) or (@p:=dep_id)) AND @i<@n; 16
  • 17. Аналог в РБД SELECT t1.* FROM salary t1 HAVING ( (SELECT count(*) FROM `salary` t2 WHERE t2.dep_id=t1.dep_id AND t2.sal>t1.sal) <2 ) ORDER BY dep_id, sal DESC; 17
  • 18. SWAP колонок, rownum UPDATE t SET field1=field2, field2=field1 Неправильный результат! set @tmp=''; UPDATE t SET field1=(@tmp:=field1), field1=field2, field2=@tmp; SET @n:=0; SELECT @n:=@n+1 AS rownum, t.* FROM t; 18
  • 19. Оконные функции PostgreSQL Выполнение вычисления над списком строк в таблице, которые так или иначе относятся к текущей строке Вычисление агрегатного значения без использования GROUP BY 19
  • 20. Примеры функций lag() – предыдущее значение в разбиении row_number() – номер строки в разбиении first_value() – первое значение в разбиении 20
  • 21. Оконные функции SELECT dep_id, emp_id, sal, 100 * sal::float / (sum(sal) OVER (PARTITION BY dep_id)) FROM salary WHERE dep_id = 1; 21
  • 22. Макс. перепад через ПП В postgresql.conf custom_variable_classes = 'lv' select set_config ('lv.data', ‘0', true); select set_config ('lv.max_value', '0', true); select current_setting('lv.data')::integer 22
  • 23. Макс. перепад через ОФ SELECT max(v) FROM (SELECT p.v - lag(t.v) OVER (ORDER BY t) as v FROM t ) tt; 23
  • 24. Макс. перепад через функцию create function public.temp_func() returns int as $$ DECLARE prev integer; curr integer; max_ integer; BEGIN max_ := 0; prev := 0; FOR curr IN SELECT v FROM pp LOOP if (curr - prev > max_) then max_ := curr - prev; end if; prev := curr; END LOOP; return max_; END $$ language plpgsql; 24
  • 25. Скорости выполнения запросов в PostgreSQL Таблица на 10,000,000 записей Оконные функции: 2,5 cек Пользовательские переменные: 13 сек Функция на plpgsql: 2 сек Запрос с подзапросами: 20 сек 25
  • 26. Элементы групп через ОФ SELECT dep_id, emp_id, sal FROM ( SELECT row_number() OVER (partition BY dep_id ORDER BY sal desc ) num, dep_id, emp_id, sal FROM salary ) t WHERE num < 3; 26
  • 27. Рекурсивные запросы with [recursive] <имя_алиаса_запроса> [ (<список столбцов>) ] as (<запрос>) <основной запрос> 27
  • 29. Обход дерева в ширину WITH RECURSIVE recursetree(val, id, level, pathstr) AS ( SELECT val, id, 0, cast('' as text) FROM tree WHERE parent_id = 0 UNION ALL SELECT t.val, t.id, rt.level + 1, rt.pathstr || '=>' || t.val::text FROM tree t JOIN recursetree rt ON rt.id = t.parent_id ) SELECT space(level) || val, id, level, pathstr FROM recursetree ORDER BY level, id; 29
  • 31. Intersect SELECT t1.val FROM set_operations_1 t1 INTERSECT SELECT t2.val FROM set_operations_2 t2; SELECT val FROM set_operations_1 WHERE val IN (SELECT val FROM set_operations_2); SELECT t1.val FROM set_operations_1 t1 JOIN set_operations_2 t2 using(val); 31
  • 32. Except SELECT t1.val FROM set_operations_1 t1 EXCEPT SELECT t2.val FROM set_operations_2 t2; SELECT val FROM set_operations_1 WHERE val NOT IN (SELECT val FROM set_operations_2); SELECT t1.val FROM set_operations_1 t1 LEFT JOIN set_operations_2 t2 USING (val) WHERE t2.val IS NULL 32
  • 33. 33
  • 34. Работа с таблицами ON DUPLICATE KEY insert into param(param, val) values(‘project_version’,100) on duplicate key update val=‘100'; REPLACE INTO replace into param(param, val) values(‘project_version’, ‘100’); 34
  • 35. Работа с таблицами INSERT IGNORE insert ignore into param(param, val) values(‘project_version’,100) insert into param(param, val) select 'project_version', ‘100' where 1 not in (select 1 from param where param = 'project_version'); 35
  • 36. Реализация upsert в PG CREATE OR REPLACE FUNCTION upsert(id_ integer, val_ integer) RETURNS void AS $$ BEGIN LOOP UPDATE t SET val = val_ WHERE id = id_ IF found THEN RETURN; END IF; BEGIN INSERT INTO t(id, val) VALUES (id_, val_); RETURN; EXCEPTION WHEN unique_violation THEN END; END LOOP; END; $$ LANGUAGE 'plpgsql'; 36
  • 37. Создание правила CREATE RULE "t_on_duplicate_ignore" AS ON INSERT TO "t" WHERE EXISTS(SELECT 1 FROM y WHERE pk_col = NEW.pk_col_1) DO INSTEAD NOTHING; 37
  • 38. Типы таблиц в MySQL InnoDB MyISAM Memory Merge Archive Blackhole 38
  • 39. Типы таблиц в MySQL tmp_table_size max_heap_table_size innodb_table_per_file 39
  • 40. Индексы Основные типы Btree Hash MySQL – только memory-таблицы PostgreSQL – hash не рекомендуется 40
  • 41. Индексные алгоритмы MySQL: Невозможность использовать составные индексы при нестрогом равенстве в начале SELECT * FROM t WHERE a<3 AND b<5; Директива USE/IGNORE/FORCE INDEX PostgreSQL: Невозможность указать индекс явно. Возможность регуляции через set enable_***scan=1 и set enable_***scan=0 41
  • 43. Функц. и сост. индексы CREATE INDEX i ON billing(is_payed) WHERE is_payed = false; CREATE INDEX i ON users ( substr(email, strrevpos(email , '.') + 1 ) ); CREATE INDEX i ON y(f1 ASC, f2 DESC); 43
  • 44. MySQL - подзапросы SELECT * FROM users WHERE id IN (SELECT poster_id FROM posts WHERE poster_ip LIKE ‘212.194.55.%’); SELECT * FROM users u JOIN posts p ON u.id=p.poster_id WHERE p.poster_ip LIKE ‘212.194.55.% ’; 44
  • 45. Анонимные блоки кода MySQL: CREATE/DROP IF EXISTS/IF NOT EXISTS PostgreSQL: DO $$ begin if exists (select 1 from pg_tables where tablename = ‘t') then drop table t;end if; end $$; 45
  • 46. Дополнение MySQL: Фальшивые Foreign Keys у таблиц MyISAM Фальшивые hash-индексы у таблиц не memory При @@sql_mode <> ‘ANSI’ возможность делать ошибки – например SELECT avg(a), b FROM t; PostgreSQL: Отсутствие возможности менять колонки местами  Генерация исключений в хранимых процедурах 46
  • 48. Планы исполнения запросов А. Запрос с ПП Синтаксический анализ запроса Создание плана исполнения Определение хранилища базы (engine) Цикл foreach {   Обращение к engine } Б. Цикл внутри ХП {   Синтаксический анализ запроса (курсор)   Определение хранилища базы (engine)   Обращение к engine   Переход к следующему шагу цикла (интерпретатор языка SQL) } 48