fixed mistakes
This commit is contained in:
@@ -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.
|
Исправлено: Добавлен индекс, который приведет все строки данного столбца в нижний регистр и дальнейший поиск будет производиться только по индексу.
|
||||||
|
|
||||||
|
|||||||
@@ -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 раза
|
||||||
|
|
||||||
Почему индекс помог?
|
Почему индекс помог?
|
||||||
--Потому что не пришлось искать по всей таблице.
|
--Потому что не пришлось искать по всей таблице.
|
||||||
|
|||||||
@@ -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 мс соответственно)
|
||||||
@@ -200,4 +200,4 @@
|
|||||||
В чём выгода индекса и где он не поможет
|
В чём выгода индекса и где он не поможет
|
||||||
|
|
||||||
Индекс помогает искать данные быстрее (индекс это как содержание в книге) за счет плана в виде дерева.
|
Индекс помогает искать данные быстрее (индекс это как содержание в книге) за счет плана в виде дерева.
|
||||||
Индекс не поможет в тех столбцах, где уникальность данных мала, а также где есть сортировка по знакам >, < или поиск по части строки = "%abc".
|
Индекс не поможет в тех столбцах, где уникальность данных мала, а также где есть сортировка по части строки, например "%abc" или если индекс не по функции .
|
||||||
|
|||||||
@@ -7,9 +7,9 @@
|
|||||||
**Нужно:**
|
**Нужно:**
|
||||||
|
|
||||||
- указать, какие свойства ACID здесь особенно важны и почему;
|
- указать, какие свойства ACID здесь особенно важны и почему;
|
||||||
АТОМАРНОСТЬ, ДЮРАБИЛИТИ (ОТСУТСТВУЕТ НАДЕЖНОСТЬ У ДАННОЙ ТРАНЗАКЦИИ), СОГЛАСОВАННОСТЬ - НЕЛЬЗЯ ПРОВЕСТИ ОДНУ ОПЕРАЦИЮ И ЗАСЧИТАТЬ ЕЕ ДВАЖДЫ.
|
СОГЛАСОВАННОЙ ЧЕРЕЗ УНИКАЛЬНЫЙ КЛЮЧ ОБНАРУЖИВАЕТ ПОВТОРНЫЙ ЗАПРОС, А АТОМАРНОСТЬ ГАРАНТИРУЕТ, ЧТО ЭТА НЕУДАВШАЯСЯ ПОПЫТКА НЕ ИЗМЕНИТ БАЛАНС
|
||||||
- описать, какие проблемы могут возникнуть, если этих свойств не будет (например, нет атомарности или изолированности).
|
- описать, какие проблемы могут возникнуть, если этих свойств не будет (например, нет атомарности или изолированности).
|
||||||
ЕСЛИ ЭТИХ СВОЙСТВ НЕ БУДЕТ, ТО ПРОИЗОЙДУТ ОШИБКИ, ДВА ОДИНАКОВЫХ ЗАПРОСА ИЛИ НЕИСПОЛНЕНИЕ ЗАПРОСА ВООБЩЕ.
|
ЕСЛИ ЭТИХ СВОЙСТВ НЕ БУДЕТ, ТО ПРОИЗОЙДУТ ОШИБКИ, ДВА ОДИНАКОВЫХ ЗАПРОСА ИЛИ НЕИСПОЛНЕНИЕ ЗАПРОСА ВООБЩЕ.
|
||||||
|
|
||||||
- **Задание 2. Лента новостей и лайки**
|
- **Задание 2. Лента новостей и лайки**
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user