Ответы пользователя по тегу SQL Server
  • Как оптимизировать запрос (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), выполнить инструкцию из первого ответа и забыть про рост журнала транзакций и восстановление на момент времени.
    Ответ написан
  • Какой индекс создать для таблицы?

    unfilled
    @unfilled
    Кластерный индекс лучше объявить уникальным (раз вы пишете, что TTfid уникальное. Оптимизатору всегда лучше предоставлять максимум информации.
    Что касается индексов по конкретным столбцам - нужно видеть, какие конкретно запросы вы хотите оптимизировать. Без этого - гадание на кофейной гуще. Для запроса, где "join идет по полям: TTfid, TPid и TTowner" уникальный кластерный индекс по TTfld - то что доктор прописал.
    Ответ написан
  • SQL Pivot работает неправильно, что я делаю не так?

    unfilled
    @unfilled
    Select ProcedureId, [3_1_explain_alert_system_and_boosters_required], [1_1_patient_blacklist_checked]
    FROM 
    (
        select ProcedureId, HtmlValue, TokenValue from ProcedureStepsDetails
    ) As Temp
    PIVOT
    (
        max([HtmlValue]) 
        FOR [TokenValue] In([3_1_explain_alert_system_and_boosters_required], [1_1_patient_blacklist_checked])
    ) As pt

    а так?
    Ответ написан
  • Как автоматически уменьшать лог транзакций?

    unfilled
    @unfilled
    Вы делаете очень странную вещь - бэкапите логи, потом переводите БД в симпл, ломаете цепочку восстановления и возвращаетесь обратно в полную модель восстановления.
    Вы не сможете нормально воспользоваться своими бэкапами журнала транзакций после перевода в простую модель восстановления.
    Если вы хотите всё-таки использовать полную модель восстановления и иметь возможность восстановления на любой момент времени - делайте резервные копии журнала транзакций чаще и после того, как копия снята делайте DBCC SHRINKFILE без перехода в симпл.
    Если это не помогает - смотрите log_reuse_wait_desc в sys.databases - что именно мешает обрезать файл.
    Не забывайте, что на время приращения журнала транзакций, БД переходит в режим "только для чтения" - формально, конечно, ничего никуда не переходит, просто все операции записи ждут пока ЖТ вырастет.
    Ответ написан
  • После уменьшения файла лога транзакций, 1с ругается в некоторых операциях?

    unfilled
    @unfilled
    Обрежьте журнал транзакций гигабайт до 5, установите приращение в 1 ГБ и не возвращайте БД в Full - вы всё равно не пользуетесь преимуществами полной модели восстановления. Оставьте в простой.
    Deadlock'и у вас появляются из-за кривого кода 1С (ищите их документацию по причинам возникновения и избавлению от взаимоблокировок - её полно). Почему не возникали раньше? Возможно, потому что после "обрезки" ЖТ и переводе в полную модель восстановления, ЖТ снова начал расти и одна из кривых операций ждала завершения приращения, когда вторая кривая операция начала выполняться. Но это мой хрустальный шар только предполагает, вам и вашим одинэсникам виднее должно быть.
    Ответ написан
  • Кэширование таблиц

    unfilled
    @unfilled
    Раньше был DBCC PINTALBE, сейчас такого механизма нет (да и PINTABLE особо не рекомендовалось к использованию).
    ИМХО, вы зря не хотите разбираться с запросами и индексами. «Закрепление» таблицы в памяти может вам и не помочь. Например, вы таблицу «закрепили», а пользователь бабахнул запрос с 10 кросс джойнами этой таблицы — в данном случае, вне зависимости от того «закреплена» она или нет, памяти уйдёт намного больше чем предполагалось.
    Плюс, suser_name() никак на кэширование данных не влияет — почему вы считаете, что кэширование не дееспособно?
    Ответ написан
  • Как бекапить MS SQL 2008 R2 с FILESTREAM. База отдельно, файлы отдельно?

    unfilled
    @unfilled
    Бэкапить основную файловую группу отдельно. Пример есть здесь (там же, в ответе, ссылка на пост где приводится пример восстановления). Только надо будет дополнительно потренироваться в восстановлении.
    Ответ написан
  • BLOB to String?

    unfilled
    @unfilled
    Тут надо понимать, что такого типа данных datBlob в SQL Server не существует, то есть это какой-то самописный пользовательский тип, описание которого можно достать только у автора этого типа (нельзя посмотреть код которым он был создан) — отсюда могут быть и проблемы при CAST/CONVERT (теоретически). Плюс, типа String в SQL Server тоже нет вместо него используется VACRHCAR/NVARCHAR.
    Если вы еще не пробовали делать CAST(Picture AS nvarchar(max)), то попробуйте — вдруг получится. А если пробовали, но не получается — ищите автора и исходники этого типа данных.
    Ответ написан
  • mssql server грузит cpu в 100%

    unfilled
    @unfilled
    1. Штатно 1С 7.7 не работает с SQL Server 2005 и старше, а судя по "_1SUSERS" — у вас именно семерка — с этим может быть связана часть проблем.
    2. Посмотрите что именно выполняется в пределах этой сессии. Я бы посоветовал для этого использовать sp_whoIsActive, но навязывать не буду.
    Ответ написан
  • Посоветуйте аналог "CLR via C#" Рихтера, но по MSSQL

    unfilled
    @unfilled
    Посмотрите автора Itzik Ben-Gan — это по программированию.
    Плюс учебные курсы microsoft — там есть и по программированию, и по администрированию.
    Ответ написан
  • Выбор железа для SQL сервера 1С

    unfilled
    @unfilled
    Обязательно помониторьте счетчики текущего сервера, на наличие «затыков». Вполне может оказаться, что у вас и так все лежит в памяти и разнесение по разным серверам не даст ощутимого эффекта. Более того, иногда возникает ситуация, когда разнесение серверов 1С и SQL-сервера, приводит к небольшому снижению производительности — из-за «медленной» сети.
    Ответ написан
  • SQL репликация?

    unfilled
    @unfilled
    >> log shipping и p2p репликацию между ними если они на разных сабнетах
    Проблем быть не должно. Это как раз-таки средства DR, такая возможность должна быть предусмотрена.

    >>SQL failover cluster
    Для него вам по-любому нужна будет общая дисковая подсистема и сервера, ЕМНИП, должны быть в одном домене.

    А зачем вам log shipping? Почему не хотите mirroring использовать? Или у вас SQL Server младше 2005-го?
    Ответ написан