
Артур
28.05.2017
15:21:18
на связанные поля отдельные индексы нужно делать?
Или это по умолчанию индекс?

Darafei
28.05.2017
15:21:49
это можно выяснить прямо в базе, посмотрев, есть ли на них индексы
постгрес невидимых индексов сам не строит

Google

Артур
28.05.2017
15:22:23
Ну то есть получается что связи таблиц не равно индекс
Получается надо добавить индексы по всем связанным полям, чтобы быстрее работало?

Darafei
28.05.2017
15:23:20
Since a DELETE of a row from the referenced table or an UPDATE of a referenced column will require a scan of the referencing table for rows matching the old value, it is often a good idea to index the referencing columns. Because this is not always needed, and there are many choices available on how to index, declaration of a foreign key constraint does not automatically create an index on the referencing columns.
да

Артур
28.05.2017
15:24:39
верно лши я понимаю, что при связи таблиц мне сразу надо и индекс создавать, а не только перед удалением
Чтобы и добавление/обновление записи было быстрее
нет, тупость ляпнул.
По идее тогда родительские таблицы удут по уникальному индексу искаться

عاصم بن حارث
28.05.2017
15:26:13
Индексы - наше все! А правильно подобранные и созданные индексы - теплый сон разраба )))

Артур
28.05.2017
15:28:37
Еще вопрос, удаление в принципе будет редко
1 сек опишу
Правильно ли я сделаю? если будет:
DO
создание временных индексов по связанным таблицам
удаление записей
END

Darafei
28.05.2017
15:30:09

Google

Darafei
28.05.2017
15:31:57

Артур
28.05.2017
15:32:54

Darafei
28.05.2017
15:34:06

عاصم بن حارث
28.05.2017
15:34:12

Артур
28.05.2017
15:34:37

Darafei
28.05.2017
15:36:22
да и без prepared

عاصم بن حارث
28.05.2017
15:37:29
Но, читаешь всякие статьи о тюнинге, оптимизации и всюду лейб мотив,- "правильные идексы" и .т.д. При этом, речь о "основных реализациях серверов БД": оракл, сайбэс, постгре, мускуль )))

Darafei
28.05.2017
15:41:54
все привыкли создавать индексы, и думают, что так и надо

عاصم بن حارث
28.05.2017
15:42:03
Вот и возникает очевидный вопрос: "Сговорились?" Не? Или все-же ищем ответ глубже...

Darafei
28.05.2017
15:42:09
чем это лучше хинтов планировщика?

عاصم بن حارث
28.05.2017
15:43:05
Не готов дать однозначный ответ.

Артур
28.05.2017
15:49:40
Но всеравно долго

Darafei
28.05.2017
15:50:40
а второй раз?

Артур
28.05.2017
15:51:21

Darafei
28.05.2017
15:51:44
ну, вычитать-то всё с винчестера разок надо

Google

Артур
28.05.2017
15:52:49
Еще вопрос
По идее должно быть 7900

Darafei
28.05.2017
15:53:32
Seq Scan вычитал всю таблицу и почти всю её выкинул

Артур
28.05.2017
15:54:01

Darafei
28.05.2017
15:55:10
да, у тебя 402680 строк в таблице с locality != 1 и 7797 c locality = 1

Артур
28.05.2017
15:56:20
А, ну понял. Короче он 402680 исключил из удаления
Спасибо большое. Теперь работает как субд, а не как XML файл :)
В плане скорости
@Komzpa напомни пожалуйста правило составления навзания индекса
idx_{table}_{index fields} ?

Darafei
28.05.2017
18:25:28
idx в конце

Артур
28.05.2017
18:28:26
ясно
спасибо

عاصم بن حارث
28.05.2017
18:34:04
https://habrahabr.ru/post/203386/
https://www.postgresql.org/docs/current/static/sql-createindex.html

Darafei
28.05.2017
19:11:09

عاصم بن حارث
28.05.2017
19:12:45
??

Denis
29.05.2017
02:05:08
подскажите, как правильно удалять индекс в нагруженной запросами таблице? по идее должен помочь drop index concurrently, но он вешает ShareUpdateExclusiveLock, что тоже крайне неприятно.
то есть я правильно понимаю, что пока висит drop index concurrently, автовакуум не придет в таблицу? и кстати, как оно вообще работает под капотом? оно может долго висеть и мне интересно, какие условия необходимы, чтобы оно выполнилось
все, я страшно тупил - у коллеги висел AccessShare лок на таблицу, поэтому drop concurrently и не выполнялся. всем спасибо

Google

Артур
29.05.2017
04:50:52
Вопрос как натуральную сортировку делать?
В ответах везде regexp_replace используются. М.б. есть проще решение?

Igor
29.05.2017
04:54:03
https://pgxn.org/dist/pg_natural_sort_order/
разве проще?)

Артур
29.05.2017
04:57:04
С кирилицей рабоатет?

Igor
29.05.2017
04:59:46
судя по исходникам, должен

Admin
ERROR: S client not available

Артур
29.05.2017
05:16:37
она для 9,5
Говорит следующее: Server is version 9.6, library is version 9.5.
http://www.postgresql-archive.org/Natural-sort-order-td5082405.html
Нечто страшное есть, но не производиельное судя по общению
Больше ничего не нашел
Нужно то как:
2
2А
3
4
..
22
Вот такая конструкция title::bytea более менее нормально отдает.
Но опять же буквы ниже цифр.
Ну и 12 выше 2 почемуто

Darafei
29.05.2017
05:29:51
оно их по байтам сортирует. откуда там быть natural?

Артур
29.05.2017
05:31:05
Это я понял, но почему 12 выше 2
Вот это озадачило
в числе 12 байт меньше чем в 2
?

Google

Igor
29.05.2017
05:32:50
ээ..
title - это строка

Leonid
29.05.2017
05:33:12
сорян

Igor
29.05.2017
05:33:12
байтик, отвечающий за символ "1", находится раньше, чем байтик, отвечающий за символ "2"

Артур
29.05.2017
05:34:50
?
спасибо


Konstantin
29.05.2017
07:55:02
всем привет, кто-нибудь может подсказать - в запросе вывожу несколько полей, в том числе 2 поля count(). таблицы через left join. Проблема: count выводит неправильно, он их перемножает между собой и выводит результат в оба поля.
запрос :
select
inc.incident_time::date as data,
inc.incident_time::time as time,
inc.id as incidentId,
emp.id as employeeId,
emp.login as login,
emp.description as description,
COALESCE(inc.hurt_number, 0) as countHurt,
count(work.incident) as countWork,
count(service.incident) as countService,
string_agg(distinct gos.short_title, '; ') as service
from incident as inc
left join employee as emp on inc.employee = emp.id
left join incident_work_off as work on work.incident = inc.id
left join incident_gos_service as service on inc.id=service.incident
left join gos_service as gos on service.gos_service = gos.id
where incident_time between '2017-04-10 00:00:00' and '2017-05-25 23:59:59.999'
group by incidentId, employeeId
order by incidentId asc
count work и countService перемножаются между собой и выводится результат в оба поля
по отдельности, если убрать эти поля и join-ы на них - все норм


Darafei
29.05.2017
08:00:44
Count считает в итоговом результате
Считай до join-a, например
и джойни два подзапроса


Denis
29.05.2017
08:09:55
всем привет, кто-нибудь может подсказать - в запросе вывожу несколько полей, в том числе 2 поля count(). таблицы через left join. Проблема: count выводит неправильно, он их перемножает между собой и выводит результат в оба поля.
запрос :
select
inc.incident_time::date as data,
inc.incident_time::time as time,
inc.id as incidentId,
emp.id as employeeId,
emp.login as login,
emp.description as description,
COALESCE(inc.hurt_number, 0) as countHurt,
count(work.incident) as countWork,
count(service.incident) as countService,
string_agg(distinct gos.short_title, '; ') as service
from incident as inc
left join employee as emp on inc.employee = emp.id
left join incident_work_off as work on work.incident = inc.id
left join incident_gos_service as service on inc.id=service.incident
left join gos_service as gos on service.gos_service = gos.id
where incident_time between '2017-04-10 00:00:00' and '2017-05-25 23:59:59.999'
group by incidentId, employeeId
order by incidentId asc
Я вообще удивлён, что запрос работает. В полях, по которым идёт группировка, нет data,time, login, description и counthurt - почему оно не ругается при разборе, кстати?


Konstantin
29.05.2017
08:12:21

Lev
29.05.2017
08:14:33
А ожидается, что под одним select'ом 2 вызова функции count без distinct вернут разный результат?

Darafei
29.05.2017
08:15:25
если в полях есть null'ы, то вернут. но тут явно не тот случай.

Konstantin
29.05.2017
08:20:14