• Какой из запросов более оптимальный?

    unfilled
    @unfilled
    я бы сделал так
    select *
    from users u
    where 
        u.id = any (
            select id
            from pp1
            where organization = 1
    
            union all
    
            select id
            from pp2
            where organization = 1
        )
    order by u.name
    limit 15
    
    если работает медленно - уже смотреть план выполнения
    Ответ написан
    Комментировать
  • Можно ли использовать pivot в xml файле?

    unfilled
    @unfilled
    Pivot использовать можно, но работает он не так, как вы, судя по всему, ожидаете.
    Пивоту нужна агрегатная функция и явный перечень значений по которым столбец будет разворачиваться в строку
    select  * from (
      select T.col.value('@Kind','varchar(30)') as Attribute_King,
      T.col.value('.','varchar(30)') as StrVal
      from @xml_doc.nodes('//*:Attribute') as T(col)
    ) as p
    PIVOT (
       MAX(Attribute_King)  for [StrVal] in([230425416398244922], [Payment])
    ) as piv


    для примера подставил пару значений из StrVal
    Ответ написан
    Комментировать
  • Как правильно построить запрос в БД?

    unfilled
    @unfilled
    А неважно январь какого года? В таблицах вообще не видно дат

    Если не важно, то, например, так:
    select *
        , case when exists (select 1 from records r where r.idObject = o.id and r.Month = 'Май') then 1 else null end as record_exists
    from Objects o


    Если нужен вывод не за какой-то абстрактный месяц, а выгрузка по объектам и месяцам за период, то будет примерно так (если всё-таки есть столбец с датой, можно сделать более красиво)
    with months as (
        select 'Январь' as m
        union all select 'Февраль' as m
        ...
        union all select 'Декабрь' as m
    )
    select o.*, mo.m
        , case when exists (select 1 from records r where r.idObject = o.id and r.Month = mo.m) then 1 else null end as record_exists
    from Objects o, months mo
    Ответ написан
    Комментировать
  • Почему SSMS не подключается к серверу?

    unfilled
    @unfilled
    Verify that the instance name is correct and that SQL Server is configured to allow remote connections.

    ЕМНИП, по-умолчанию сетевые соединения запрещены, нужно явно разрешить их через SQL Server Configuration Manager. Возможно, потребуется и перезапуск сервера
    Ответ написан
    Комментировать
  • Как собрать диапазоны из битого списка?

    unfilled
    @unfilled
    У меня под рукой только ms sql, но идея должна быть понятна
    declare @n table (id int);
    insert into @n values (1), (2), (3), (5), (6), (7), (8), (15), (16), (20), (21), (22), (23), (30), (31), (55)
    
    select diff, min(id) as range_from, max(id) as range_to
    from (
    	select 
    		  id
    		, id - row_number() over (order by id) as diff
    	from @n
    ) x
    group by diff
    having min(id) <> max(id) -- опционально, если нужны именно диапазоны
    order by diff
    Ответ написан
    Комментировать
  • Где ошибка в данном sql запросе?

    unfilled
    @unfilled
    В доке пишут:
    Taking all the columns via * is available only if tables are joined, not subqueries.


    и не уверен на счёт сортировки в первом подзапросе

    upd: и попробуйте добавить алиасы для count'ов в первом подзапросе
    Ответ написан
    Комментировать
  • Как не блокировать соседние записи для обновления добавив триггер?

    unfilled
    @unfilled
    Предполагаю, что проблема в том, что:
    1. колонка [ClientTableId] в дочерней таблице не индексирована, соответственно, каждое срабатывание триггера вычитывает всю таблицу
    2. у [ClientTableId] тип nvarchar, который не совпадает с типом колонки Id в родительской таблице, поэтому при каждом срабатывании триггера, требуется преобразование типа nvarchar к int, что "отключит" возможность использования индекса, даже при его наличии
    Ответ написан
    Комментировать
  • Как использовать merge into?

    unfilled
    @unfilled
    Какая у вас версия SQL Server? OPENJSON появился в 2016, ЕМНИП.
    Если отдельно подзапрос с OPENJSON выполняется, я бы вынес его в cte, а в USING указал имя cte.
    Ответ написан
    Комментировать
  • Как написать SQL запрос в clickhouse для скользящего среднего?

    unfilled
    @unfilled
    Обычно такие задачи решаются с помощью оконных функций. Кликхаус их сейчас поддерживает (хотя они и считаются экспериментальным функционалом).
    Ответ написан
    Комментировать
  • Как устранить данную ошибку в соединение в MSSQL?

    unfilled
    @unfilled
    Вы подключаетесь к LocalDB, но, судя по ошибке "Не найден компонент Local Database Runtime", у вас не установлен Local Database Runtime (исполняю кэпа). Инструкция по его установке от MS.
    Ответ написан
  • Как правильно настроить учетные записи sql сервера?

    unfilled
    @unfilled
    У меня однажды были проблемы с настройкой соединения в Maintenance Plan, когда я создавал его на локальном компьютере, а при подключении через RDP к серверу и запуске SSMS там, всё проходило нормально. Не разбирался с чем это связано.

    Чем вас не устроил Local Server Connection, который создаётся по умолчанию? Попробуйте указать полное (FQDN) имя сервера. Если всё равно не получается, попробуйте, как вариант, временно запустить SQL Server Browser и найти сервер в сети.
    Ответ написан
  • Как объединить большое количество таблиц?

    unfilled
    @unfilled
    dynamic-sql: собираете текст запроса в nvarchar(max) и выполняете его через exec / sp_executesql. Легко накосячить и легко получить SQL-Injection.

    Возможно, проще будет один раз руками собрать вьюху (прописать все UNION/UNION ALL) и работать потом с ней.
    Ответ написан
  • В чем польза шардирования БД при наличии индексов?

    unfilled
    @unfilled
    к выше сказанному можно добавить, что шардирование уместно использовать, когда вы данные пользователей из России должны хранить в России, а данные пользователей ЕС в ЕС, например. Кроме того, шардирование может быть полезно в плане общей "устойчивости" системы - отвалился шард - большая часть пользователей остаётся доступной.
    Т.е. шардирование - это больше не про скорость доступа к данным, а про управление ими.
    Ответ написан
    Комментировать
  • Как оптимизировать запрос (nested loops)?

    unfilled
    @unfilled
    Я бы начал с того, что убрал все подзапросы, джойнил таблицы напрямую. Скорее всего у этого не будет никакого результата, но читать будет проще.
    Второе, что нужно сделать - это избавиться от этого:
    join (select DocumentRef, DocumentNodeStaticGUIDRef, DocumentNodeValue from DocumentNode) dn2 on dn2.DocumentRef = (select T.[value].value ('.', 'int') from DocumentSettingXML.nodes('/DocumentSetting/PreviousDocumentRef') as T([value]))
     and dn1.DocumentNodeStaticGUIDRef = dn2.DocumentNodeStaticGUIDRef
     where 
     (select T.[value].value ('.', 'int') from DocumentSettingXML.nodes('/DocumentSetting/PreviousDocumentRef') as T([value])) is not null

    Попробуйте выкинуть это в нормальную временную таблицу (не табличную переменную) и делать джойн с ней

    Nested Loops далеко не всегда плохо, проблема с ним в этом месте в том, что sql server думает, что вернётся 70 тыщ строк (Estimated Number of Rows), а возвращается (Actual Number of Rows) на несколько порядков больше. Дайте ему временную таблицу по которой он сможет построить статистику и он, скорее всего, сам построит приемлемый план.

    Если @StartDate и @EndDate - это переменные, а не параметры SP, попробуйте выполнить запрос в том виде, в котором он есть, но явно подсунув туда даты, без переменных. Если это хранимая процедура и это её параметры, попробуйте выполнить её после sp_recompile. Этот абзац актуален только в том случае, если запрос не всегда работает медленно.

    Ну и от distinct надо избавляться, да.
    Ответ написан
    Комментировать
  • Необходимо создать функцию T-SQL для работы с таблицей, хранящей дерево?

    unfilled
    @unfilled
    внутри рекурсивного cte я бы добавил "счётчик" уровней, типа
    WITH [tree] ([sp_id], [sp_parent], [lvl])
        AS
        (
        SELECT [sp_id],
        [sp_parent],
        1 as [lvl]
        FROM [site_pages_new]
        WHERE [sp_id] = 2
        UNION ALL
        SELECT [inner].[sp_id],
        [inner].[sp_parent],
        [tree].[lvl] + 1
        FROM [site_pages] AS [inner]
        JOIN [tree]
        ON [inner].[sp_parent] = [tree].[sp_id]
        WHERE [tree[.[lvl] < @level
        )

    Ну а <= или < использовать - по месту надо смотреть, что вы и как передавать будете
    Ответ написан
    Комментировать
  • Как написать запрос?

    unfilled
    @unfilled
    SELECT *
    FROM orders o
    WHERE NOT EXISTS (
    	SELECT * 
    	FROM orders o2 
    	WHERE o2.keyvalue = o.keyvalue AND completed IS NOT NULL
    )

    Если заявок много работать может очень медленно
    Ответ написан
    Комментировать
  • Как установить для всех связей в БД каскадное удаление?

    unfilled
    @unfilled
    Не уверен, что это будет самым простым способом, но чтобы это сделать - вам нужно заскриптовать все внешние ключи в текущем состоянии, потом сделать что-то вроде такого (не работает с композитными ключами), удалить ваши данные и восстановить внешние ключи по сохранённым скриптам.
    Учтите, что при пересоздании внешних ключей, SQL Server будет сканировать таблицы/индексы (при наличии) по этим ключам, чтобы убедиться, что в них нет некорректных данных. Этого можно избежать с помощью NOCHECK, но тогда ключи не будут trusted.
    Ответ написан
  • Как через SQL 2016 в планировщике сжать и почистить log.ldf (лог транзакций) файл от базы данных?

    unfilled
    @unfilled
    Файл позволяет вернуться к любой точке времени и восстановить базу на указанное время.

    Этот файл не позволяет этого сделать. Правильно настроенное резервное копирование, включающее в себя резервные копии журнала транзакций позволяет восстановить БД на любой (с оговорками) момент времени.

    Подскажите как через планировщик настроить сжатие и очистку этого файла после успешно сделанного бэкапа?

    Полный бэкап не влияет усечение журнала транзакций. Если ваша база в полной модели восстановления (что, видимо, так), и вы делаете только полные резервные копии - ваш журнал транзакций будет только расти, сколько бы шринков (DBCC SHRINKDATABASE/SHRINKFILE) вы не делали.

    Грамотный подход для того, чтобы не страдать от разрастания журнала транзакций: почитать про модели восстановления; виды резервных копий (включая резервные копии журнала транзакций); настроить резервное копирование журнала транзакций с такой частотой, которая обеспечит оптимальные для вас: размер файла журнала транзакций и объём допустимой потери данных; разово обрезать журнал транзакций с помощью DBCC SHRINKFILE.

    Быстрый подход: перевести бд в простую модель восстановления (alter database set recovery simple), выполнить инструкцию из первого ответа и забыть про рост журнала транзакций и восстановление на момент времени.
    Ответ написан
    1 комментарий
  • Как создать БД с дефисом/тире в имени?

    unfilled
    @unfilled
    можно попробовать взять название в одинарные кавычки (` - или как там это называется)
    Ответ написан
  • Запрос стал некорректным в чем может быть причина?

    unfilled
    @unfilled
    SELECT `cms`.`vote_values`.`user_id`,`cms`.`vote_values`.`username`,`ip`, count(*) as cnt, 
    count(CASE WHEN `user_vote`=5 THEN 1 ELSE NULL END) as cnt5,
    count(CASE WHEN `user_vote`=4 THEN 1 ELSE NULL END) as cnt4,
    count(CASE WHEN `user_vote`=3 THEN 1 ELSE NULL END) as cnt3,
    count(CASE WHEN `user_vote`=2 THEN 1 ELSE NULL END) as cnt2, 
    count(CASE WHEN `user_vote`=1 THEN 1 ELSE NULL END) as cnt1,
    `user_posts`,DATE_FORMAT(FROM_UNIXTIME(`user_regdate`), '%e %b %Y') AS 'date_formatted',`user_avatar`,`user_email`
    FROM `cms`.`vote_values` left join `test`.`phpbb_users` 
    on `cms`.`vote_values`.`user_id`= `test`.`phpbb_users`.`user_id`
    where `vote_id`=5 GROUP BY `cms`.`vote_values`.`user_id`   ORDER BY `vote_values`.`ip` ASC
    Ответ написан
    Комментировать