Ответы пользователя по тегу SQL
  • Как оптимизировать запрос SELECT COUNT?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    SELECT COUNT(*) FROM - перебрать все строки.
    SELECT COUNT(id) FROM - перебрать все строки, в которых указанное поле (в данном случае id) имеет значение отличное от NULL.

    Без указания полей - наиболее оптимальный вариант для PostgreSQL:
    SELECT COUNT(*) FROM table WHERE field = value
    https://wiki.postgresql.org/wiki/Slow_Counting

    Если все совсем плохо, то как вариант, можно сделать собственный счетчик.

    Вот вырезка из PostgreSQL Wiki на русском языке:
    Почему "SELECT count(*) FROM bigtable;" работает медленно?
    Потому что не используется индекс. PostgreSQL выполняет проверку видимости каждой записи и таким образом производит последовательное сканирование всей таблицы. Если вы хотите, вы можете отслеживать количество строк в таблице с помощью триггеров, но это вызовет замедление при операциях записи в таблицу.
    Вы можете получить некоторую оценку. Колонка reltuples в таблице pg_class содержит информацию из результата выполнения последнего оператора ANALYZE на эту таблицу. На большой таблице, точность этого значения составляет тысячные доли процента, что вполне достаточно для многих целей.
    "Точный" результат count, часто не будет точным долгое время в любом случае; из-за конкурентности MVCC, count будет точным только на момент вызова запущенного запроса SELECT count(*) (или ограничиваться уровнями изоляции транзакций данной транзакции), и может потерять актуальность уже в момент завершения запроса. При постоянной работе транзакций, изменяющий таблицу, два вызова count(*), которые завершатся в одно и то же время могут показать разные значения, если изменяющая транзакция завершилась между их вызовами.
    https://wiki.postgresql.org/wiki/Часто_Задаваемые_...
    Ответ написан
    1 комментарий
  • Так sql, ...count(*)... и ...count(id)... в чем отличие?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    SELECT COUNT(*) FROM - перебрать все строки.
    SELECT COUNT(id) FROM - перебрать все строки, в которых указанное поле (в данном случае id) имеет значение отличное от NULL.

    Что использовать - вопрос производительности и потребностей. В случае с primary key, это больше вопрос производительности, которая будет зависеть от конкретной СУБД.
    Ответ написан
    2 комментария
  • Как заменить только первое вхождение в строке?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    -- строка, в которой нужно провести поиск
    SET @parent = '14 11 10 11 52';
    -- строка, которую нужно найти
    SET @search = '11';
    
    -- найти начальную позицию нужной строки
    SELECT INSTR(@parent, @search);
    
    -- зная расположение и размер подстроки, можно вырезать фрагмент текста
    -- первая часть
    SELECT SUBSTR(@parent, 1, INSTR(@parent, @search) - 1);
    -- хвост
    SELECT SUBSTR(@parent, INSTR(@parent, @search) + LENGTH(@search));
    
    -- все вместе
    SELECT CONCAT
    (
      SUBSTR(@parent, 1, INSTR(@parent, @search) - 1), 
      SUBSTR(@parent, INSTR(@parent, @search) + LENGTH(@search))
    );


    Грубый вариант с UPDATE будет примерно таким (лучше процедуру сделать и/или передавать строку поиска через параметр):

    UPDATE example SET parent = CONCAT
    (
      SUBSTR(parent, 1, INSTR(parent, '11') - 1), 
      SUBSTR(parent, INSTR(parent, '11') + LENGTH('11'))
    );
    Ответ написан
    Комментировать