SlideShare a Scribd company logo
+ 
Alasql.js 
SQL сервер на JavaScript 
© Андрей Гершун, 2014 
à la 
SQL 
à la 
SQL
+ 
SQL на JavaScript… Хм. 
 Применение 
 Быстрая обработка данных (сортировка, группировка, фильтрация, 
слияния) на клиенте 
 Фронт-энд для Business Intelligence ( OLAP, таблицы) 
 Мобильные приложения с нерегулярной связью с сервером 
 Тренды 
 JavaScript – везде 
 JavaScript – оптимизирован 
 JavaScript – гибкий, комфортный, большое количество библиотек
+ 
Сложные запросы к данным 
 SELECT COUNT(*) FROM students 
LEFT JOIN courses USING courseid 
LEFT JOIN schools ON students.schoolid = schools.schoolid 
WHERE courseid > 3 
GROUP BY schools, courseid 
ORDER BY courseid DESC, schoolid 
 filter(), sort(), map(), reduce()… - не просто…
+ 
Какие решения SQL существуют 
для браузера? 
 Полноценные SQL (на базе SQLite) 
 WebSQL – “вне стандарта» с 2011 года (SQLite) 
 SQL.js – 1 Мб, компиляция с помощью Emscripten, небыстрый 
 SequelSphere – коммерческое решение (сайт не работает) 
 «Неполноценные SQL» (Аналоги LINQ) 
 SQLike 
 SQL… 
 NoSQL (Запросы через JSON) 
 IndexedDB 
 Key-value хранилища
+ 
Alasql.js – как использовать? 
 Подключение 
 Браузер 
 <script src=“alasql.js></script> 
<script>alasql(‘CREATE DATABASE test01’) </script> 
 require([‘alasql’], function(alasql) { 
alasql(‘SELECT * FROM courses’); 
}) 
 Node.js 
 npm install alasql 
 require(‘alasql.js’) 
 Использование: «классический SQL» 
 alasql(‘CREATE DATABASE TEST01; USE TEST01;); 
 alasql(‘CREATE TABLE students (studentid INT, name STRING)’); 
 alasql(‘INSERT INTO students VALUES (100, “Иванов И.И.”)’); 
 var numStudents = alasql.value(‘SELECT COUNT(*) FROM students’);
+ 
SQL и JavaScript – лучше вместе 
 JS интерфейс 
 var db = new alasql.Database(); 
var res = db.exec(‘SELECT * FROM one’); 
 Alasql как «супер-фильтр» 
 var data = [[1,2,3], [2,3,4], [5,6,7]]; 
var res = alasql.value(‘SELECT * FROM ? WHERE [0] < ?’,[data, 2]); 
 Пользовательские функции 
 alasql.fn.myfn = function(a,b) {return a*10+b}; 
 Компиляция операторов и функций 
 var myInsert = alasql.compile(‘INSERT INTO one VALUES (?,?)’); 
myInsert([5,6]);
+ 
SQL и JavaScript не всегда вместе 
 Схемы ускоряют исполнение 
 SELECT * 
 Схемы замедляют исполнение 
 PRIMARY KEY / FOREIGN KEY / UNIQUE INDEX 
 Без схемы никуда 
 Сравнение дат и других
+ 
Alasql изнутри 
 Лексер и парсер 
 Jison 
 Компилятор 
 Компиляция «критичных по скорости» операторов 
SELECT/INSERT/UPDATE/DELETE 
 Проверка перед исполнением актульности версии схемы базы данных 
 Интерпретатор 
 Интепретация «больших» операторов (CREATE DATABASE, CREATE 
TABLE и др.)
+ 
Разработка и тестирование 
 Gulp, Concat, Uglify – сборка библиотеки 
 Jison – лексер и парсер SQL 
 Mocha -тестирование 
 Более 200 тестов (и этого мало!) для Node.js и браузера 
 «Родные» тесты SQLite 
 Переход на «серьезные» тесты (NIST SQL) 
 zt 
 Тесты для сравнения скорости
+ 
Оптимизация SQL 
 Нужны ли вообще индексы...? 
 Да – замедление INSERT при наличии CONSTRAINTS 
 Нет – замедление при выполнении первый раз SELECT 
 Предварительная индексация SELECT 
 JOIN USING 
 one JOIN two ON one.a = two.a+1 AND one.b = two.c+two.d 
 Префильтрация WHERE в JOINs 
 Оптимизированный проход по SELECT 
 (1 раз для LEFT JOIN + 1 раз для RIGHT JOIN + 1 раз для GROUP + 
sort)
+ 
Оптимизация JavaScript 
 Компиляция критических операций (SELECT, WHERE, ORDER BY, 
GROUP BY, HAVING, INSERT, DELETE, UPDATE): 
 SELECT * FROM data ORDER BY alpha, beta 
 data.sort(function(a,b){ 
if(a.alpha>b.alpha) {return 1; else if(a.alpha==b.alpha) return 0; 
if(a.beta>b.beta) {return 1; else if(a.beta==b.beta) return 0; 
}} 
return -1; 
}) 
 orderfn = new Function(‘scope’, ‘return ’+orderfns); 
 Существенно быстрее, чем интерпретация 
 Сложности с объектами (в частности датами) при отсутствии схемы 
 «Классическая» оптимизация JavaScript 
 for быстрее, чем forEach и т.д. 
 jsPerf - лучший советчик…
+ 
Где? 
 alasql,org – официальный сайт 
 https://github.com/agershun/alasql - GitHub

More Related Content

Similar to Alasql.js - SQL сервер на JavaScript

Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Fedor Lavrentyev
 
Sql injection
Sql injectionSql injection
Sql injection
Michal11221
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
Anton Kirillov
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
LogeekNightUkraine
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
Alex Filatov
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
Sergey Nemchinsky
 
Advanced Sql Injection
Advanced Sql InjectionAdvanced Sql Injection
Advanced Sql InjectionDmitry Evteev
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
Арсений Жижелев
 
JDBC
JDBCJDBC
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
Pavlo Iuriichuk
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Magneta AI
 
Систематизация экспрешнов в IE
Систематизация экспрешнов в IEСистематизация экспрешнов в IE
Систематизация экспрешнов в IE
Roman Komarov
 
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса
Омские ИТ-субботники
 
Jdbc in java
Jdbc in javaJdbc in java
Jdbc in java
Asya Dudnik
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
 
Основы языка R
Основы языка RОсновы языка R
Основы языка R
Sergey Mastitsky
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlOleksandr Petrov
 

Similar to Alasql.js - SQL сервер на JavaScript (20)

Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
PT MIFI Labsql
PT MIFI LabsqlPT MIFI Labsql
PT MIFI Labsql
 
Sql injection
Sql injectionSql injection
Sql injection
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
PT Hackday#2
PT Hackday#2PT Hackday#2
PT Hackday#2
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
 
Advanced Sql Injection
Advanced Sql InjectionAdvanced Sql Injection
Advanced Sql Injection
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
JDBC
JDBCJDBC
JDBC
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
Систематизация экспрешнов в IE
Систематизация экспрешнов в IEСистематизация экспрешнов в IE
Систематизация экспрешнов в IE
 
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса
 
Jdbc in java
Jdbc in javaJdbc in java
Jdbc in java
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Основы языка R
Основы языка RОсновы языка R
Основы языка R
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher Sql
 

Alasql.js - SQL сервер на JavaScript

  • 1. + Alasql.js SQL сервер на JavaScript © Андрей Гершун, 2014 à la SQL à la SQL
  • 2. + SQL на JavaScript… Хм.  Применение  Быстрая обработка данных (сортировка, группировка, фильтрация, слияния) на клиенте  Фронт-энд для Business Intelligence ( OLAP, таблицы)  Мобильные приложения с нерегулярной связью с сервером  Тренды  JavaScript – везде  JavaScript – оптимизирован  JavaScript – гибкий, комфортный, большое количество библиотек
  • 3. + Сложные запросы к данным  SELECT COUNT(*) FROM students LEFT JOIN courses USING courseid LEFT JOIN schools ON students.schoolid = schools.schoolid WHERE courseid > 3 GROUP BY schools, courseid ORDER BY courseid DESC, schoolid  filter(), sort(), map(), reduce()… - не просто…
  • 4. + Какие решения SQL существуют для браузера?  Полноценные SQL (на базе SQLite)  WebSQL – “вне стандарта» с 2011 года (SQLite)  SQL.js – 1 Мб, компиляция с помощью Emscripten, небыстрый  SequelSphere – коммерческое решение (сайт не работает)  «Неполноценные SQL» (Аналоги LINQ)  SQLike  SQL…  NoSQL (Запросы через JSON)  IndexedDB  Key-value хранилища
  • 5. + Alasql.js – как использовать?  Подключение  Браузер  <script src=“alasql.js></script> <script>alasql(‘CREATE DATABASE test01’) </script>  require([‘alasql’], function(alasql) { alasql(‘SELECT * FROM courses’); })  Node.js  npm install alasql  require(‘alasql.js’)  Использование: «классический SQL»  alasql(‘CREATE DATABASE TEST01; USE TEST01;);  alasql(‘CREATE TABLE students (studentid INT, name STRING)’);  alasql(‘INSERT INTO students VALUES (100, “Иванов И.И.”)’);  var numStudents = alasql.value(‘SELECT COUNT(*) FROM students’);
  • 6. + SQL и JavaScript – лучше вместе  JS интерфейс  var db = new alasql.Database(); var res = db.exec(‘SELECT * FROM one’);  Alasql как «супер-фильтр»  var data = [[1,2,3], [2,3,4], [5,6,7]]; var res = alasql.value(‘SELECT * FROM ? WHERE [0] < ?’,[data, 2]);  Пользовательские функции  alasql.fn.myfn = function(a,b) {return a*10+b};  Компиляция операторов и функций  var myInsert = alasql.compile(‘INSERT INTO one VALUES (?,?)’); myInsert([5,6]);
  • 7. + SQL и JavaScript не всегда вместе  Схемы ускоряют исполнение  SELECT *  Схемы замедляют исполнение  PRIMARY KEY / FOREIGN KEY / UNIQUE INDEX  Без схемы никуда  Сравнение дат и других
  • 8. + Alasql изнутри  Лексер и парсер  Jison  Компилятор  Компиляция «критичных по скорости» операторов SELECT/INSERT/UPDATE/DELETE  Проверка перед исполнением актульности версии схемы базы данных  Интерпретатор  Интепретация «больших» операторов (CREATE DATABASE, CREATE TABLE и др.)
  • 9. + Разработка и тестирование  Gulp, Concat, Uglify – сборка библиотеки  Jison – лексер и парсер SQL  Mocha -тестирование  Более 200 тестов (и этого мало!) для Node.js и браузера  «Родные» тесты SQLite  Переход на «серьезные» тесты (NIST SQL)  zt  Тесты для сравнения скорости
  • 10. + Оптимизация SQL  Нужны ли вообще индексы...?  Да – замедление INSERT при наличии CONSTRAINTS  Нет – замедление при выполнении первый раз SELECT  Предварительная индексация SELECT  JOIN USING  one JOIN two ON one.a = two.a+1 AND one.b = two.c+two.d  Префильтрация WHERE в JOINs  Оптимизированный проход по SELECT  (1 раз для LEFT JOIN + 1 раз для RIGHT JOIN + 1 раз для GROUP + sort)
  • 11. + Оптимизация JavaScript  Компиляция критических операций (SELECT, WHERE, ORDER BY, GROUP BY, HAVING, INSERT, DELETE, UPDATE):  SELECT * FROM data ORDER BY alpha, beta  data.sort(function(a,b){ if(a.alpha>b.alpha) {return 1; else if(a.alpha==b.alpha) return 0; if(a.beta>b.beta) {return 1; else if(a.beta==b.beta) return 0; }} return -1; })  orderfn = new Function(‘scope’, ‘return ’+orderfns);  Существенно быстрее, чем интерпретация  Сложности с объектами (в частности датами) при отсутствии схемы  «Классическая» оптимизация JavaScript  for быстрее, чем forEach и т.д.  jsPerf - лучший советчик…
  • 12. + Где?  alasql,org – официальный сайт  https://github.com/agershun/alasql - GitHub