LINUX.ORG.RU

Сообщения polin11

 

Создать индекс для рекурсивного запроса

Форум — General

Иcпользую PostreSQL, есть рекурсивный запрос в таблице Document для получение записей вниз по иерархии, идентификатор в таблице @Document. Поле Hierarchy ссылка на идентификатор родительской записи.

EXPLAIN (ANALYZE,BUFFERS)
        WITH  RECURSIVE 
                hier_down AS(
                    SELECT
                       h."@Document",
                       h."Hierarchy",
                       h."Hint"
					   FROM "Document" h
                       WHERE
                          "@Document" = 13
                    UNION all
                    SELECT
                        "Document" ."@Document",
                         "Document" ."Hierarchy",
                         "Document"."Hint"
                    FROM hier_down, "Document" 
                    WHERE   "Document"."Hierarchy" =  hier_down."@Document"
                )
SELECT *
FROM hier_down

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

"CTE Scan on hier_down  (cost=783.59..861.41 rows=3891 width=44) (actual time=0.008..0.748 rows=5 loops=1)"
"  Buffers: shared hit=281"
"  CTE hier_down"
"    ->  Recursive Union  (cost=0.28..783.59 rows=3891 width=76) (actual time=0.007..0.745 rows=5 loops=1)"
"          Buffers: shared hit=281"
"          ->  Index Scan using "pDocument" on "Document" h  (cost=0.28..8.29 rows=1 width=76) (actual time=0.006..0.006 rows=1 loops=1)"
"                Index Cond: ("@Document" = 13110)"
"                Buffers: shared hit=3"
"          ->  Hash Join  (cost=0.33..69.75 rows=389 width=76) (actual time=0.044..0.143 rows=1 loops=5)"
"                Hash Cond: ("Document"."Hierarchy" = hier_down_1."@Document")"
"                Buffers: shared hit=278"
"                ->  Seq Scan on "Document"  (cost=0.00..62.66 rows=766 width=76) (actual time=0.003..0.061 rows=766 loops=5)"
"                      Buffers: shared hit=275"
"                ->  Hash  (cost=0.20..0.20 rows=10 width=4) (actual time=0.002..0.002 rows=1 loops=5)"
"                      Buckets: 1024  Batches: 1  Memory Usage: 9kB"
"                      ->  WorkTable Scan on hier_down hier_down_1  (cost=0.00..0.20 rows=10 width=4) (actual time=0.000..0.000 rows=1 loops=5)"
"Planning time: 0.336 ms"
"Execution time: 0.786 ms"

Хочется избавиться от seq scan Есть индекс по полю Hierarchy - он не используется Есть составной индекс (Hierarchy, @Document ) - он не используется

сделал индекс

CREATE INDEX "Hier"
ON "Document" USING btree
("Hierarchy" NULLS LAST, "@Document" NULLS LAST, "Hint" NULLS LAST);
он используется, но перестает использоваться когда добавляется новое поле в SELECT, приходится добавлять новое поле в индекс.

Как бы создать индекс, на который не влиял бы набор полей в SELECT?

 ,

polin11
()

Создать табличку при помощи unnest

Форум — General

Использую СУБД Postgresql, unnest для создания временной таблицы

 SELECT UNNEST('{"10","20"}'::varchar[]) "Ключ",
                   UNNEST('{103,101}'::bigint[]) "Документ"

Получаю таблицу из 2 столбцов Ключ и Документ к которым можно обращаться, нужно добавить еще один столбец Массив
            SELECT UNNEST('{"10","20"}'::varchar[]) "Ключ",
                   UNNEST('{103,101}'::bigint[]) "Документ",
                   UNNEST(ARRAY[1,3], ARRAY[4,5]) "Массив"

но к сожалению так просто не получается сделать, просьба поделиться секретом написания такого запроса

 

polin11
()

Помощь в изменении структуры БД

Форум — General

Использую PostgreSQL 11.

Есть таблица USERS 2 млн. записей

 
CREATE TABLE USERS (
  id INT NOT NULL,
  name VARCHAR(30) NOT NULL
);
INSERT INTO USERS 
    (id, name) 
VALUES 
    (1,'John'),
    (2,'Mike'),
    (3,'John');

также есть таблица для реализации связей внутри таблицы USERS 15 мнл. записей, по факту храним 2 числа: ид.записи, ид.свзяи.

CREATE TABLE LINKS (
  id INT NOT NULL,
  id_rec INT NOT NULL,
  id_link INT NOT NULL
);
INSERT INTO LINKS 
    (id, id_rec, id_link) 
VALUES 
    (1,1, 2),
    (2,1,3),
    (3,1, 4); 

Причем связь односторонняя, то есть связей всего 5000, к которым привязаны от 2 записей до 2 млн. записей, Джойнить эти 2 таблицы стало сложно, долго по времени и по ресурсам.

Хочу узнать мнения по оптимальному изменению структуры таблиц, может быть сделать таблицу на 5000 связей, которым указать идентификаторы в виде массива.

Может кто-то сталкивался с похожей проблемой?

 

polin11
()

Выполнить запрос 1 раз, но получать записи по кускам

Форум — General

Использую PostgreSQL, есть большая таблица несколько миллионов записей, для примера

CREATE TABLE towns ( id INTEGER PRIMARY KEY, name CHARACTER VARYING(30), root INTEGER );

INSERT INTO towns VALUES (1, ‘Berlin’, 1);

INSERT INTO towns VALUES (2, ‘Rome’, 2);

INSERT INTO towns VALUES (3, ‘Paris’, 1);

INSERT INTO towns VALUES (1, ‘Turin’, 2);

Нужно используя курсоры в Postgresql написать запрос, получить все записи отсортированные по root, выполнить запрос 1 раз, а получать по значению root

https://postgrespro.ru/docs/postgres...lpgsql-cursors

 ,

polin11
()

Как запретить в триггере вставку пустого jsonb

Форум — General

СУБД Postgresql, нужно в триггере запретить вставку в поле пустого ‘{}’::jsonb

Пробовал что-то подобное, но не работает

BEGIN

IF NEW.«Param» = ‘{}’::jsonb THEN

  DELETE FROM "Table1" WHERE "Key" = NEW."Key";

  RETURN NULL;

END IF;

RETURN NEW;

END;

 ,

polin11
()

Инициализация членов класса

Форум — General

Подскажите ответ на вопрос, не смог ничего нагуглить

Where do you initialize a non-static class member that is a reference?

  1. Point of declaration only

  2. Member initialization list only

  3. Point of declaration and member initialization list

  4. Member initialization list and body of constructor

  5. Body of constructor only

 

polin11
()

Запрос с использованием массива

Форум — General

Использую СУБД PostgreSQL. Для примера, есть таблица 1 столбец - имя владельца 2 столбец - название авто

CREATE TABLE cars (
  id INT NOT NULL,
  name VARCHAR(30) NOT NULL,
  car VARCHAR(30)
);

INSERT INTO cars 
    (id, name, car) 
VALUES 
    (1,'John', 'BMW'),
    (2,'Mike', 'BMW'),
    (3,'John', 'OPEL'),
    (3,'John', 'KIA')
Есть набор названий авто ['BMW', 'KIA'], нужно найти владельцев, которые владели всеми этими авто. Придумал 2 варианта реализации:
SELECT name
FROM cars
WHERE car =  'BMW'
INTERSECT
SELECT name
FROM cars
WHERE car =  'KIA'
Либо
SELECT name
FROM cars
WHERE car =  ANY(ARRAY['BMW', 'KIA'])
GROUP BY name
HAVING COUNT(name) = 2
Вопрос, есть ли другие более оптимальные и простые варианты реализации

 ,

polin11
()

PostgreSQL и обратный слэш

Форум — General

В PostgreSQL есть прекрасная функция quote_literal, при помощи нее оборачиваю строи из PostgreSQL, заем эти данные идут для вставки в СУБД SQLite.

Проблема возникла если в строке обратный слэш:

select quote_literal(‘\AA’)

я получаю

E’\AA’

из-за префикса E, такие данные не вставляются в SQLite

Вопрос, как избавиться от этого префикса, не удаляя бэк слэш из данных?

 ,

polin11
()

Предупреждение pylint Unused variable

Форум — Development

Предупреждение pylint Unused variable

Есть некоторое действие, которое нужно повторить N раз, например вывести слово python, пример

def f(n):
    for i in range(n):
        print('python')

f(10)
Но при проверке pylint есть предупреждение, Unused variable 'i' (unused-variable)

Как решить такую проблему?

 

polin11
()

Индекс для сортировки

Форум — General

СУБД PostgreSQL, таблица Документы первичный ключ Документ, поле Код типа text. Есть запрос

SELECT s.*
FROM "Документы" s
where "Документ" = ANY(ARRAY[807830, 807831, 807832, 807833, 807834, 807835, 807836, 807837, 807838, 807839
])
ORDER BY
s."Код"

Создал индекс

CREATE INDEX "index_sort"
	ON "Документы" USING btree
	("Документ" NULLS LAST, "Код" text_pattern_ops NULLS LAST);

Но почему-то планировщик его не использует, делал VACUUM, REINDEX, используется индекс по первичному ключу, план такой:

"Sort  (cost=48.74..48.77 rows=10 width=174) (actual time=0.061..0.062 rows=10 loops=1)"
"  Sort Key: "Код"
"  Sort Method: quicksort  Memory: 26kB"
"  Buffers: shared hit=31"
"  ->  Index Scan using "pДокумент" on "Документы" s  (cost=0.42..48.58 rows=10 width=174) (actual time=0.013..0.025 rows=10 loops=1)"
"        Index Cond: ("Документ" = ANY ('{807830,807831,807832,807833,807834,807835,807836,807837,807838,807839}'::integer[]))"
"        Buffers: shared hit=31"
"Planning time: 0.168 ms"
"Execution time: 0.077 ms"

Как заставить планировщик использовать индекс?

 ,

polin11
()

Сортировка в запросе по массиву

Форум — General

Есть массив значений [4,6,5,1] некоторого поля.

Получаем записи со значениями из этого массива. [code] select * from T where Filed1=ANY(ARRAY[4,6,5,1]) [/code]

Вопрос:

Нужно чтобы записи были в том порядке в котором значения в массиве, то есть Запись1 со значением 4 Запись2 со значением 6 Запись3 со значение 5 Запись4 со значением 1

Можно использовать UNION c каждым значением по отдельности

[code] select * from T where Filed1=4 …. union select * from T where Filed1=1 [/code]

Вопрос: Можно ли добиться такой сортировки без использования UNION(UNION ALL), может быть ORDER BY

 

polin11
()

GitLab узнать разницу между веткой и тэгом, исключив один коммит

Форум — General

В GitLab при создании ветки master, создается тэг tag_master. В процессе работы в master сливаются другие ветки, когда нужно узнать какие файлы были изменены в master берем diff между веткой и тэгом, типа

git diff –name-only tag_master

Вопрос: есть одна ветка (any_branch_master состоит из 1 коммита), которую слили в master(она там должна быть). Мне нужно получить diff между master и tag_master, но исключив из списка файлы измененные в any_branch_master, как это сделать?

 , , ,

polin11
()

Получение набора записей по курсору

Форум — General

СУБД Postgresql есть таблица с городами и странами.

CREATE TABLE T (
  id INTEGER,
  town_country VARCHAR (255),
  is_country bool
) ;--DEFAULT CHARSET=utf8 ;

INSERT INTO T
  (id, town_country, is_country)
VALUES
  (1, 'Франция', true),
  (2, 'Германия', true),
  (4, 'Россия',  true),
  (5, 'Канада', true),
  (6, 'Бельгия',  true),
  (7, 'Беларусь', true),
  (8, 'Австралия', true),
  (9, 'Япония', true),
  (10, 'Афины', null),
  (11, 'Брюссель', null),
  (12, 'Барселона', null)
Отсортированный список
SELECT *
FROM T
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST
Австралия Беларусь Бельгия Германия Канада Россия Франция Япония Афины Брюссель Барселона

Нужно написать несколько запросов, которые возвращают по 5 записей из этого списка. Начиная со 2 запроса, нужно в условие запроса передать последнюю запись, найденную в предыдущем запросе.

Первый запрос без условия:

SELECT *
FROM T
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST
LIMIT 5
Получаем набор, все ОК:

Австралия Беларусь Бельгия Германия Канада

https://www.db-fiddle.com/f/SpTXQTSprkMr3syfk6DSE/0

Берем последнюю запись - Канада, нужно получить следующие 5 записей, которые находятся в списке под Канадой, например так

Второй запрос:

SELECT *
FROM T
where town_country > 'Канада'
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST
 LIMIT 5
 
https://www.db-fiddle.com/f/39cbZdNmr4HzVzsS1mnfxy/0

Проблема: возвращается только 3 записи (Россия, Франция, Япония), из-за использования сортировки is_country DESC NULLS LAST

Третим запросом нужно вернуть одну запись: Барселона

Как правильно написать 2 и 3 запросы, оставив такую сортировку, во 2 запросе нужно использовать последнюю запись из 1 запроса, в 3 запросе нужно использовать последнюю запись из 2 запроса?

 

polin11
()

Заархивировать папку с нужной кодировкой

Форум — General

Создаю архив в Windows os.system(«C:\Program Files\7-Zip\7z.exe» a FILE.zip D:\data*) при извлечении файлов из архива, имена файлов корректно отображаются (предположительно кодировка utf-8).

Решил использовать zip.ZipFile() или shutil.make_archive() при попытке получить имена файлов из архива, они в непонятной кодировке. Вопрос: можно ли при формировании архива через zip.ZipFile() или shutil.make_archive() указать кодировку имен файлов в архиве?

 

polin11
()

Python создать архив под linux

Форум — General

Создаю архив в Windows

os.system(«C:\Program Files\7-Zip\7z.exe» a FILE1.zip D:\data*)

Нужно сделать тоже самое под CentOS 7, не хочется устанавливать CentOS 7, правильно ли я понимаю, что нужно по аналогии указать путь до установленного архиватора 7z.exe и путь к каталогу, что-то типа?

os.system(«/home/7-Zip/7z.exe» a FILE1.zip /home/UserName/desktop/data*)

Знатоки linux подскажите пожалуйста

 ,

polin11
()

Неиспользуемые индексы

Форум — General

Использую СУБД Postgresql. Есть много запросов, при помощи, которых можно узнать какие индексы не используются: например

SELECT relname, indexrelname, idx_scan
FROM   pg_catalog.pg_stat_user_indexes
WHERE  schemaname = 'public' and idx_scan = 0;
Мне не понятно за какой промежуток времени отображается такая статистика, за все время использования этой БД? Мне было бы интересно узнать эту информацию начиная с определенной даты, например неделю назад я переписал SQL запросы, хочу с этой даты узнать какие индексы перестали использоваться, как это сделать?

 ,

polin11
()

Идентификаторы при вставке записей Postgresql

Форум — General

Использую СУБД PostgreSQL, вставляю записи в таблицу Контакты, поле Контакт - поле c id. Вставку делаю записей при помощи PGCOPY. Вставляемые записи являются частью иерархического списка, у каждой записи есть поле Родитель - id родителя. Я получаю массив id вставляемых записей:

SELECT array_agg(nextval(seq)) «arr»

FROM generate_series(1, 10 ), pg_get_serial_sequence(«Контакты», «Контакт») seq

затем заполняю поле Родитель из полученного массива id и через PGCOPY вставляю записи. Все хорошо работает, но если между получением массива id и вставкой записей, будет добавлена левая запись при помощи INSERT, то будет использован id из массива и иерархия нарушится. Вопрос такой: есть ли возможность в PostgreSQL забронировать некоторый диапазон id, то есть я получаю массив id, этот массив бронируется и при последующей вставке через INSERT с автоинкриментом id из этого массива не используются.

 ,

polin11
()

Работа с массивами данных

Форум — General

Субд SQLite. Есть массив строк [ 'one', 'two'], нужно получить элементы, которых нет в таблице, что-то типа такого

with T as(select 'one', 'two')

select * from T

EXCEPT

select field from Table Where field In (select * from T)

но это не работает SELECTs to the left and right of EXCEPT do not have the same number of result columns

 

polin11
()

SQL запрос с массивами

Форум — General

Использую СУБД postgresql. Помогите написать запрос. Есть 3 массива со значениями 3 полей таблицы A[a1,a2], B[b1,b2], C[c1,c2] соответственно. Есть запрос:

SELECT *
FROM T
WHERE Field1 = a1 AND Field2 = b1 AND Field3 = c1
UNION
SELECT *
FROM T
WHERE Field1 = a2 AND Field2 = b2 AND Field3 = c2
То есть нужно найти все записи, значения полей которых равны наборам из массивов (a[N],b[N],c[N]). Если массивы большие размером, не хочется лепить запрос через UNION, он выполняется долго и размер этого запроса большой. Может быть можно сократить, что-то типа такого
SELECT *
FROM T
WHERE Field1 = ANY(ARRAY[a1,a2,a3]) AND Field2 = ANY(ARRAY[b1,b2,b3]) AND Field3 = ANY(ARRAY[c1,c2,c3])
Но в таком виде запрос работает неверно, возвращает записи в полях которых входит хотя бы одно значение массива из каждого массива.

 , ,

polin11
()

Update с использованием рекурсивного запроса

Форум — General

Использую postgresql. Есть иерархическая таблица, поле с иерархией parent_id, нужно заполнить level - уровень вложенности, hier - строка с названиями родителями (исключая корень таблицы), root - значения корня иерархии (если у предка в поле new_root = true, то у потомков в поле root должен быть id этого предка). Пример можно посмотреть https://www.db-fiddle.com/f/ezdc4n5ivhHrHk6rDJgZUo/0

Посоветуйте, как можно улучшить запрос???

 , ,

polin11
()

RSS подписка на новые темы