homework, pet project DE Dmitry_Medvedev #1

Open
dmitry_medvedev wants to merge 264 commits from md_branch into main
7 changed files with 36 additions and 39 deletions
Showing only changes of commit 297df348c1 - Show all commits
+3 -3
View File
@@ -46,13 +46,13 @@ WHERE EXTRACT(YEAR FROM created_at) = 2026
AND LOWER(country) = 'россия'
AND age + 10 > 35;
CREATE INDEX users_lower_country_idx ON users (LOWER(country));
SELECT id, name, age
FROM users
WHERE
created_at >= '2026-01-01' AND created_at < '2027-01-01'
AND country IN ('россия', 'Россия', 'РОССИЯ')
AND LOWER(country) = 'россия'
AND age > 25;
Исправлено: выдача колонок "все" заменено на "определенные", логика в where с числами переработана, соответствие определенному году переработано и убрал функцию LOWER.
Исправлено: Добавлен индекс, который приведет все строки данного столбца в нижний регистр и дальнейший поиск будет производиться только по индексу.
+4 -4
View File
@@ -12,7 +12,7 @@ WHERE id = 1;
-- Строка означает фильтрацию столбца по индексу, который есть в столбце id.
Почему база использует индекс, а не читает всю таблицу?
--В моем случае БД читает всю таблицу, но обычно если индексы расставлены верно и таблица больших размеров, то БД лучше использовать индексы для повышенной производительности.
--Потому что по полю есть индекс и таким образом оптимизатор ускоряет чтение.
----------
--Задача 2 — Seq Scan vs Index Scan
@@ -33,13 +33,13 @@ WHERE id = 1;
--Задача 4 — До и после индекса
Запиши Execution Time и тип сканирования.
--Seq Scan, 0.059 мс, после создания индекса запрос составил 0.026мс
--Index Scan, 0,06 мс после создания индекса.
Изменился ли тип сканирования?
-- Нет, не изменился, не могу понять почему.
-- да, изменился.
Стал ли запрос быстрее? На сколько?
--Да, в 2 раза
--Да, в 21 раза
Почему индекс помог?
--Потому что не пришлось искать по всей таблице.
+1 -1
View File
@@ -278,7 +278,7 @@
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE u.country = 'Россия'
GROUP BY u.name, u.age
GROUP BY u.id, u.name, u.age
ORDER BY orders_count DESC;
Второй запрос через JOIN выполняется быстрее (0.13 и 0.1 мс соответственно)
+1 -1
View File
@@ -200,4 +200,4 @@
В чём выгода индекса и где он не поможет
Индекс помогает искать данные быстрее (индекс это как содержание в книге) за счет плана в виде дерева.
Индекс не поможет в тех столбцах, где уникальность данных мала, а также где есть сортировка по знакам >, < или поиск по части строки = "%abc".
Индекс не поможет в тех столбцах, где уникальность данных мала, а также где есть сортировка по части строки, например "%abc" или если индекс не по функции .
+2 -2
View File
@@ -7,9 +7,9 @@
**Нужно:**
- указать, какие свойства ACID здесь особенно важны и почему;
АТОМАРНОСТЬ, ДЮРАБИЛИТИ (ОТСУТСТВУЕТ НАДЕЖНОСТЬ У ДАННОЙ ТРАНЗАКЦИИ), СОГЛАСОВАННОСТЬ - НЕЛЬЗЯ ПРОВЕСТИ ОДНУ ОПЕРАЦИЮ И ЗАСЧИТАТЬ ЕЕ ДВАЖДЫ.
СОГЛАСОВАННОЙ ЧЕРЕЗ УНИКАЛЬНЫЙ КЛЮЧ ОБНАРУЖИВАЕТ ПОВТОРНЫЙ ЗАПРОС, А АТОМАРНОСТЬ ГАРАНТИРУЕТ, ЧТО ЭТА НЕУДАВШАЯСЯ ПОПЫТКА НЕ ИЗМЕНИТ БАЛАНС
- описать, какие проблемы могут возникнуть, если этих свойств не будет (например, нет атомарности или изолированности).
ЕСЛИ ЭТИХ СВОЙСТВ НЕ БУДЕТ, ТО ПРОИЗОЙДУТ ОШИБКИ, ДВА ОДИНАКОВЫХ ЗАПРОСА ИЛИ НЕИСПОЛНЕНИЕ ЗАПРОСА ВООБЩЕ.
ЕСЛИ ЭТИХ СВОЙСТВ НЕ БУДЕТ, ТО ПРОИЗОЙДУТ ОШИБКИ, ДВА ОДИНАКОВЫХ ЗАПРОСА ИЛИ НЕИСПОЛНЕНИЕ ЗАПРОСА ВООБЩЕ.
- **Задание 2. Лента новостей и лайки**
+4 -2
View File
@@ -21,7 +21,7 @@ Greenplum ↔ PXF ↔ Hive Metastore
1. Где реально хранятся данные?
ЖАННЫЕ ХРАНЯТСЯ В ХРАНИЛИЩЕ HIVE.
2. Можно ли писать обратно в Hive?
ДА, КОНЕЧНО.
НЕТ, НЕЛЬЗЯ.
3. Что если структура таблицы в Hive изменилась?
В ТАКОМ СЛУЧАЕ ПРИ ЗАПРОСЕ МОГУТ БЫТЬ ОШИБКИ ИЛИ ПУСТЫЕ СТОЛБЦЫ СО ЗНАЧЕНИЯМИ, ТАК КАК GREENPLUM НИКАКИМ ОБРАЗОМ НЕ СМОЖЕТ УСЗНАТЬ КАКИЕ ИЗМЕНЕНИЯ ПРОИЗОШЛИ. ПОЭТОМУ НЕОБХОДИМО ПЕРЕСОЗДАТЬ ВНЕШНЮЮ ТАБЛИЦУ ПУТЕМ УДАЛЕНИЯ И СОЗДАНИЯ.
@@ -47,4 +47,6 @@ Greenplum ↔ PXF ↔ S3
1. Данные копируются в Greenplum?
НЕТ, ДАННЫЕ НЕ КОПИРУЮТСЯ.
2. Что быстрее: EXTERNAL или `CREATE TABLE AS SELECT`?
CREATE TABLE AS SELECT БЫСТРЕЕ, НО МЕНЕЕ ЭФФЕКТИВНЕЕ В ДОЛГУЮ, ТАК КАК РАСХОДУЮТСЯ ОБЪЕМЫ ПАМЯТИ И ДОП МОЩНОСТИ.
ВСЕ ЗАВИСИТ ОТ ЦЕЛЕЙ.
ДЛЯ РАЗОВОГО ИСПОЛЬЗОВАНИЯ МОЖНО ВЫБРАТЬ EXTERNAL, СОЗДАНИЕ ТАБЛИЦЫ БУДЕТ ПРАКТИЧЕСКИЕ МОМЕНТАЛЬНЫМ ПОТОМУ ЧТО СОЗДАЕТСЯ ПРОСТО ССЫЛКА НА ТАБЛИЦУ, А ВОТ ЧТЕНИЕ БУДЕТ НЕ ОЧЕНЬ ЭФФЕКТИВНЫМ.
ДЛЯ МНОГОКРАТНОГО ИСПОЛЬЗОВАНИЯ ЛУЧШЕ ВЫБРАТЬ CTAS, ХОТЬ МЫ И ДОЛГО КОПИРУЕМ (СОЗДАЕМ) ТАБЛИЦУ, ЗАТО ПОСЛЕДУЮЩИЕ ЧАСТЫЕ ОБРАЩЕНИЯ БУДУТ ПРОИСХОДИТЬ ГОРАЗДО БЫСТРЕЕ ЧЕМ ПРИ EXTERNAL.
+21 -26
View File
@@ -1,48 +1,43 @@
--Добавление raw-таблиц в GREENPLUM
CREATE TABLE raw.pet_users
(
id INT PRIMARY KEY NOT NULL,
name VARCHAR(50) NOT NULL,
id INT,
name VARCHAR(50),
age INT,
email VARCHAR(100) NOT NULL,
registration_date DATE NOT NULL
email VARCHAR(100),
registration_date DATE
);
CREATE TABLE raw.pet_courses
(
id INT PRIMARY KEY NOT NULL,
title VARCHAR(100) NOT NULL,
category VARCHAR(50) NOT NULL,
created_at DATE NOT NULL
id INT,
title VARCHAR(100),
category VARCHAR(50),
created_at DATE
);
CREATE TABLE raw.pet_lessons
(
id INT PRIMARY KEY NOT NULL,
course_id INT NOT NULL,
FOREIGN KEY (course_id) REFERENCES raw.pet_courses (id),
id INT,
course_id INT,
title VARCHAR(50),
duration_min INT NOT NULL
duration_min INT
);
CREATE TABLE raw.pet_enrollments
(
id INT PRIMARY KEY NOT NULL,
user_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES raw.pet_users (id),
course_id INT NOT NULL,
FOREIGN KEY (course_id) REFERENCES raw.pet_courses (id),
enrolled_at DATE NOT NULL
id INT,
user_id INT,
course_id INT,
enrolled_at DATE
);
CREATE TABLE raw.pet_lesson_views
(
id INT PRIMARY KEY NOT NULL,
user_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES raw.pet_users (id),
lesson_id INT NOT NULL,
FOREIGN KEY(lesson_id) REFERENCES raw.pet_lessons (id),
viewed_at TIMESTAMPTZ NOT NULL
id INT,
user_id INT,
lesson_id INT,
viewed_at TIMESTAMPTZ
);
--Создание core-таблиц (измерений - dimension) в GREENPLUM
@@ -105,12 +100,12 @@ CREATE TABLE core.enrollments
INSERT INTO core.dim_user
(user_id, name, age, email, registration_date)
SELECT DISTINCT
user_id::INT,
id::INT,
name::TEXT,
age::INT,
email::TEXT,
registration_date::DATE
FROM raw.users;
FROM raw.pet_users;
--переброска для dim_course
INSERT INTO core.dim_course