Как разработать масштабируемую службу, которая работает как планировщик (на определенную продолжительность) для входящих миллионов запросов?

Я столкнулся с подобной проблемой, но сложной, и так как это первый поток, который я нашел по этой проблеме, я решил опубликовать свое сообщение. Я знаю, что это сложное решение простой проблемы, но я надеюсь, что я могу помочь другим людям, которые идут в эту тему, ищут более сложное решение. Мне пришлось разбить строку, содержащую 5 чисел (имя столбца: levelsFeed) и показать каждое число в отдельном столбце. например: 8,1,2,2,2 следует указывать как:

1  2  3  4  5
-------------
8  1  2  2  2

Решение 1: использование функций XML: это решение для самого медленного решения на самом деле

SELECT Distinct FeedbackID, 
, S.a.value('(/H/r)[1]', 'INT') AS level1
, S.a.value('(/H/r)[2]', 'INT') AS level2
, S.a.value('(/H/r)[3]', 'INT') AS level3
, S.a.value('(/H/r)[4]', 'INT') AS level4
, S.a.value('(/H/r)[5]', 'INT') AS level5
FROM (            
    SELECT *,CAST (N'<H><r>' + REPLACE(levelsFeed, ',', '</r><r>')  + '</r> </H>' AS XML) AS [vals]
    FROM Feedbacks 
)  as d
CROSS APPLY d.[vals].nodes('/H/r') S(a)

Решение 2: использование функции разделения и поворота. (функция разделения разделяет строку на строки с именем столбца Data)

SELECT FeedbackID, [1],[2],[3],[4],[5]
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY feedbackID ORDER BY (SELECT  null)) as rn 
FROM (
    SELECT FeedbackID, levelsFeed
    FROM Feedbacks 
) as a
CROSS APPLY dbo.Split(levelsFeed, ',')
) as SourceTable
PIVOT
(
    MAX(data)
    FOR rn IN ([1],[2],[3],[4],[5])
)as pivotTable

Решение 3: использование функций строковых манипуляций - быстрее всего с небольшим отрывом над решением 2

SELECT FeedbackID,
SUBSTRING(levelsFeed,0,CHARINDEX(',',levelsFeed)) AS level1,
PARSENAME(REPLACE(SUBSTRING(levelsFeed,CHARINDEX(',',levelsFeed)+1,LEN(levelsFeed)),',','.'),4) AS level2,
PARSENAME(REPLACE(SUBSTRING(levelsFeed,CHARINDEX(',',levelsFeed)+1,LEN(levelsFeed)),',','.'),3) AS level3,
PARSENAME(REPLACE(SUBSTRING(levelsFeed,CHARINDEX(',',levelsFeed)+1,LEN(levelsFeed)),',','.'),2) AS level4,
PARSENAME(REPLACE(SUBSTRING(levelsFeed,CHARINDEX(',',levelsFeed)+1,LEN(levelsFeed)),',','.'),1) AS level5
FROM Feedbacks

так как levelFeed содержит 5 строковых значений, которые мне нужны для использования функции подстроки для первой строки.

Надеюсь, что мое решение поможет другим, кто попал в эту тему, искать более сложные методы разделения столбцов

0
задан Deeps 17 January 2019 в 00:03
поделиться