Задать вопрос
  • Как сделать DELETE с вложенным SELECT`ом?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Исторически mysql сообщает об ошибке синтаксиса начиная с того места, где эта ошибка случилась.
    Т.е. парсер mysql не умеет использовать алиас таблицы для delete запросов.

    Или, как следует из документации
    Table aliases in a multiple-table DELETE should be declared only in the table_references part of the statement. Elsewhere, alias references are permitted but not alias declarations.

    Возможно сделать вырожденный случай мультитабличного удаления с одной таблицей, тогда алиас для таблицы задать возможно:
    delete t from test as t where t.i = 100;
    Ответ написан
  • Как хранить базу postgres 8.4 в памяти?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Закупаете железку с 256гб ram и выше. Ставите shared_buffers в 200гб. Всё. Со временем все данные к каким обращались будут подтянуты в память. А поскольку буферов больше чем база - база их не будет вытеснять из памяти.

    Можно было бы воспользоваться pg_prewarm для более удобного подтягивания данных в память после старта СУБД - да у вас какая-то ископаемая, давно уже не поддерживаемая версия. pg_prewarm для такой древности нет. (если, конечно, вы не опечатались в 9.4)
    Для такого объёма shared_buffers желательно huge pages сделать по объёму на пару процентов больше чем shared_buffers. А вот как - может для 8.4 и никак, я не настолько старый DBA, не знаю.
    Ответ написан
    4 комментария
  • Выводит id все продуктов по id категории?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    надо выбрать все продукты по category_id

    WHERE product_id =

    Ну в самом же деле?

    Сходите отдохните, погулять или поспать.
    Ответ написан
    4 комментария
  • Как сделать правильно check constraint?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    next_month := date_part( 'year', NEW.dtime)::text ||'-'|| date_part( 'month', NEW.dtime )::text ||'-31';

    Какой удивительно-непроверенный способ выстрелить себе в ногу. Половина года просто не нужна? Ни февраль ни ноябрь?

    При этом же
    table_part := table_master
    || '' || to_char(NOW(), 'YYYY')::text
    || 'm' || to_char(NOW(), 'MM')::text;

    INSERT INTO ' || table_part || '
    Какой дважды отважный способ отстрелить ногу. Дебажить что у вас получается не пробовали в принципе?
    И с чего же это действительно violates check constraint? Вообще не понятно. И вас ничего на насторожило даже в попытке вставить августовские данные в m10 раздел? Ну нельзя же так, в самом деле.

    Про race condition не упоминаю даже, он хотя бы действительно не для всех применений имеет значение.
    Ответ написан
  • Как работать с Ltree?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Это реализация материализованного пути. Ветка удалена если в ней нет элементов. Перенос - перенести каждый элемент. subpath функция в помощь например
    update tablename set tree = concat('newbranch.', subpath(tree, 1))::ltree where tree <@ 'origbranch';
    Ответ написан
    Комментировать
  • Как ограничить поиск в партиции таблицы?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Перепроверил догадку
    melkij=> create table events2016m11 (check (dtime >= '2016-11-01'::date AND dtime < '2016-12-01'::date)) inherits(events);
    melkij=> insert into events2016m11 values ('2016-11-20');
    INSERT 0 1
    melkij=> explain (analyze) select * from events where dtime > '2016-12-05';
                                                       QUERY PLAN                                                   
    ----------------------------------------------------------------------------------------------------------------
     Append  (cost=0.00..38.25 rows=754 width=8) (actual time=0.013..0.013 rows=0 loops=1)
       ->  Seq Scan on events  (cost=0.00..0.00 rows=1 width=8) (actual time=0.004..0.004 rows=0 loops=1)
             Filter: (dtime > '2016-12-05 00:00:00+03'::timestamp with time zone)
       ->  Seq Scan on events2016m11  (cost=0.00..38.25 rows=753 width=8) (actual time=0.009..0.009 rows=0 loops=1)
             Filter: (dtime > '2016-12-05 00:00:00+03'::timestamp with time zone)
             Rows Removed by Filter: 1
     Planning time: 0.127 ms
     Execution time: 0.032 ms
    (8 строк)
    melkij=> drop table events2016m11 ;
    DROP TABLE
    melkij=> create table events2016m11 (check (dtime >= '2016-11-01'::timestamptz AND dtime < '2016-12-01'::timestamptz)) inherits(events);
    CREATE TABLE
    melkij=> insert into events2016m11 values ('2016-11-20');INSERT 0 1
    melkij=> explain (analyze) select * from events where dtime > '2016-12-05';                                              QUERY PLAN                                              
    ------------------------------------------------------------------------------------------------------
     Append  (cost=0.00..0.00 rows=1 width=8) (actual time=0.004..0.004 rows=0 loops=1)
       ->  Seq Scan on events  (cost=0.00..0.00 rows=1 width=8) (actual time=0.004..0.004 rows=0 loops=1)
             Filter: (dtime > '2016-12-05 00:00:00+03'::timestamp with time zone)
     Planning time: 0.301 ms
     Execution time: 0.024 ms
    (5 строк)
    
    melkij=> show constraint_exclusion ;
     constraint_exclusion 
    ----------------------
     partition

    Внимательнее с явным приведением типов. У планировщика достаточно работы и не всё эквивалентное он считает идентичным. К тому же timestamp with timezone и date (без времени вовсе) надо сравнивать аккуратно.
    Ответ написан
    Комментировать
  • Как правильно поставить индексы у MySQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    create index crm_exchanges_bittrex_currencies_market_time_idx on crm_exchanges_bittrex_currencies (MarketName, TimeStamp);
    Ответ написан
    2 комментария
  • Помрёт ли HDD при постоянной работе через USB?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Регулярный старт-стоп нужен для энергосбережения - то есть может быть нужен, не факт что на регулярный старт не будет потрачено больше энергии чем на поддержание постоянной скорости вращения - в зависимости от частоты уходя в сон.
    Для самого диска - исключительно вредно. Количество циклов парковки головок ограничено возможностями механики, старт массивного массива дисков даёт заметную нагрузку на двигатель (в серверах диски не редко сыпятся именно при старте, тогда как 5 минут до выключения были живые), при выключении диск остывает, при старте резко нагревается - а температурные колебания так же вредны для механики. В отличии от поддержания постоянной скорости вращения с примерно постоянной температурой - тепличные условия.

    1) долго ли протянет мой hdd при подключении через sata-usb с учётом того, что он никогда не прекращает вращение?

    Если не помрёт БП вместе с диском - то скорей всего дольше, чем при постоянной старт-стопе.

    2) можно ли получить доступ к данным SMART при таком подключении?

    Зависит от переходника, только экспериментировать.
    Ответ написан
    3 комментария
  • Можно ли сделать такой SQL-запрос?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    select org from tablename group by org having count(distinct active) > 1;
    Ответ написан
    2 комментария
  • Когда имеет смысл делать несколько таблиц с комментариями?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    И получается дико неудобно и значительно медленнее в итоге.
    Не касаясь лимита на число открытых файловых дескрипторов, кучу internal статистики планировщика и прочих деталей реализации.

    Форум. Банальная страница профиля пользователя, достать последние 10 сообщений этого пользователя - как? union all по всем темам с filesort последующим вместо простого index scan по составному ключу даже без необходимости в сортировке?
    Статьи. Показать для модерации последние комментарии

    А распилить большую таблицу (только на самом деле большую, а не в смешные лям строк) на части - вещь неплохая. Только не так надо пилить. Есть у mysql штатное партицирование.
    Ответ написан
    Комментировать
  • Что учить администратору баз данных?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Как человек в этом году неожиданно сменивший деятельность с senior php dev на DBA - хочу задать встречный вопрос:
    а вы вообще видите вакансии на начинающего-студента-DBA? Целую одну или хотя бы даже две? Для увидевшего SQL вот только что студента и уже желающего быть DBA всего через пару месяцев? Человека, который даже не написал, какую именно СУБД ему интересно изучать до уровня DBA?

    Отдельная позиция DBA в проекте - значит ни штатные системные администраторы (со стороны администрирования) ни старшие разработчики (со знанием SQL) уже не обладают достаточными познаниями в используемой СУБД. Но эта БД важна для бизнеса и ищется специалист по ней, который будет обеспечивать хорошую работу этой базы.
    Несколько позиций DBA в кампании чтобы брать стажера - это очень большой проект. Эти могут себе позволить отвлекать своих специалистов от работы и вкладывать деньги в выращивание нового специалиста. Если вы чем-то сильно заинтересуете кампанию.

    Я не знаю как стать DBA с нуля. Похоже DBA становятся только имея за плечами заметный опыт администрирования или разработки.

    Определитесь с конкретной СУБД и прочитайте полностью её мануал. Например мануал postgresql 10 в pdf занимает свыше 3 тысяч страниц A4. На пару месяцев этого уже хватит. А это только мануал. Только по непосредственно СУБД.
    Плюс необходимо знать базовое администрирование той ОС под которой эта СУБД используется (например, я как postgresql dba даже близко не представляю что делать с windows - такая экзотика в жизни не встречается. А вот для MS SQL наверняка необязательно разбираться в linux).
    Плюс теория: реляционная логика, обеспечение транзакционного, конкурентного доступа, восстановление после сбоев
    Плюс практика - активность в профильных сообществах, форумах. Читаете, проверяете, запоминаете, вежливо переспрашиваете в комментариях если вам кажется что предыдущий отвечающий ошибся, отвечаете на вопросы.

    Интересно? Вперёд. Но в DBA за 3 месяца из нулевого студента - не верю.
    Ответ написан
    2 комментария
  • Как посмотреть существующие триггеры событий (Event Trigger, postgresql)?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Они прописываются в системной view pg_event_trigger
    https://www.postgresql.org/docs/9.6/static/catalog...

    В psql есть сокращение \dy выполняющее вот такой запрос:
    SELECT evtname as "Name", evtevent as "Event", pg_catalog.pg_get_userbyid(e.evtowner) as "Owner",
     case evtenabled when 'O' then 'enabled'  when 'R' then 'replica'  when 'A' then 'always'  when 'D' then 'disabled' end as "Enabled",
     e.evtfoid::pg_catalog.regproc as "Procedure", pg_catalog.array_to_string(array(select x from pg_catalog.unnest(evttags) as t(x)), ', ') as "Tags"
    FROM pg_catalog.pg_event_trigger e ORDER BY 1
    Ответ написан
    Комментировать
  • Как правильно написать двойное обновление?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вы сильно заблуждаетесь, если думаете, что ваш cte выполняется последовательно.
    The sub-statements in WITH are executed concurrently with each other and with the main query. Therefore, when using data-modifying statements in WITH, the order in which the specified updates actually happen is unpredictable. All the statements are executed with the same snapshot (see Chapter 13), so they cannot "see" one another's effects on the target tables.

    https://www.postgresql.org/docs/9.6/static/queries...

    Вы выполняете на одном слепке данных одних и тех строк различающиеся действия. Не надо так. Я понятий не имею, какой эффект от этого будет.
    К тому же вы элементарно переписываетесь в один просто запрос
    UPDATE "TABLE1"
    SET
      "Value2" = (NOT EXISTS(
        SELECT NULL
        FROM "TABLE2"
        WHERE "что-то" = "кое-что"
    )
          AND NOT EXISTS(
        SELECT NULL
        FROM "TABLE3"
        WHERE "что-то" = "кое-что"
    ))
    WHERE "кое-что" = ANY ($1 :: INT [])
    Ответ написан
    Комментировать
  • На чем делать кластер postgres?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Для начала задаёте себе и отвечаете на вопрос "зачем?"
    Потому что геморроя, проблем и граблей очень много. Бонусы - сомнительны. Основной пласт проблем - как решить, что пора переключать мастер на другой хост, а не вернётся старый мастер из-за недолгого (а то и вовсе планового) лага сети? Это организационный вопрос и автоматикой он не решается. Самое счастье с автоматикой - схлопотать split brain и получить на этом долгий и увлекательный квест "как бы разъехавшиеся данные теперь подружить воедино"
    мастер-мастер = головная боль перманентно. Потому что фундаментальная CAP теорема, которую никто пока внятно не решил. Или у вас проблемы с консистентностью или с медленной из-за распределённых транзакций записью.

    Автоматика для failover'а, которую я не придумал как спровоцировать на split brain - patroni. Вроде работает. Но в продакшене видел пока только однажды.

    Процедуры (да и вообще запросы) имеет смысл делить:
    - пишущие. Любые, какие что-то пишут в базе (включая create temporary table). Это должны роутиться строго на мастер
    - читающие. Идут на реплики
    - долго читающие. Идут на отдельные slow реплики, которые могут заметно отставать от мастера, но которые не будут мешать деятельности проекта
    Ответ написан
    4 комментария
  • Как при запросе получить в ячейке больший объем символов?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    pg_stat_activity.query ограничен сверху конфигурационным параметром track_activity_query_size. Дефолтно 1024 байта.

    PS: current_query оно называлось до postgresql 9.2, которые уже давно EOL и сам 9.2 уже EOL. Планируйте обновление.
    Ответ написан
  • Ошибки при восстановлении dump?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Судя по всему вы делали дамп без --clean и пытаетесь восстановить в уже не пустую базу.
    Ответ написан
  • TRIM на SSD в mdadm RAID 1?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вы так говорите будто инсталлятор сделает raid чем-то иным нежели linux raid (aka mdadm).

    Поддержка trim под linux raid - вопрос версии ядра linux (ну может ещё каких крайне нестандартных ядер).
    Ответ написан
    Комментировать
  • Экземпляр класса из строкового значения?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Директивы use - синтаксический сахар времени компиляции. В рантайме где вы в переменной помещаете имя класса этих директив уже нет и потому в переменной должно быть полное имя класса.
    Ответ написан
    1 комментарий
  • Какая база луче подойдет на рабочий портал?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Сейчас разработчики пишут портал

    Вот у разработчиков и спрашивайте, какую СУБД они лучше знают. И админов своих спросите, какую СУБД те лучше знают. DBA у вас явно нет, иначе вопрос бы так не стоял.

    Сам headhunter использует postgresql. Но там и своя команда админов классная, и вдобавок опытная команда DBA моих нынешних коллег, специализирующихся именно на postgresql.

    Я достаточно хорошо знаю обе СУБД с точки зрения разработчика, но не умею админить mysql, так что моё мнение будет предвзятым.
    Если делаете коммерческий проект - то используйте ту СУБД, которую лучше знает ваша команда. Если разработчики попрятались за своими ORM'ами и носу не заглядывают в базу - то без разницы, в таких условиях любая СУБД будет работать одинаково плохо. Если же хоть кто-то в команде понимает, что надо делать с базой - доверьте выбор ему и поинтересуйтесь о причинах выбора.
    Ответ написан
    Комментировать
  • Как в Ruby on Rails поле created_at использовать в mysql-запросе?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Из комментариев created_at является нормальным timestamp или datetime полем. Поэтому его не только не нужно приводить к строке и парсить повторно в дату (с неверным форматом к тому же), но ещё и очень вредно так делать, т.к. исключает возможность использования индекса.

    created_at < STR_TO_DATE('01.01.2017', '%d.%m.%Y')
    Дату возможно отформатировать в Y-m-d формат на приложении, это уже как удобнее.
    Ответ написан
    Комментировать