SlideShare ist ein Scribd-Unternehmen logo
1 von 12
+ 
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

Weitere ähnliche Inhalte

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

Advanced Sql Injection
Advanced Sql InjectionAdvanced Sql Injection
Advanced Sql Injection
Dmitry Evteev
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Magneta AI
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo
 

Ähnlich wie 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
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - 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