fixed mistakes

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