Ответы пользователя по тегу SQL Server
  • Как почистить базу sql?

    @rPman
    Тебе правильно написали, не понимая ничего, лучше не трогать работать базу.

    10гб это очень маленький размер, хотя что может быть такого в базе аптеки? Поэтому неплохо бы проверить один из простых вариантов в сообщении об ошибке - размер свободного места на диске, почему место закончилось? Возможно изначально маленький диск? Системный раздел создан маленьким? Диск переполнен не рабочими файлами?

    Если проблема создана разработчиками, и требует регулярного типового обслуживания (типа прийти и запустить простую команду, например очистки устаревших логов) то требуйте разработки автоматического ее выполнения, это обычно очень просто и не может быть дорого... Но понимают от этом обычно только разработчики этого приложения, остальным это знание может быть 'не простым'.

    P s. Сделайте резервную копию, причем в идеале всей системы и диска в целом, для чего скорее всего потребуется остановить работу (иногда можно делать на лету и это, но требуется специалист)... Обязательно проверяйте копию на работоспособность (тестируя сценарий полной смерти сервера) и только после этого что то ломайте!

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

    Иногда сложность системы упрощается за счёт аппаратного резервирования (условно второй сервер, дублирующий основной и берущий на себя работу пока первый на обслуживании, а база в режиме мастер-мастер репликации.
    Ответ написан
    Комментировать
  • Сжатие БД в MS SQL?

    @rPman
    Но при нынешних ценах на дисковое пространство попытка добыть пару лишних мегабайт сжатием - крайне неразумное занятие. Дополнительные процессорные ресурсы на него стоят куда как дороже.
    люто плюсую.

    Но если прямо очень нужно, то советую вместо сжатия средствами БД, попробовать сжать средствами файловой системы (например btrfs - zstd, 16 уровней сжатия), можно поиграть с разным размером кластера, что может сильно повлиять на результат... особенно если в базе данных соседние поля с одинаковыми данными, а движок их упаковывает независимо.

    Скорость записи в базу данных на сжатом диске сильно упадет, особенно если делать большой размер кластера (так как это увеличивает степень сжатия), но вот скорость чтения, особенно с hdd, даже может подрасти (особенно при хорошей степени сжатия), но должно много всего совпасть.
    spoiler
    Можно придумать абсурдно дикую комбинацию файловых систем и bcache, когда быстрый несжатый диск ssd (который не жалко или с хорошим ресурсом на запись) выставлен как кеш к диску, который будет размещен на сжатом хранилище, типа cloop, в этом случае запись на медленный носитель будет отложена на потом, а данные будут быстро складываться на ssd кеш.. пока скорость поступления данных на запись в этом буфере не превысит скорость записи на сжатый носитель, конструкция будет работать очень эффективно (занимая ресурсы процессора само собой, но там скорее всего однопоточная реализация будет).

    НАСТОЯТЕЛЬНО рекомендую файлы индексов не сжимать, за исключением случаев, когда они целиком и полностью влезают в оперативную память и запись в базу данных не производится.

    ОБЯЗАТЕЛЬНОЕ тестирование всей конструкции на реальных данных перед запуском в продакшен, иначе можно получить проблему, и конечно же бакапы, без них ничего делать даже не начинай.

    p.s. наилучшее сжатие можно получить, если грамотно его реализовать на стороне самого приложения, ведь его разработчик знает, где какие данные как лежат, как их можно эффективно перераспределить и главное, есть библиотеки типа того же zstd, когда можно держать несколько словарей для сжимаемых данных, специально собранных под свои наборы данных,.. отличный пример сжатие xml/json файлов, где теги/атрибуты могут занимать до 90% пространства,.. и при маленьком размере сжимаемого куска, словарь на них будет в каждом куске свой.. а вот общий словарь для всего пакета файлов позволит на порядок сократить их объем.

    p.p.s. само собой, замена xml/json на правильно созданный protobuf исключит эту проблему в зачатке
    Ответ написан
    Комментировать
  • Как гарантировать монотонное увеличение значения поля при параллельных транзакциях с максимальным быстродействием?

    @rPman
    Всегда в вопросах формулируй исходную задачу а не вопрос по одному из возможных решений, возможно выбран не тот путь?

    Если задача следующая: есть много поставщиков событий, которые параллельно сохраняют их в базу данных, есть один обработчик событий, который мониторит новые события и обрабатывает их.

    Эта задача решается очень просто - списком необработанных событий, лучше это сделать в отдельной таблице (просто список id из events, даже без индекса, хотя это вопрос длительности их обработки и максимального их количества), при этом монотонность идентификатора уже не требуется, только уникальность.

    При появлении записи в events тригером заносится запись в этот лог, а обработчик должен удалять каждый идентификатор после обработки. Если удалять и обрабатывать события по одному, добавив статус - в обработке, то обработчиков может быть много и они могут работать параллельно, иначе же единый обработчик может пакетно запрашивать весь список записей в логе, обрабатывать их и по окончанию обработки каждого удалять по одному (потому что нужно думать, что произойдет если случится в обработчике сбой)
    Ответ написан
    Комментировать
  • Как установить Microsoft SQL Server на неподдерживаемые дистрибутивы?

    @rPman
    универсально - контейнирзация (например докер) или даже виртуализация
    Ответ написан
    Комментировать
  • Какие хорошие средства бекапа для MS SQL?

    @rPman
    настроить master-slave репликацию на второй сервер и уже на этом втором сервере каким угодно способом делать бакапы, это не затронет (по нагрузке) основной и будет достаточно эффективно (так как нагрузка на чтение у этого бакап сервера нулевая)

    смутно помню как я (на oracle но думаю так везде можно сделать) отключал все индексы на slave базе кроме pk и нагрузка на запись этой базы была наиболее низкой
    Ответ написан
    Комментировать
  • Можно ли добавить галочку на логику (true = ✓ ,false = " ")?

    @rPman
    есть тип bool или boolean, смотри документацию к своей базе данных

    подавляющее большинство языков программирования или фреймворков работы с базами данных, воспринимают целое число 0 - как false, а 1 - как true (часто true - любое другое число)

    есть еще подход, null - false, любое другое значение - true, но помню были ситуации (и не в одной какой то бд) что пустые значения не попадали в индекс, и работа с ними была неэффективно, и хотя это было давно.. осадочек остался

    И конечно есть перечисляемые типы - enum, определяй свои значения для true/false, но реализация в разных базах данных - разная, одни хранят строковые значения как есть, а другие - числовые, соответственно описанию типа enum
    Ответ написан
  • Как настроить источник данных в Excel, как файл подключения в сети?

    @rPman
    А если один раз настроить, сохранить файл как шаблон и растиражировать его по пользователям домена например скриптами?
    Ответ написан
    1 комментарий
  • Как посчитать ФИО в колонках с неправильным порядком?

    @rPman
    так как цель найти одних и тех же людей с перепутанным порядком
    найди записи в которых col1 совпадает с col2 потом с col3, потом col2 с col3, получишь список пар, в которых это перепутано, осторожно, вырожденные случаи (например в ФИО записаны инициалы) или к примеру восточные имена (там встречаются очень сложные составные фио, которые записывают кто во что горазд), эти моменты лучше обработать отдельной логикой

    select a.*,b.*
    from table a inner join table b on
    a.col1=b.col2
    -- a.col1=b.col3
    -- a.col2=b.col3
    Ответ написан
  • Как правильнее использовать ресурсы ПК для терминального сервера и 1C+SQL?

    @rPman
    upd. не сообразил что сервер у тебя на windows, а мой ответ подходит только для linux хоста (можно конечно пробросить контроллеры дисков внутрь одной из виртуалок, и там уже на Linux все сделать но мне кажется это извращением)

    уже не актуально
    Если есть потребность хранить больше данных чем позволяют ssd, не терять в скорости и не управлять размещением данных вручную (а это бывает очень непросто если у тебя виртуалки, размазывать для каждой софтинке ее файлики в виртуалках по разным дискам это геморой, кстати не всегда возможный), то можно попробовать настроить кеширование медленных hdd дисков, разместив bcache кеш на ssd.

    Делать это лучше, мне кажется, там где к дискам прямой аппаратный доступ (на гипервизоре или пробросив контроллеры в виртуалку которая файлсервер). Так же сначала на основе физических железок поднимаешь raid-ы, а уже на получившихся - поднимаешь bcache, поверх получившихся дисков поднимаешь хранилища, а уже там либо файлы виртуалок и/или сами раздавать файлы по сети.

    Настоятельно рекомендую не делать один большой блочный bcache диск с одним большим кешем на все доступное пространство на ssd... лучше поделить на тома, соответственно с разным характером нагрузки. Причем размеры кешей для каждого характера нагрузки могут быть разными. А еще можно части ssd и hdd диска выделить для разделов вне кеширования.

    Пример - если сделать 2 блочных устройства отдельно для файлов ОС (к примеру выделил всего 8гб кеша) и отдельно для файлов нагруженной базы данных (у меня так на очень слабой железке 2013 года, хорошо такие нюансы выявлять) то высокая нагрузка на базу данных не затронет кеш файловой системы ОС, характер нагрузки ОС отличается от базы данных, файлы ОС читаются и меняются редко, и если бы лежали на одном блочном устройстве, из ssd кеша их бы выкинуло быстро, а так - отзывчивость работы с ОС осталась на высоте при видимой высокой на hdd диск из-за базы данных.

    p.s. если у тебя ssd диск в рейде, то не бойся включать bcache стратегию writeback, поднимает скорость очень заметно
    Ответ написан
    4 комментария
  • Как проверить наличие значений в таблицах?

    @rPman
    большинство sql баз данных позволяют использовать результат работы select в качестве таблицы во from (либо определять такие вьююхами).

    про добавление суток, оператор LEFT JOIN позволяет объединить таблицы во from таким образом что записи левой таблицы будут в результате обязательно, когда как записи от правой только при совпадении условия в ON (аналогично есть RIGHT JOIN, только подсчет будет для правой таблицы)

    соответственно проверяешь нужное поле на null делаешь плюс один

    про рекурсивные добавления не понял
    Ответ написан
    3 комментария
  • Как сделать проверку столбца типа varchar на уникальность?

    @rPman
    Такое можно сделать только индексом unique. При добавлении неуникальной записи будет выдавать ошибку.

    Иначе вам придется вручную делать то же самое что он, гораздо менее эффективно по скорости и затратам ресурсов.

    p.s. если колонок очень много то вместо добавления их в индекс можно добавить только хеш строку на их основе (т.е. заведите в таблице еще одно поле и при добавлении считайте вручную программно или с помощью sql хеш от суммы concatenate ваших колонок, только между строками добавляйте какой-нибудь символ чтобы отделить колонки), только берите что-нибудь не самое простое, чтобы вероятность коллизий была как можно меньше (коллизия в вашем случае это фальшивое срабатывание на строки, которые дубликатами не являются)
    Ответ написан
    Комментировать
  • Нужна ли дефрагментация RAID1 на аппаратном контроллере LSI SAS9211-4i?

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

    Запустите инструмент дефрагментации от майкрософта, он проанализирует и посоветует вам, нужна ли она или нет. Обычно, если свободное место на вашем диске никогда не уменьшалось меньше 30% (на самом деле зависит от характера использования, и может быть хватит и 10%) от общего объема, то файлы на диске не будут фрагментированы в принципе.

    Фрагментация появляется, если во время записи (увеличения) файла, места на диске мало, и система начинает его распихивать по дыркам, оставшимся от удаленных ранее файлов.
    Ответ написан
    Комментировать
  • И всё-таки, как «правильно» выполнять из PHP сложные sql-запросы?

    @rPman
    Не нужно перебарщивать, решите только одну главную проблему передачи параметров — escaping и quoting параметров, никаких монструозных велосипедов, только поправьте метод выполняющий ваши запросы, :param пусть идут в sql-запрос без изменений (а сам запрос сделать параметризованным, список параметров получается просто поиском всех вхождений /\:(\w+)/), а {param} заменяются по старинке, пусть там останутся куски самого запроса с выражениями.
    Ответ написан
    Комментировать
  • Проблема в связке PHP + MS SQL Server 2005

    @rPman
    Очень плохая практика тяжелых монстров подключать к веб-морде напрямую. Это проблема создается разработчиком еще на этапе разработки архитектуры приложения.

    Про монстров, я имею в виду mssql/oracle/ibmdb…

    Исправить это сложно, особенно если не предусмотрено мест в коде для этого. Основное направление, ставьте что-то по проще, между веб-сервером и базой данных, основанное на document oriented db, какое-нибудь nosql решение (но и mysql+text indexing services поставить между вебом и oracle — тоже нормально), иногда достаточно решений вида 'просто кеш'.

    Обязательно этот модуль на себя должен брать вопросы аутентификации и авторизации, да и вообоще вопросы безопасности по максимуму (сам участвовал когда то в решении, где логин пользователя веб был логином в БД oracle, страшно вспомнить, хотя права доступа БД были оттюнены и завернуто было все через пакеджи и вьюхи).
    Ответ написан
    Комментировать
  • Кэширование таблиц

    @rPman
    Очень давно не работал с mssql, если внутрь уже готовых функций лезть никак 9а это единственно верный способ оптимизации), то у вас есть два способа:
    1. разместить таблицу в отдельном таблеспейсе на ram диске (не рекомендуется, так как в случае аварийной остановки сервера базу придется чинить, но это гарантированно разместит данные только в оперативной памяти)
    2. создать таблицу в памяти (точнее в tempdb) stackoverflow.com/questions/27835/does-ms-sql-support-in-memory-tables и прилинковать через вьюху
    Оба метода требуют дополнительных скриптов, по наполнению этих таблиц при перезапуске сервера а так же самое главное по сохранению изменений, ничего лучше кроме копирования изменений в нормальную таблицу тригером не приходит в голову — очень эффективно, чуть по сложнее — поднять еще одну базу и настроить репликацию (но цена вопроса — удорожание лицензии на серверный софт)

    p.s. кстати две или более базы, разнесенные по серверам или даже географически могут позволить схемы, когда полностью вся база размещена в оперативной памяти.
    Ответ написан
    1 комментарий
  • Select/where/group by на 100m-200m таблицах?

    @rPman
    Меняется ли sum(field2) для каждого field и как часто? Критично ли скорость его записи?
    Если быть более точным, изменяется ли поле field2? или только добавляются и удаляются новые записи?

    Я к тому что такие задачи решаются гораздо проще просто доп-таблицей (field, sum_cache) и обновлением на основе триггеров или самостоятельно… кстати на сколько я знаю есть БД поддерживающие кеш-индексы на основе выражений (фактически они и создают поле и наполняют его триггерами)
    Ответ написан