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 - лучший советчик…