Как сохранить SQL аналитику запросов в фоновом режиме при доставке записей пользователю? - PullRequest
2 голосов
/ 10 марта 2020

Мне интересно узнать, существует ли эффективный способ записи аналитики из запроса SQL, при этом предоставляя записи запрашивающей стороне? Сейчас я нахожусь на MS SQL Server 2012.

Скажем, например, у вас есть несколько способов, которыми пользователи извлекают записи из базы данных (SSRS, SSIS, на основе веб-страниц и т. Д. c). ), из-за отсутствия лучшего термина давайте назовем их отчетами. Со временем было бы неплохо узнать, какие отчеты запускаются, когда они выполняются, сколько времени требуется для запуска отчета, какое количество записей возвращено для данного отчета и т. Д. c. так далее и так далее. Эти аналитические данные позволили бы мне следить за вещами - наиболее запрашиваемым, самым продолжительным, самым активным пользователем и т. Д. c.

. Сейчас я настроил систему, в которой у меня есть View. это полный набор «базовых записей» для отчета и хранимой процедуры, которую вызывает конечный пользователь, который работает с представлением - он вызывает представление и выгружает отфильтрованные результаты в @TempTable внутри SPro c. В дополнение к фильтрации просмотра возвращаемых записей в соответствии с потребностями пользователя, SPro c будет записывать время выполнения, продолжительность, количество записей, предоставленные аргументы и т. Д. c. Все они сохраняются в отдельной «Аналитике». таблица для раздельного анализа. В конце SPro c просто возвращает записи из @TempTable Пользователю.

Хотя это работает, он просто кажется неуклюжим и добавляет одну или две секунды к общему времени обработки. Я надеюсь, что есть более эффективный способ sh такого рода фонового сбора информации?

Примечание. Стороннее программное обеспечение не подходит для моей среды.

1 Ответ

1 голос
/ 10 марта 2020

У меня было требование, когда все запросы должны были быть менее 1 секунды. Не сложная задача, учитывая сложность.

В любом случае, это резко урезанная версия. Ключевым моментом здесь является то, что я сохраняю запрос и параметры как XML. Вы можете расширять или сжимать при необходимости столбцы и / или часть XML.

Взгляните на dbFiddle

Структура таблицы журнала

CREATE TABLE [dbo].[uniLog](
    [LogNr] [int] IDENTITY(1,1) NOT NULL,
    [LogUTC] [datetime] NULL,
    [LogMS] [int] NULL,
    [LogRows] [int] NULL,
    [LogParam] [xml] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Процедура хранения фиктивных файлов

Обратите внимание на @TimeBeg в верхней части процедуры и INSERT после END

CREATE PROCEDURE [dbo].[prcDummyProcedure] (
    @SomeStr varchar(50),
    @SomeInt int,
    @AnotherInt int,
    @FromDate date
)

As

Begin

    Set NoCount On
    Declare @TimeBeg datetime = getutcdate()

    -- My Super Awsome Query
    Select Top 5000 *,N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1, master..spt_values n2

    Declare @Rows int = @@RowCount
End

Insert Into [dbo].[uniLog] (LogUTC,LogMS,LogRows,LogParam) 
values ( GetUTCDate()
        ,DateDiff(MILLISECOND,@TimeBeg,getutcdate())
        ,@Rows
        ,(Select ProcName   = '[dbo].[prcDummyProcedure]'
                ,SomeStr     = @SomeStr
                ,SomeInt     = @SomeInt
                ,AnotherInt  = @AnotherInt
                ,FromDate    = @FromDate
            For XML Raw )
       )

А теперь тест

Exec [dbo].[prcDummyProcedure] 'SomeString',100,200,'2020-01-31'

Select * from [dbo].[uniLog]

Результаты

[Результаты будут что нужно сделать для SP]

Таблица журнала была обновлена ​​с

LogNr   LogUTC                   LogMS  LogRows LogParam
6       2020-03-10 19:55:35.423  13     1000    <row ProcName="[dbo].[prcDummyProcedure]" SomeStr="SomeString" SomeInt="100" AnotherInt="200" FromDate="2020-01-31" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...