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 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" или если индекс не по функции .
+1 -1
View File
@@ -7,7 +7,7 @@
**Нужно:**
- указать, какие свойства ACID здесь особенно важны и почему;
АТОМАРНОСТЬ, ДЮРАБИЛИТИ (ОТСУТСТВУЕТ НАДЕЖНОСТЬ У ДАННОЙ ТРАНЗАКЦИИ), СОГЛАСОВАННОСТЬ - НЕЛЬЗЯ ПРОВЕСТИ ОДНУ ОПЕРАЦИЮ И ЗАСЧИТАТЬ ЕЕ ДВАЖДЫ.
СОГЛАСОВАННОЙ ЧЕРЕЗ УНИКАЛЬНЫЙ КЛЮЧ ОБНАРУЖИВАЕТ ПОВТОРНЫЙ ЗАПРОС, А АТОМАРНОСТЬ ГАРАНТИРУЕТ, ЧТО ЭТА НЕУДАВШАЯСЯ ПОПЫТКА НЕ ИЗМЕНИТ БАЛАНС
- описать, какие проблемы могут возникнуть, если этих свойств не будет (например, нет атомарности или изолированности).
ЕСЛИ ЭТИХ СВОЙСТВ НЕ БУДЕТ, ТО ПРОИЗОЙДУТ ОШИБКИ, ДВА ОДИНАКОВЫХ ЗАПРОСА ИЛИ НЕИСПОЛНЕНИЕ ЗАПРОСА ВООБЩЕ.
+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