Skip to content

Планы исполнения запросов в БД

Sayapin Alexander edited this page Jan 13, 2017 · 15 revisions

В данном работе поговорим о запросах на выборку данных в системах управления базами данных. Будет рассмотрено выполнение запросов на примере баз данных, поддерживающих SQL.

SQL-запрос - это текстовое описание набора данных, которые требуется получить от БД, и преобразований над ними. СУБД анализирует текст SQL-запроса и определяет какие действия необходимо выполнить для получения результата.

План исполнения запроса в СУБД - это последовательность действий, которые необходимо выполнить, чтобы получить результат запроса. План выполнения - это не список, а дерево действий. Действия расположенные в узлах дерева получают входные данные как результат выполнения действий в их потомках. Результатов выполнения всего запроса является выполнение действия из корня дерева. Таким образом, для получения результата необходимо рекурсивно выполнять действия в узлах дерева в глубину(сначала потомки, потом предок).

SQL - это декларативный язык, то есть описывает, что необходимо получить, но не описывает какие действия надо выполнять и в какой последовательности.

Таким образом, к получению одинакового результата приводят разные последовательности действий. Например, можно сначала отсортировать некоторое множество данных(строк), а потом отфильтровать ненужные. Или наоборот: сначала отфильтровать, а потом отсортировать результат. Результат действий будет идентичным, однако затраты на выполнение будут различными.

Пример плана исполнения запроса

Источник:https://sqlperformance.com

Чаще всего разработчики обращаются к планам исполнения с целью оптимизации запросов, чтобы снизить расходы на их выполнение. Однако, те данные, которые видит разработчик с целью оптимизации - это только часть данных, которая составляет план выполнения.

Текущая задача, поставленная в данной работе, - это разобраться с тем, как построить план исполнения запроса из элементарных операций, описать эти элементарные операции и провести связь между планами выполнения запросов(операциями) и запросами в виде SQL.

Оптимизация запросов - большая и сложная тема. Оптимизация запросов не ставится целью в данной работе и будет рассмотрена только в дополнительных материалах.

При рассмотрении (пока) не будем касаться следующих тем:

  • использование индексов
  • первичные и вторичные ключи
  • типы и оптимизации объединения
  • операторы и функции для вычислений

Из чего состоит план запроса

Прежде всего необходимо описать этапы выполнения запроса.

  1. СУБД анализует текст запроса
  2. СУБД строит план выполнения
  3. СУБД определяет где данных хранятся на физическом носителе
  4. СУБД выбирает данные с физического носителя
  5. СУБД формирует первичный объект хранения данных (ResultSet) 5.1) Если необходимо СУБД читает данные из зависимых таблиц
  6. СУБД производит преобразования над множеством данных (фильтрация, сортировка, агрегация и т.д.)
  7. СУБД формирует результирующий объект хранения данных (ResultSet)

Мы рассматриваем реляционные БД поэтому в качестве элементов данных у нас будут:

  • таблицы
  • кортежи(строки)
  • атрибуты(столбцы)
  • типы данных каждого столбца

Физическое хранение данных

Для начала в качестве физического представления данных на носителе будем использовать CSV-файлы. Первая строка файла будет представлять собой набор столбцов(атрибутов). Последующие строки представляют данные.

Множество данных (ResultSet)

ResultSet - представляет собой результат выполнения операции или всего запроса в целом. В связи с тем, что используются реляционные СУБД, то ResultSet может быть представлен в виде таблицы с некоторым набором столбцов и строк.

При первичном чтении с носителя ResultSet содержит столбцы и данные из CSV-файла. После выполнения запроса столбцы могут быть добавлены, удалены или переименованы.

Фильтрация

Фильтры могут быть зависимы от данных, например, id > 10. А могут быть наложены на результат целиком, например, получить не более 10 записей.

Описание типов элементов в плане

  • Подготовка источника данных
  • Получение кортежа из источника данных
  • Преобразование кортежа (добавление, удаление и переименование столбцов)
  • Преобразования над данными
  • Сортировка данных
  • Ограничение на количество данных (LIMIT)

Существуют и другие элементы, которые должны быть записаны в план выполнения. Например,сохранения результата в отдельную таблицу или буфер на диске.

Элементы можно разделить на 2 типа:

  • потоковые
  • требующие полного множества данных

Потоковые элементы

Элементы которые не имеют зависимости между строк. Данные элементы могут быть применены к каждой строке по отдельности, например, фильтр или чтение строки из файла.

Элементы требующие полного результирующего множества (result set)

Данные элементы имеют зависимость между строками результата, например, сортировка. То есть, для того чтобы провести сортировку данных необходимо получить все данные, а уже потом сортировать их.

Существуют элементы, которые можно приписать и к потоковым и к требующим полного выходного множества, например, агрегация и группировки.

Пример простого плана выполнения

Для начала напишем реализацию простого запроса на Java без использования отдельных операций. Просто опишем в виде последовательности действий.

Запрос имеет вид:

SELECT id, name, surname
FROM person
WHERE id > 20
LIMIT 10

Напишем простой класс для выборки данных по данным критериям и с данными преобразованиями.

package simple;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SimpleQuery {
    public List<Map<String,String>> processData() throws IOException {
        List<Map<String,String>> result = new ArrayList<>();

        try (BufferedReader br = new BufferedReader(new FileReader(new File("src/main/resources/data/person.csv")))) {
            String[] headers = br.readLine().split(";");

            String row;

            long lines = 0;
            do {
                if (lines >= 10) {
                    break;
                }

                row = br.readLine();

                System.out.println("Row:"+row);

                if (row != null && !"".equals(row.trim())) {
                    String[] values = row.split(";");

                    long id = Long.parseLong(values[0]);

                    if (id > 20) {
                        Map<String, String> resultMap = new HashMap<>();

                        for (int i=0;i<headers.length;i++) {
                            resultMap.put(headers[i], values[i]);
                        }

                        result.add(resultMap);

                        lines++;
                    }
                }
            } while (row != null);
        }

        return result;
    }
}

Реализуем тест, который проверяет правильность работы класса

package simple;

import java.util.List;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;

public class SimpleQueryTest {

    @Test
    public void testProcessData() throws Exception {
        SimpleQuery sq = new SimpleQuery();

        List<Map<String, String>> result = sq.processData();

        Assert.assertNotNull(result);
        Assert.assertEquals(10, result.size());

        Assert.assertEquals("21", result.get(0).get("id"));
        Assert.assertEquals("25", result.get(4).get("id"));
        Assert.assertEquals("30", result.get(9).get("id"));

        Map<String, String> sampleRow = result.get(0);

        Assert.assertEquals(5, sampleRow.size());

        Assert.assertTrue(sampleRow.containsKey("id"));
        Assert.assertTrue(sampleRow.containsKey("name"));
        Assert.assertTrue(sampleRow.containsKey("surname"));
        Assert.assertTrue(sampleRow.containsKey("department_id"));
        Assert.assertTrue(sampleRow.containsKey("create_date"));
    }
}

Код выполняет свою функцию, но данный метод смешивает условия, обработку результатов и низкоуровневую работу с хранилищем данных. Кроме того, в случае изменения критериев необходимо переписывать весь код целиком.

Попробуем реализовать те же функции, но разделив обработку на этапы. Выделим следующие этапы:

  • работу с хранилищем данных
  • ограничение на количество строк в результирующем множестве (LIMIT 10)
  • ограничение по ID (id > 20)
  • формирование выходного объекта

Разработка классов для построения плана выполнения запроса в CSV-файл

1

SELECT *
FROM person
SELECT *
FROM person
LIMIT 10
SELECT id, name, surname
FROM person
LIMIT 10
SELECT id, name, surname
FROM person
ORDER BY create_date DESC 
LIMIT 10
SELECT id, name, surname
FROM person
WHERE id=23
SELECT *
FROM person, department
SELECT *
FROM person AS p, department AS d
WHERE p.department_id=d.id
SELECT *
FROM person AS p, department AS d
WHERE p.department_id=d.id
 AND d.name LIKE 'auc%'
SELECT t.id, t.text, s.name, t.person_id, p.name, p.surname, d.name
FROM task AS t,
 person AS p,
 department AS d,
 status AS s
WHERE t.person_id=p.id
 AND p.department_id=d.id
 AND t.status=s.id
 AND d.name LIKE 'auc%'
 AND p.create_date > '2016-01-01'
 AND s.name LIKE 'test%'
 AND t.create_date > '2017-01-01'

Преобразование из SQL в план исполнения запроса

Дополнительные материалы

Оптимизация плана выполнения

Стоимость исполнения запроса

Исходные данные для тестов

department.csv

Департаменты - ...

Имя Тип Описание
id Число Идентификатор департамента. Первичный ключ.
name Строка Название департамента.
id;name
1;tristique
2;lacinia
3;auctor
4;ultrices mauris ipsum
5;magnis dis parturient
6;in
7;aliquet molestie tellus
8;Donec
9;dolor vitae dolor
10;quam, elementum at

person.csv

Пользователи - ...

Имя Тип Описание
id - -
name - -
surname - -
department_id - -
create_date - -
id;name;surname;department_id;create_date
1;Cyrus;Ramos;9;2017-06-14
2;Quinn;Duran;4;2017-03-12
3;Timon;Hughes;3;2016-04-09
4;Deacon;Murray;7;2016-03-06
5;Lawrence;Solomon;2;2016-10-03
6;Travis;Wolfe;1;2016-07-18
7;Austin;Hartman;5;2016-12-20
8;Armando;Gray;8;2016-04-04
9;Stewart;Kane;4;2017-07-24
10;Andrew;Logan;8;2017-03-15
11;Hector;Kinney;6;2017-10-20
12;Chaney;Glenn;7;2016-04-11
13;Justin;Barr;4;2016-03-11
14;Melvin;Ward;7;2016-11-17
15;Caesar;Cantrell;5;2016-07-15
16;Harlan;Sweet;2;2017-02-08
17;Elliott;Boyer;3;2016-08-19
18;Kareem;Hammond;4;2017-08-19
19;Jackson;Koch;3;2016-05-02
20;Ronan;Harper;9;2016-04-16
21;Kuame;Copeland;10;2017-07-24
22;Jeremy;Beck;1;2017-10-16
23;Martin;Justice;1;2017-11-25
24;Holmes;Jacobson;7;2017-09-14
25;Malik;Foley;1;2016-09-24
26;Axel;Diaz;10;2017-08-26
27;Hall;Orr;6;2016-07-25
28;Levi;Nguyen;2;2017-05-24
29;Robert;Mckay;10;2017-04-27
30;Kirk;Casey;2;2016-07-20
31;Zachary;Charles;8;2016-11-10
32;Vladimir;Robbins;1;2016-05-23
33;Damian;Larsen;2;2017-02-07
34;Sebastian;Beach;4;2017-08-18
35;Fritz;Garza;6;2016-02-07
36;Dale;Sears;7;2016-04-25
37;Jerome;Townsend;9;2017-08-19
38;Paul;Sparks;1;2016-03-01
39;Bradley;Long;6;2017-03-25
40;Jakeem;Hampton;1;2016-05-24
41;Mohammad;Travis;9;2017-10-27
42;Allistair;Scott;9;2016-04-22
43;Flynn;Ortiz;1;2016-01-24
44;Hakeem;Blanchard;4;2017-05-09
45;Callum;Peters;10;2016-08-30
46;Micah;Ingram;9;2017-12-24
47;Cade;Norton;8;2018-01-07
48;Rooney;Walters;4;2016-04-17
49;Burton;Meadows;3;2016-01-21
50;Jonas;Obrien;6;2017-01-04
51;Kasper;Hutchinson;2;2017-12-05
52;Magee;Walter;1;2016-12-13
53;Ryder;Cruz;1;2017-01-24
54;Damon;Ross;2;2017-02-10
55;Igor;Joyner;6;2016-10-03
56;Palmer;Knowles;1;2017-12-27
57;Connor;Shannon;5;2017-04-18
58;Bernard;Guzman;1;2017-01-15
59;Hunter;Bauer;8;2016-03-18
60;Byron;Barr;4;2016-03-08
61;Kamal;Hubbard;8;2016-09-15
62;Jerome;Gallegos;5;2016-02-18
63;Lars;Yates;1;2016-09-30
64;Adrian;Garner;2;2016-07-29
65;Noble;Bell;9;2017-03-18
66;Dennis;Nolan;1;2016-01-28
67;Cairo;Key;2;2016-10-30
68;Axel;Mcknight;4;2017-03-26
69;Amos;Cantu;10;2017-10-27
70;Thaddeus;Boyd;2;2016-06-03
71;Lucas;Bradshaw;2;2017-08-13
72;Otto;Bridges;2;2017-12-07
73;Perry;Short;7;2017-05-13
74;David;Sharpe;2;2017-02-16
75;Dean;Underwood;4;2017-05-08
76;Cyrus;Cleveland;9;2016-05-12
77;Emmanuel;Medina;6;2016-12-15
78;Dillon;Floyd;3;2017-02-10
79;Price;Riddle;6;2017-05-10
80;Colt;Stevens;1;2017-02-12
81;Walker;Conway;3;2016-02-07
82;Nathan;Contreras;4;2016-02-18
83;Caleb;Nash;9;2017-05-22
84;Griffith;Chaney;3;2016-05-26
85;Beau;Price;1;2016-05-03
86;Rigel;Maynard;3;2017-08-15
87;Keane;Preston;7;2016-05-08
88;Zeus;Oneal;2;2016-09-09
89;Harlan;Rojas;7;2016-07-28
90;Colin;Schroeder;10;2017-04-13
91;Cadman;Beard;1;2016-03-31
92;Dalton;Campbell;10;2016-06-09
93;Troy;Duffy;1;2018-01-08
94;Talon;Bradshaw;8;2016-10-20
95;Thane;Mullen;2;2016-02-03
96;Cade;Hammond;8;2016-11-17
97;Stewart;Rodgers;6;2016-04-05
98;Fitzgerald;Randolph;10;2017-07-10
99;David;Zimmerman;9;2016-08-31
100;Wallace;Spence;2;2017-07-05

status.csv

Статусы задач

id;name
1;draft
2;progress
3;testing
4;completed
5;deleted

task.csv

Задачи - ...

id;person_id;text;status;create_date
1;1;a, arcu. Sed et libero. Proin mi. Aliquam gravida mauris ut mi. Duis;3;2016-05-07 05:24:35
2;38;dis parturient montes, nascetur ridiculus mus. Aenean eget magna. Suspendisse tristique neque venenatis lacus. Etiam bibendum fermentum metus. Aenean sed pede nec ante blandit viverra. Donec tempus, lorem fringilla ornare placerat, orci lacus;4;2017-03-23 11:29:37
3;34;ultrices a, auctor non, feugiat nec,;2;2016-02-26 11:34:24
4;4;Duis at lacus. Quisque purus sapien, gravida non, sollicitudin a, malesuada id,;5;2016-08-23 08:55:13
5;28;mollis nec, cursus a, enim. Suspendisse aliquet, sem ut cursus luctus, ipsum leo elementum sem, vitae aliquam eros turpis non enim. Mauris quis turpis vitae purus gravida sagittis. Duis;5;2016-11-28 01:34:56
6;84;varius. Nam porttitor scelerisque neque. Nullam nisl. Maecenas malesuada fringilla est. Mauris eu turpis. Nulla aliquet. Proin velit. Sed malesuada augue ut lacus. Nulla tincidunt, neque vitae semper egestas,;1;2016-03-30 04:23:57
7;20;erat neque non quam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam fringilla cursus purus. Nullam scelerisque neque;2;2017-11-01 12:31:41
8;54;Mauris molestie pharetra nibh. Aliquam ornare,;1;2016-08-01 03:27:21
9;42;ac orci. Ut semper pretium neque. Morbi quis urna. Nunc quis arcu vel quam dignissim pharetra. Nam ac nulla. In;5;2016-11-07 05:56:04
10;15;commodo ipsum. Suspendisse non;1;2016-10-22 12:56:10
11;94;est. Mauris eu turpis. Nulla aliquet. Proin velit.;4;2016-05-12 01:08:07
12;90;felis. Nulla tempor augue ac ipsum. Phasellus vitae mauris sit amet lorem semper auctor. Mauris vel turpis. Aliquam adipiscing lobortis risus. In mi pede, nonummy ut, molestie in, tempus eu, ligula. Aenean euismod mauris eu;5;2017-09-18 08:44:27
13;90;est arcu ac orci. Ut semper pretium neque. Morbi quis urna. Nunc quis arcu vel quam dignissim pharetra. Nam ac nulla. In tincidunt congue turpis. In condimentum. Donec at arcu. Vestibulum ante ipsum primis in faucibus;4;2017-10-22 10:11:24
14;72;consectetuer, cursus et, magna. Praesent interdum ligula eu enim. Etiam imperdiet dictum magna. Ut tincidunt orci quis lectus. Nullam suscipit,;3;2017-06-14 09:58:24
15;92;sodales at, velit. Pellentesque ultricies dignissim lacus. Aliquam rutrum lorem ac risus. Morbi metus. Vivamus euismod urna. Nullam lobortis quam a felis ullamcorper viverra. Maecenas iaculis aliquet diam. Sed diam lorem, auctor quis,;3;2016-05-18 05:48:27
16;95;vitae velit egestas lacinia. Sed congue, elit sed consequat auctor, nunc nulla vulputate dui, nec tempus mauris erat eget ipsum. Suspendisse sagittis. Nullam vitae;4;2016-10-13 05:21:03
17;8;magna a neque. Nullam ut nisi a odio semper cursus. Integer mollis. Integer tincidunt aliquam arcu. Aliquam;4;2016-08-01 09:21:37
18;2;Quisque ornare tortor at risus. Nunc ac sem ut;1;2016-09-06 09:36:47
19;27;rutrum urna, nec luctus felis purus ac tellus. Suspendisse sed dolor. Fusce mi lorem, vehicula et, rutrum eu, ultrices sit amet,;5;2017-07-05 08:31:14
20;80;facilisis lorem tristique aliquet. Phasellus fermentum convallis ligula. Donec luctus aliquet odio. Etiam ligula tortor, dictum eu, placerat eget, venenatis a, magna. Lorem ipsum dolor sit amet, consectetuer adipiscing;3;2017-11-13 02:02:13
21;42;magna. Nam ligula elit, pretium et, rutrum non, hendrerit id, ante. Nunc mauris sapien, cursus in, hendrerit consectetuer, cursus et, magna. Praesent interdum ligula eu enim. Etiam imperdiet dictum magna. Ut tincidunt orci quis lectus. Nullam suscipit, est ac facilisis facilisis, magna tellus faucibus leo, in lobortis;5;2017-03-04 05:50:49
22;54;luctus aliquet odio. Etiam ligula tortor, dictum eu, placerat eget, venenatis;5;2017-04-27 06:36:55
23;54;vehicula. Pellentesque tincidunt tempus;4;2017-12-02 05:12:34
24;92;Ut tincidunt vehicula risus. Nulla eget metus eu erat semper rutrum. Fusce dolor quam, elementum at, egestas a, scelerisque sed, sapien. Nunc pulvinar arcu et pede. Nunc sed orci lobortis augue scelerisque mollis. Phasellus libero mauris, aliquam;4;2017-07-25 05:26:57
25;36;orci. Ut sagittis lobortis mauris. Suspendisse aliquet molestie;3;2017-03-05 12:16:42
26;66;sed pede. Cum;2;2017-03-30 07:36:56
27;39;Pellentesque tincidunt tempus risus. Donec egestas. Duis ac arcu. Nunc mauris. Morbi non sapien molestie orci tincidunt adipiscing. Mauris molestie pharetra nibh. Aliquam ornare, libero at auctor ullamcorper, nisl;3;2016-07-23 03:42:21
28;24;imperdiet nec, leo. Morbi neque tellus, imperdiet non, vestibulum nec, euismod in, dolor. Fusce feugiat. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam auctor, velit eget laoreet;1;2016-01-28 01:52:46
29;63;auctor, nunc nulla vulputate dui, nec tempus;1;2017-03-11 06:27:46
30;77;nibh enim, gravida sit amet, dapibus id, blandit at, nisi. Cum sociis natoque penatibus;4;2017-06-29 08:49:20
31;82;pede ac urna. Ut tincidunt vehicula risus. Nulla eget metus eu erat semper rutrum. Fusce dolor quam, elementum at, egestas a, scelerisque sed, sapien. Nunc pulvinar;5;2017-07-15 07:04:58
32;22;mauris, aliquam eu, accumsan sed, facilisis vitae, orci. Phasellus dapibus quam quis diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce aliquet magna a neque. Nullam;2;2016-04-05 05:59:03
33;84;interdum. Curabitur dictum. Phasellus in felis. Nulla tempor augue ac ipsum. Phasellus vitae mauris sit amet lorem semper auctor. Mauris vel turpis. Aliquam adipiscing lobortis risus. In mi pede, nonummy ut, molestie in,;5;2016-01-17 05:35:46
34;5;hendrerit a, arcu. Sed et libero. Proin mi. Aliquam gravida;2;2017-06-20 07:24:23
35;63;molestie tellus. Aenean egestas hendrerit neque. In ornare sagittis felis. Donec tempor, est ac mattis semper, dui lectus rutrum urna, nec luctus felis purus ac tellus. Suspendisse sed dolor. Fusce mi lorem, vehicula et, rutrum eu, ultrices sit amet,;4;2017-03-15 10:12:21
36;45;sed dolor. Fusce mi lorem, vehicula et, rutrum eu, ultrices sit amet,;1;2017-11-18 07:50:37
37;100;a purus. Duis elementum, dui quis accumsan convallis, ante lectus convallis est, vitae sodales nisi magna sed dui. Fusce aliquam, enim nec;1;2017-05-03 11:44:29
38;76;Cras dictum ultricies ligula. Nullam enim. Sed nulla ante, iaculis nec, eleifend non, dapibus rutrum, justo. Praesent luctus. Curabitur egestas nunc sed libero. Proin sed turpis nec mauris blandit mattis. Cras eget nisi dictum augue malesuada malesuada. Integer id magna et;5;2016-09-06 01:25:02
39;88;nulla ante, iaculis nec, eleifend non, dapibus rutrum, justo. Praesent luctus. Curabitur egestas nunc sed libero. Proin sed turpis nec mauris blandit mattis. Cras eget nisi dictum augue malesuada malesuada. Integer id magna et ipsum cursus vestibulum. Mauris magna. Duis dignissim tempor arcu. Vestibulum ut eros non;2;2017-02-23 04:58:29
40;44;a mi fringilla mi lacinia mattis. Integer eu lacus. Quisque imperdiet, erat nonummy ultricies ornare, elit elit fermentum risus, at fringilla purus mauris a nunc. In at pede. Cras vulputate velit eu sem. Pellentesque ut ipsum ac mi;1;2016-03-10 05:25:14
41;69;magna. Suspendisse tristique neque venenatis lacus. Etiam bibendum fermentum metus. Aenean sed pede nec ante blandit;2;2017-12-09 11:38:23
42;61;malesuada fringilla est. Mauris eu turpis. Nulla aliquet. Proin velit. Sed malesuada augue ut lacus. Nulla tincidunt, neque vitae semper egestas, urna justo faucibus lectus, a sollicitudin orci sem eget massa. Suspendisse eleifend. Cras sed leo. Cras vehicula aliquet libero. Integer in magna. Phasellus dolor elit, pellentesque a, facilisis;4;2016-05-05 09:57:18
43;100;amet risus.;3;2017-09-15 03:52:59
44;54;fermentum metus. Aenean sed pede nec ante blandit viverra. Donec tempus, lorem fringilla ornare placerat, orci lacus vestibulum lorem, sit amet ultricies sem magna nec quam. Curabitur vel lectus. Cum sociis natoque penatibus et magnis dis;1;2016-03-04 12:40:48
45;73;dolor. Quisque tincidunt pede ac;5;2017-05-14 02:09:38
46;61;in faucibus orci;4;2016-06-14 08:40:52
47;29;blandit viverra. Donec tempus, lorem fringilla ornare placerat, orci lacus vestibulum lorem, sit amet ultricies sem magna nec quam. Curabitur vel lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec dignissim magna a tortor. Nunc commodo auctor velit. Aliquam;5;2018-01-02 08:49:39
48;55;Nulla interdum. Curabitur dictum. Phasellus in felis. Nulla tempor augue ac ipsum. Phasellus vitae mauris sit amet lorem semper auctor. Mauris vel turpis. Aliquam adipiscing lobortis risus. In mi pede, nonummy ut, molestie in, tempus eu, ligula. Aenean euismod mauris eu elit. Nulla facilisi. Sed neque. Sed;4;2016-06-19 09:28:49
49;86;Aliquam ultrices iaculis odio.;3;2017-07-03 12:46:34
50;46;et, euismod et, commodo at, libero. Morbi accumsan laoreet ipsum. Curabitur consequat, lectus sit amet luctus vulputate, nisi sem semper erat, in consectetuer ipsum nunc id enim. Curabitur massa.;5;2017-01-17 05:40:25
51;71;Duis a mi fringilla mi lacinia mattis. Integer eu lacus. Quisque imperdiet, erat nonummy ultricies ornare, elit elit fermentum risus, at fringilla purus mauris a nunc. In at pede. Cras vulputate velit eu sem. Pellentesque ut ipsum ac mi eleifend egestas. Sed pharetra, felis eget varius ultrices, mauris;4;2017-01-13 08:13:33
52;48;rutrum, justo. Praesent luctus. Curabitur egestas nunc sed libero. Proin;5;2016-07-02 11:02:10
53;26;pharetra, felis eget varius ultrices, mauris ipsum porta elit, a feugiat tellus lorem eu metus. In lorem. Donec elementum, lorem ut aliquam iaculis, lacus pede sagittis augue, eu tempor erat neque non quam. Pellentesque habitant morbi tristique senectus et netus;1;2016-02-08 10:23:32
54;30;"Curae; Donec tincidunt. Donec vitae erat vel pede blandit congue. In scelerisque scelerisque dui. Suspendisse ac metus vitae velit egestas lacinia. Sed congue, elit sed consequat auctor, nunc nulla vulputate dui, nec tempus mauris erat eget ipsum. Suspendisse sagittis. Nullam vitae diam.";2;2017-05-29 12:13:21
55;89;elementum,;2;2016-09-17 02:44:37
56;87;augue. Sed molestie. Sed id risus quis diam luctus lobortis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Mauris ut quam vel sapien imperdiet ornare. In faucibus. Morbi vehicula. Pellentesque;4;2017-07-25 02:26:11
57;21;natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin vel arcu eu odio tristique pharetra. Quisque ac libero;5;2017-11-04 02:07:40
58;97;congue. In scelerisque scelerisque dui. Suspendisse ac metus vitae velit egestas lacinia. Sed congue, elit sed consequat auctor, nunc nulla vulputate dui,;5;2016-06-16 06:06:13
59;92;massa. Mauris vestibulum, neque sed dictum eleifend, nunc risus varius orci, in consequat enim diam vel arcu. Curabitur ut odio vel est tempor bibendum. Donec felis orci, adipiscing non, luctus;5;2017-09-17 03:15:33
60;77;Quisque fringilla euismod;1;2016-05-30 10:47:38
61;70;sollicitudin a, malesuada id, erat. Etiam vestibulum massa rutrum magna. Cras convallis convallis dolor. Quisque tincidunt pede ac urna. Ut tincidunt vehicula risus. Nulla eget metus;5;2016-10-10 03:31:52
62;40;metus sit amet ante. Vivamus non lorem vitae odio sagittis semper. Nam tempor diam dictum sapien. Aenean massa. Integer vitae nibh. Donec est mauris, rhoncus id, mollis nec, cursus a, enim. Suspendisse aliquet, sem ut cursus luctus, ipsum leo elementum sem,;3;2016-07-07 08:17:38
63;38;placerat eget, venenatis a, magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam laoreet, libero et tristique pellentesque, tellus sem mollis;2;2017-09-16 02:09:16
64;35;pharetra. Quisque ac libero nec ligula consectetuer rhoncus. Nullam velit dui, semper et, lacinia vitae, sodales at, velit. Pellentesque ultricies dignissim lacus. Aliquam rutrum lorem ac risus. Morbi metus. Vivamus euismod;1;2017-01-13 06:27:26
65;71;vel lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec dignissim magna a tortor. Nunc commodo auctor velit. Aliquam nisl. Nulla eu neque pellentesque massa lobortis ultrices. Vivamus rhoncus. Donec est. Nunc ullamcorper, velit in aliquet lobortis,;5;2017-11-13 08:26:03
66;6;nulla. Cras eu tellus eu augue porttitor interdum. Sed auctor odio a purus. Duis elementum, dui quis accumsan convallis, ante lectus convallis est, vitae;2;2016-07-20 09:18:14
67;100;aliquet. Phasellus fermentum convallis ligula. Donec luctus aliquet odio. Etiam ligula tortor, dictum eu, placerat eget, venenatis a, magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam laoreet, libero et tristique pellentesque, tellus sem mollis dui, in sodales elit erat vitae risus.;5;2016-04-15 06:45:19
68;32;tincidunt,;5;2016-03-14 02:42:31
69;34;gravida. Praesent eu nulla at;5;2017-10-21 07:09:37
70;17;pede, nonummy ut, molestie in, tempus eu, ligula. Aenean euismod mauris eu elit. Nulla facilisi. Sed neque. Sed eget lacus. Mauris non dui nec urna suscipit nonummy. Fusce fermentum fermentum;5;2017-09-10 02:55:03
71;12;egestas blandit. Nam nulla magna, malesuada vel, convallis in, cursus et, eros. Proin ultrices. Duis volutpat nunc sit amet metus. Aliquam erat volutpat. Nulla facilisis. Suspendisse commodo tincidunt nibh. Phasellus nulla. Integer vulputate, risus a ultricies adipiscing, enim mi tempor lorem, eget mollis lectus pede et risus.;3;2016-12-03 05:40:08
72;11;quam. Curabitur vel lectus. Cum;5;2016-06-11 09:59:05
73;48;Morbi sit amet massa. Quisque porttitor eros nec tellus. Nunc lectus pede, ultrices a, auctor non, feugiat nec, diam. Duis mi enim, condimentum eget, volutpat ornare, facilisis eget,;3;2017-12-20 05:46:54
74;74;quis accumsan convallis, ante lectus convallis est, vitae sodales nisi magna sed dui. Fusce aliquam, enim nec tempus scelerisque, lorem ipsum sodales purus, in molestie tortor nibh sit amet;2;2016-11-10 11:31:39
75;43;Suspendisse sagittis.;3;2017-05-05 08:47:59
76;34;nulla vulputate dui, nec tempus mauris erat eget ipsum. Suspendisse sagittis. Nullam vitae diam. Proin dolor. Nulla;2;2016-11-23 05:14:25
77;39;pellentesque massa lobortis ultrices. Vivamus rhoncus. Donec est. Nunc ullamcorper, velit in aliquet lobortis, nisi nibh lacinia orci, consectetuer euismod est arcu ac orci. Ut;4;2017-11-25 08:12:09
78;54;commodo tincidunt nibh. Phasellus nulla. Integer vulputate, risus a ultricies adipiscing, enim mi tempor lorem, eget mollis lectus pede et risus. Quisque libero;5;2016-09-10 07:18:22
79;24;consectetuer mauris id sapien. Cras dolor dolor, tempus non, lacinia at, iaculis quis, pede. Praesent eu dui. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean eget magna. Suspendisse tristique neque venenatis lacus. Etiam bibendum fermentum metus. Aenean sed pede nec ante;1;2017-05-22 06:03:53
80;95;et risus. Quisque libero lacus, varius et, euismod et, commodo at, libero. Morbi accumsan laoreet ipsum. Curabitur consequat,;4;2016-02-20 02:29:30
81;43;tempor augue ac ipsum. Phasellus vitae mauris sit amet lorem semper auctor. Mauris vel turpis. Aliquam adipiscing lobortis risus. In mi pede, nonummy ut, molestie in, tempus eu, ligula. Aenean euismod mauris eu elit. Nulla facilisi. Sed neque. Sed;5;2017-07-09 06:41:06
82;49;vulputate eu, odio. Phasellus at augue id ante dictum cursus.;2;2017-04-12 10:34:31
83;44;nec, eleifend non, dapibus rutrum, justo. Praesent luctus. Curabitur egestas nunc sed libero. Proin sed;3;2016-05-08 02:45:55
84;22;nec tempus scelerisque, lorem ipsum sodales purus, in molestie tortor nibh sit amet orci. Ut sagittis lobortis mauris. Suspendisse aliquet molestie tellus. Aenean egestas hendrerit neque.;5;2017-04-22 12:20:16
85;83;magna, malesuada vel, convallis in, cursus et, eros. Proin ultrices. Duis volutpat nunc sit amet metus. Aliquam;2;2016-07-27 12:42:05
86;33;Cras interdum. Nunc sollicitudin commodo ipsum. Suspendisse;5;2016-05-01 05:44:09
87;49;"arcu vel quam dignissim pharetra. Nam ac nulla. In tincidunt congue turpis. In condimentum. Donec at arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec";2;2017-11-03 09:14:12
88;32;et magnis dis parturient montes, nascetur ridiculus mus. Donec dignissim magna a tortor. Nunc commodo auctor velit. Aliquam nisl. Nulla eu neque;1;2016-03-26 08:53:49
89;87;magna. Suspendisse tristique neque venenatis lacus. Etiam bibendum fermentum metus. Aenean sed pede nec ante;3;2016-07-08 12:40:47
90;100;vitae odio sagittis;5;2017-04-12 08:06:39
91;39;non, feugiat nec, diam. Duis mi enim, condimentum eget, volutpat ornare, facilisis eget, ipsum. Donec sollicitudin;5;2016-02-28 05:21:40
92;92;Curabitur dictum. Phasellus in felis. Nulla tempor augue ac ipsum. Phasellus vitae mauris sit amet lorem semper auctor.;3;2017-05-15 01:03:44
93;49;semper rutrum. Fusce dolor quam,;1;2017-06-15 07:32:27
94;41;Nam ligula elit, pretium et, rutrum non, hendrerit id, ante. Nunc mauris sapien, cursus in, hendrerit consectetuer, cursus et, magna. Praesent interdum ligula eu enim. Etiam imperdiet dictum magna. Ut tincidunt orci quis lectus. Nullam suscipit, est ac facilisis facilisis, magna tellus faucibus leo, in lobortis tellus justo sit;5;2016-02-15 11:51:41
95;85;dapibus id, blandit at, nisi. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin vel nisl. Quisque fringilla;5;2016-10-20 12:31:16
96;10;nisi. Cum sociis natoque penatibus et magnis dis parturient montes,;1;2017-07-24 12:12:32
97;54;volutpat ornare, facilisis eget, ipsum. Donec sollicitudin adipiscing ligula. Aenean gravida nunc sed pede. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin vel arcu eu odio tristique;1;2016-12-31 07:18:15
98;64;lacus. Aliquam rutrum lorem ac risus. Morbi metus. Vivamus euismod urna. Nullam lobortis quam a felis ullamcorper viverra. Maecenas iaculis aliquet diam. Sed diam lorem, auctor quis, tristique ac, eleifend vitae, erat. Vivamus nisi. Mauris nulla. Integer urna. Vivamus molestie dapibus ligula. Aliquam erat volutpat. Nulla dignissim. Maecenas ornare egestas;4;2016-10-13 01:03:16
99;76;Duis ac arcu.;1;2017-12-06 09:13:55
100;60;tempus mauris erat eget ipsum. Suspendisse sagittis. Nullam vitae diam. Proin dolor. Nulla semper tellus id nunc interdum feugiat. Sed nec metus facilisis lorem tristique aliquet. Phasellus fermentum convallis ligula. Donec luctus aliquet odio. Etiam ligula tortor, dictum eu, placerat eget, venenatis a, magna. Lorem ipsum dolor sit amet,;5;2017-05-03 11:30:31
Clone this wiki locally