SlideShare ist ein Scribd-Unternehmen logo
1 von 47
Downloaden Sie, um offline zu lesen
Нетрадиционное
                  использование Ruby и
                       PostgreSQL
                            Иван Евтухович




вторник, 18 декабря 12 г.
вторник, 18 декабря 12 г.
вторник, 18 декабря 12 г.
вторник, 18 декабря 12 г.
О чем этот доклад?


                    • О смерти Ruby?
                    • О чем-то, что будет полезно?


вторник, 18 декабря 12 г.
• ruby внутри vim
                    • ruby и PostgreSQL (полезная часть)
                    • ruby и PostgreSQL (бесполезная часть)


вторник, 18 декабря 12 г.
Ruby и Vim

                    • :help ruby
                    • 200 строк документации
                    • пару десятков функций


вторник, 18 декабря 12 г.
$ pwd
         /Users/brun/Projects/vim/src
        $ wc if_ruby.c
           1346 3621 35552 if_ruby.c



вторник, 18 декабря 12 г.
Этого достаточно


                    • волшебные методы Vim.command и
                            Vim.evaluate




вторник, 18 декабря 12 г.
Vim.command
                    • выполняет любую команду командного
                            режима Vim


             :ruby Vim.command(‘help ruby’)
             :help ruby

вторник, 18 декабря 12 г.
Vim.evaluate

                    • вычисляет любое выражение в vim

         :ruby puts Vim.evaluate(‘2012’).class
         Fixnum



вторник, 18 декабря 12 г.
Проблемы

                    • нет eval, но есть pyeval() :-(
                    • я не нашел хороших примеров
                            использования
                    • VimL


вторник, 18 декабря 12 г.
вторник, 18 декабря 12 г.
function! Serpinski()
     ruby << EOF
     def draw(arr, x, y)
       arr[x][y] = '*'
     end

     def carpet(arr, size, x, y)
       if size == 1
         draw(arr, x, y)
       else
         new_size = size / 3
         carpet(arr, new_size, x, y)
         carpet(arr, new_size, x + new_size, y)
         carpet(arr, new_size, x + new_size * 2,   y)
         carpet(arr, new_size, x, y + new_size)
         carpet(arr, new_size, x + new_size * 2,   y + new_size)
         carpet(arr, new_size, x, y + new_size *   2)
         carpet(arr, new_size, x + new_size, y +   new_size * 2)
         carpet(arr, new_size, x + new_size * 2,   y + new_size * 2)
       end
     end

     arr = Array.new(27) { Array.new }
     carpet(arr, 27, 0, 0)

     arr.each_with_index do |line, i|
       l = line.map { |e| e.nil? ? ' ' : e }
       Vim::Buffer.current.append(Vim::Buffer.current.line_number + i, l.join(''))
     end
     EOF
     endfunction


вторник, 18 декабря 12 г.
• :call Serpinski()
                    • :nmap <F7> :call Serpinski() <CR>



вторник, 18 декабря 12 г.
HSTORE

                    • расширение в PostgreSQL
                    • хранить ключ-значение
                    • нет вложенности
                    • ключ и значение — строки
                    • CREATE EXTENSION hstore

вторник, 18 декабря 12 г.
CREATE table test(id serial, value hstore);

 “ заполним таблицу тестовыми данными

 CREATE INDEX ON test USING GIN(value);


 EXPLAIN SELECT value -> '111' FROM test WHERE value ? '111';
                                   QUERY PLAN
 ------------------------------------------------------------------------------
  Bitmap Heap Scan on test (cost=12.01..16.02 rows=1 width=114)
    Recheck Cond: (value ? '111'::text)
    -> Bitmap Index Scan on test_value_idx (cost=0.00..12.01 rows=1 width=0)
          Index Cond: (value ? '111'::text)




вторник, 18 декабря 12 г.
serialize
                    • http://apidock.com/rails/ActiveRecord/Base/
                            serialize/class


                class User < ActiveRecord::Base
                  serialize :preferences
                end



вторник, 18 декабря 12 г.
Спецсредства
  https://github.com/engageis/activerecord-postgres-hstore


 rails	
  g	
  model	
  User	
  email:string	
  value:hstore

 User.where("value ? 'name'")

 User.where("value @> 'name=>Ivan'")

 SELECT "users".* FROM "users" WHERE (value
 @> 'name=>Ivan')

вторник, 18 декабря 12 г.
explain SELECT "users".* FROM "users"
     WHERE (value @> 'name=>Ivan');

                    QUERY PLAN
     ------------------------------------------
     Index Scan using test_value_idx on users
           (cost=0.00..8.27 rows=1 width=182)
        Index Cond: (value @> '"name"=>"Ivan"'::hstore)




вторник, 18 декабря 12 г.
Arrays
                    • В PostgreSQL есть массивы однотипных
                            элементов
                    • Поддержка массивов pg появилась в
                            rails 4
                    • Есть бэкпорт в rails 3
                    • https://github.com/tlconnor/activerecord-
                            postgres-array


вторник, 18 декабря 12 г.
class CreateBooks <
  ActiveRecord::Migration
    def change
      create_table :books do |t|
        t.text :name
        t.text_array :authors
        t.timestamps
      end
    end
  end
вторник, 18 декабря 12 г.
create index on books using
  gin(authors);

  Book.create! :authors => ["Ivan
  Evtukhovich", "Ivan Samsonov"]

  Book.where("authors @> ARRAY['Ivan
  Samsonov']")



вторник, 18 декабря 12 г.
explain select * from books where
authors @> ARRAY['Ivan Samsonov'];

QUERY PLAN
----------------------------------
 Bitmap Heap Scan on books
(cost=8.03..16.49 rows=4 width=84)
   Recheck Cond: (authors @> '{"Ivan
Samsonov"}'::text[])
   -> Bitmap Index Scan on
books_authors_idx (cost=0.00..8.03
rows=4 width=0)
         Index Cond: (authors @> '{"Ivan
Samsonov"}'::text[])
вторник, 18 декабря 12 г.
Хипстерское
                             хранилище
                    • документоориентированное
                    • schemaless
                    • быстрый поиск
                    • быстрая запись
                    • без join-ов
                    • web scale
вторник, 18 декабря 12 г.
Имя?

                    • rake
                    • rdebug
                    • rmagick
                    • rdoc

вторник, 18 декабря 12 г.
Имя?

                    • cruisecontrol.rb
                    • perftools.rb
                    • gdb.rb


вторник, 18 декабря 12 г.
r_____.rb


вторник, 18 декабря 12 г.
rmongo.rb

вторник, 18 декабря 12 г.
Прообраз

                    • http://docs.mongodb.org/manual/tutorial/
                            getting-started/
                    • early pre alfa version
                    • продукт не будет развиваться


вторник, 18 декабря 12 г.
вторник, 18 декабря 12 г.
Реализовано

                    • find
                    • insert
                    • count
                    • ensureIndex

вторник, 18 декабря 12 г.
Live
           Demo
вторник, 18 декабря 12 г.
Формат документа?



вторник, 18 декабря 12 г.
YAML



вторник, 18 декабря 12 г.
Как и обещал
                    • документоориентированное √
                    • schemaless √
                    • быстрый поиск √
                    • быстрая запись √
                    • без join-ов √
                    • web scale √
вторник, 18 декабря 12 г.
Что внутри?



вторник, 18 декабря 12 г.
pl/ruby
                    • https://github.com/globegit/postgresql-
                            plruby
                    • хрен поставишь
                    • только ruby 1.8.x
                    • не завелся на PostgreSQL 9.2
                    • добровольцы?
вторник, 18 декабря 12 г.
Table "public.things"

                Column | Type    |
               --------+---------+
                id     | integer |
                value | text     |




вторник, 18 декабря 12 г.
• Со вставкой все понятно
                    • А с поиском?



вторник, 18 декабря 12 г.
db.things.find("title" => "Книга")

      SELECT * FROM things WHERE
        rmongorb_get_key('title'::text, value) = 'Книга'

      CREATE OR REPLACE FUNCTION
       rmongorb_get_key(key text, value text)
       RETURNS text AS '
        require "yaml"
        obj = YAML.load(value)
        obj[key]
      ' LANGUAGE 'plruby' IMMUTABLE;




вторник, 18 декабря 12 г.
Быстрый поиск


                    • функциональные индексы в PostgreSQL
                    • http://www.postgresql.org/docs/9.2/static/
                            indexes-expressional.html




вторник, 18 декабря 12 г.
db.things.ensureIndex(
      {"last_name" => 1})

    CREATE INDEX ON things
    (rmongorb_get_key(
      'last_name'::text, value))




вторник, 18 декабря 12 г.
EXPLAIN SELECT * FROM things WHERE
 rmongorb_get_key('last_name'::text, value) =
   'Сидоров' ;

 QUERY PLAN
 -------------------------------------
  Index Scan using
       things_rmongorb_get_key_idx2 on things
       (cost=0.25..20.53 rows=4 width=222)
    Index Cond:
      (rmongorb_get_key('last_name'::text,
 value) = 'Сидоров'::text)




вторник, 18 декабря 12 г.
Быстрая запись


                    • synchronous_commit = on
                    • http://www.postgresql.org/docs/9.2/static/
                            wal-async-commit.html




вторник, 18 декабря 12 г.
Что еще можно
                               сделать?
                    • вложенные ключи
                    • join на самом деле есть :-)
                    • sharding
                    • http://ssql-railsconf.herokuapp.com/

вторник, 18 декабря 12 г.
Спасибо!

                                 @rubynoname
                                  @evtuhovich
                            evtuhovich@gmail.com
                            http://blog.evtuhovich.ru/




вторник, 18 декабря 12 г.

Weitere ähnliche Inhalte

Was ist angesagt?

CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest
 
Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)
Ontico
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)
Ontico
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Ontico
 

Was ist angesagt? (20)

Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
 
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...
 
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
 
Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)
 
Метаобъектная система Qt
Метаобъектная система QtМетаобъектная система Qt
Метаобъектная система Qt
 
Денис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система QtДенис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система Qt
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
 
13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма Spark13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма Spark
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
 
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
 
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkDF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
 
06 - Hadoop. Java API и Hadoop Streaming
06 - Hadoop. Java API и Hadoop Streaming06 - Hadoop. Java API и Hadoop Streaming
06 - Hadoop. Java API и Hadoop Streaming
 
14 - Hadoop. Фреймворк Spark
14 - Hadoop. Фреймворк Spark14 - Hadoop. Фреймворк Spark
14 - Hadoop. Фреймворк Spark
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBMyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDB
 
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsql
 
Быстро о быстром
Быстро о быстромБыстро о быстром
Быстро о быстром
 

Ähnlich wie Нетрадиционное использование Ruby и PostgreSQL

Сергей Бережной — Парное программирование
Сергей Бережной — Парное программированиеСергей Бережной — Парное программирование
Сергей Бережной — Парное программирование
Yandex
 
Индексный поиск по регулярным выражениям (Александр Коротков)
Индексный поиск по регулярным выражениям (Александр Коротков)Индексный поиск по регулярным выражениям (Александр Коротков)
Индексный поиск по регулярным выражениям (Александр Коротков)
Ontico
 
Максим Лапшин (Erlyvideo)
Максим Лапшин (Erlyvideo)Максим Лапшин (Erlyvideo)
Максим Лапшин (Erlyvideo)
Ontico
 

Ähnlich wie Нетрадиционное использование Ruby и PostgreSQL (7)

Технические аспекты знакоства с девушкой в Интернете
Технические аспекты знакоства с девушкой в ИнтернетеТехнические аспекты знакоства с девушкой в Интернете
Технические аспекты знакоства с девушкой в Интернете
 
Garbage collector and a bit of memory management
Garbage collector and a bit of memory managementGarbage collector and a bit of memory management
Garbage collector and a bit of memory management
 
Сергей Бережной — Парное программирование
Сергей Бережной — Парное программированиеСергей Бережной — Парное программирование
Сергей Бережной — Парное программирование
 
Индексный поиск по регулярным выражениям (Александр Коротков)
Индексный поиск по регулярным выражениям (Александр Коротков)Индексный поиск по регулярным выражениям (Александр Коротков)
Индексный поиск по регулярным выражениям (Александр Коротков)
 
Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений
Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений
Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений
 
Pulsedb — система хранения временных рядов
Pulsedb — система хранения временных рядовPulsedb — система хранения временных рядов
Pulsedb — система хранения временных рядов
 
Максим Лапшин (Erlyvideo)
Максим Лапшин (Erlyvideo)Максим Лапшин (Erlyvideo)
Максим Лапшин (Erlyvideo)
 

Mehr von Ivan Evtukhovich

Git для продолжающих
Git для продолжающихGit для продолжающих
Git для продолжающих
Ivan Evtukhovich
 

Mehr von Ivan Evtukhovich (12)

Развитие DevOps/NoOps инструментов. Что было, что есть, что будет.
Развитие DevOps/NoOps инструментов.  Что было, что есть, что будет.Развитие DevOps/NoOps инструментов.  Что было, что есть, что будет.
Развитие DevOps/NoOps инструментов. Что было, что есть, что будет.
 
Микросервисы: откуда столько шума?
Микросервисы: откуда столько шума?Микросервисы: откуда столько шума?
Микросервисы: откуда столько шума?
 
Микросервисы: откуда столько шума?
Микросервисы: откуда столько шума?Микросервисы: откуда столько шума?
Микросервисы: откуда столько шума?
 
Жизнь консалтинга в мире DevOps
Жизнь консалтинга в мире DevOpsЖизнь консалтинга в мире DevOps
Жизнь консалтинга в мире DevOps
 
DevOps и системы управления конфигурацией. SECON 2015
DevOps и системы управления конфигурацией. SECON 2015DevOps и системы управления конфигурацией. SECON 2015
DevOps и системы управления конфигурацией. SECON 2015
 
Куда движется управление инфраструктурой
Куда движется управление инфраструктуройКуда движется управление инфраструктурой
Куда движется управление инфраструктурой
 
Повторяемость для котиков: библиотекарь и книжная полка
Повторяемость для котиков: библиотекарь и книжная полкаПовторяемость для котиков: библиотекарь и книжная полка
Повторяемость для котиков: библиотекарь и книжная полка
 
Continuousdelivery
ContinuousdeliveryContinuousdelivery
Continuousdelivery
 
Vim or die
Vim or dieVim or die
Vim or die
 
Git для продолжающих
Git для продолжающихGit для продолжающих
Git для продолжающих
 
Краткое описание Scrum
Краткое описание ScrumКраткое описание Scrum
Краткое описание Scrum
 
Распределенные системы контоля версия на примере git
Распределенные системы контоля версия на примере gitРаспределенные системы контоля версия на примере git
Распределенные системы контоля версия на примере git
 

Нетрадиционное использование Ruby и PostgreSQL

  • 1. Нетрадиционное использование Ruby и PostgreSQL Иван Евтухович вторник, 18 декабря 12 г.
  • 5. О чем этот доклад? • О смерти Ruby? • О чем-то, что будет полезно? вторник, 18 декабря 12 г.
  • 6. • ruby внутри vim • ruby и PostgreSQL (полезная часть) • ruby и PostgreSQL (бесполезная часть) вторник, 18 декабря 12 г.
  • 7. Ruby и Vim • :help ruby • 200 строк документации • пару десятков функций вторник, 18 декабря 12 г.
  • 8. $ pwd /Users/brun/Projects/vim/src $ wc if_ruby.c 1346 3621 35552 if_ruby.c вторник, 18 декабря 12 г.
  • 9. Этого достаточно • волшебные методы Vim.command и Vim.evaluate вторник, 18 декабря 12 г.
  • 10. Vim.command • выполняет любую команду командного режима Vim :ruby Vim.command(‘help ruby’) :help ruby вторник, 18 декабря 12 г.
  • 11. Vim.evaluate • вычисляет любое выражение в vim :ruby puts Vim.evaluate(‘2012’).class Fixnum вторник, 18 декабря 12 г.
  • 12. Проблемы • нет eval, но есть pyeval() :-( • я не нашел хороших примеров использования • VimL вторник, 18 декабря 12 г.
  • 14. function! Serpinski() ruby << EOF def draw(arr, x, y) arr[x][y] = '*' end def carpet(arr, size, x, y) if size == 1 draw(arr, x, y) else new_size = size / 3 carpet(arr, new_size, x, y) carpet(arr, new_size, x + new_size, y) carpet(arr, new_size, x + new_size * 2, y) carpet(arr, new_size, x, y + new_size) carpet(arr, new_size, x + new_size * 2, y + new_size) carpet(arr, new_size, x, y + new_size * 2) carpet(arr, new_size, x + new_size, y + new_size * 2) carpet(arr, new_size, x + new_size * 2, y + new_size * 2) end end arr = Array.new(27) { Array.new } carpet(arr, 27, 0, 0) arr.each_with_index do |line, i| l = line.map { |e| e.nil? ? ' ' : e } Vim::Buffer.current.append(Vim::Buffer.current.line_number + i, l.join('')) end EOF endfunction вторник, 18 декабря 12 г.
  • 15. • :call Serpinski() • :nmap <F7> :call Serpinski() <CR> вторник, 18 декабря 12 г.
  • 16. HSTORE • расширение в PostgreSQL • хранить ключ-значение • нет вложенности • ключ и значение — строки • CREATE EXTENSION hstore вторник, 18 декабря 12 г.
  • 17. CREATE table test(id serial, value hstore); “ заполним таблицу тестовыми данными CREATE INDEX ON test USING GIN(value); EXPLAIN SELECT value -> '111' FROM test WHERE value ? '111'; QUERY PLAN ------------------------------------------------------------------------------ Bitmap Heap Scan on test (cost=12.01..16.02 rows=1 width=114) Recheck Cond: (value ? '111'::text) -> Bitmap Index Scan on test_value_idx (cost=0.00..12.01 rows=1 width=0) Index Cond: (value ? '111'::text) вторник, 18 декабря 12 г.
  • 18. serialize • http://apidock.com/rails/ActiveRecord/Base/ serialize/class class User < ActiveRecord::Base serialize :preferences end вторник, 18 декабря 12 г.
  • 19. Спецсредства https://github.com/engageis/activerecord-postgres-hstore rails  g  model  User  email:string  value:hstore User.where("value ? 'name'") User.where("value @> 'name=>Ivan'") SELECT "users".* FROM "users" WHERE (value @> 'name=>Ivan') вторник, 18 декабря 12 г.
  • 20. explain SELECT "users".* FROM "users" WHERE (value @> 'name=>Ivan'); QUERY PLAN ------------------------------------------ Index Scan using test_value_idx on users (cost=0.00..8.27 rows=1 width=182) Index Cond: (value @> '"name"=>"Ivan"'::hstore) вторник, 18 декабря 12 г.
  • 21. Arrays • В PostgreSQL есть массивы однотипных элементов • Поддержка массивов pg появилась в rails 4 • Есть бэкпорт в rails 3 • https://github.com/tlconnor/activerecord- postgres-array вторник, 18 декабря 12 г.
  • 22. class CreateBooks < ActiveRecord::Migration def change create_table :books do |t| t.text :name t.text_array :authors t.timestamps end end end вторник, 18 декабря 12 г.
  • 23. create index on books using gin(authors); Book.create! :authors => ["Ivan Evtukhovich", "Ivan Samsonov"] Book.where("authors @> ARRAY['Ivan Samsonov']") вторник, 18 декабря 12 г.
  • 24. explain select * from books where authors @> ARRAY['Ivan Samsonov']; QUERY PLAN ---------------------------------- Bitmap Heap Scan on books (cost=8.03..16.49 rows=4 width=84) Recheck Cond: (authors @> '{"Ivan Samsonov"}'::text[]) -> Bitmap Index Scan on books_authors_idx (cost=0.00..8.03 rows=4 width=0) Index Cond: (authors @> '{"Ivan Samsonov"}'::text[]) вторник, 18 декабря 12 г.
  • 25. Хипстерское хранилище • документоориентированное • schemaless • быстрый поиск • быстрая запись • без join-ов • web scale вторник, 18 декабря 12 г.
  • 26. Имя? • rake • rdebug • rmagick • rdoc вторник, 18 декабря 12 г.
  • 27. Имя? • cruisecontrol.rb • perftools.rb • gdb.rb вторник, 18 декабря 12 г.
  • 30. Прообраз • http://docs.mongodb.org/manual/tutorial/ getting-started/ • early pre alfa version • продукт не будет развиваться вторник, 18 декабря 12 г.
  • 32. Реализовано • find • insert • count • ensureIndex вторник, 18 декабря 12 г.
  • 33. Live Demo вторник, 18 декабря 12 г.
  • 36. Как и обещал • документоориентированное √ • schemaless √ • быстрый поиск √ • быстрая запись √ • без join-ов √ • web scale √ вторник, 18 декабря 12 г.
  • 37. Что внутри? вторник, 18 декабря 12 г.
  • 38. pl/ruby • https://github.com/globegit/postgresql- plruby • хрен поставишь • только ruby 1.8.x • не завелся на PostgreSQL 9.2 • добровольцы? вторник, 18 декабря 12 г.
  • 39. Table "public.things" Column | Type | --------+---------+ id | integer | value | text | вторник, 18 декабря 12 г.
  • 40. • Со вставкой все понятно • А с поиском? вторник, 18 декабря 12 г.
  • 41. db.things.find("title" => "Книга") SELECT * FROM things WHERE rmongorb_get_key('title'::text, value) = 'Книга' CREATE OR REPLACE FUNCTION rmongorb_get_key(key text, value text) RETURNS text AS ' require "yaml" obj = YAML.load(value) obj[key] ' LANGUAGE 'plruby' IMMUTABLE; вторник, 18 декабря 12 г.
  • 42. Быстрый поиск • функциональные индексы в PostgreSQL • http://www.postgresql.org/docs/9.2/static/ indexes-expressional.html вторник, 18 декабря 12 г.
  • 43. db.things.ensureIndex( {"last_name" => 1}) CREATE INDEX ON things (rmongorb_get_key( 'last_name'::text, value)) вторник, 18 декабря 12 г.
  • 44. EXPLAIN SELECT * FROM things WHERE rmongorb_get_key('last_name'::text, value) = 'Сидоров' ; QUERY PLAN ------------------------------------- Index Scan using things_rmongorb_get_key_idx2 on things (cost=0.25..20.53 rows=4 width=222) Index Cond: (rmongorb_get_key('last_name'::text, value) = 'Сидоров'::text) вторник, 18 декабря 12 г.
  • 45. Быстрая запись • synchronous_commit = on • http://www.postgresql.org/docs/9.2/static/ wal-async-commit.html вторник, 18 декабря 12 г.
  • 46. Что еще можно сделать? • вложенные ключи • join на самом деле есть :-) • sharding • http://ssql-railsconf.herokuapp.com/ вторник, 18 декабря 12 г.
  • 47. Спасибо! @rubynoname @evtuhovich evtuhovich@gmail.com http://blog.evtuhovich.ru/ вторник, 18 декабря 12 г.