1

Хорошо, это может звучать noob question, но SQL не является моей силой, поэтому я прошу здесь помочь.Поддерживает ли табличная функция (SQL) таблицу для каждого вызова? [performance]

Я пытаюсь что-то реализовать, но меня беспокоят проблемы с производительностью.

Проблема, которую я пытаюсь исправить что-то вроде этого:

У меня есть столбец с большим количеством данных, разделенных запятыми «» Что-то вроде этого: data1, data2, data3, data57

Что мне нужно будет цикл по каждой части данных разделенных запятыми для всех записей, и затем сделать что-то с этой единственной частью данных, вы получите его?

Я нашел решение, которое can actually help me, но я беспокоится о производительности системы, потому что мне может потребоваться несколько вызовов с помощью различных параметров!

Создана ли таблица для каждого вызова, который я сделал для функции табличного значения (UDF), или сервер sql сохраняет его как кеш? [Может быть, мне понадобится временная таблица?]

Благодарим за помощь!


Примечание: данные не моя, и я должен использовать его как есть, так предлагая изменить базу данных может быть и речи (хотя я знаю, что будет лучший сценарий). a Примечание2: Цель данного вопроса/проблемы состоит в том, чтобы импортировать исходные данные в базу данных, производительность не может быть серьезной проблемой, поскольку она не будет работать много раз, но все же я хочу рассмотреть эту проблему и сделать это лучший способ я могу!

+1

Да. Эта функция создаст запись в 'tempdb' и заполнит ее, а затем удалит ее для каждого вызова. – TZHX

+0

Alllrighhht ... благодарит за ваш комментарий! Пожалуйста, напишите правильный ответ, и я буду рад принять его :) – TiagoM

+0

Кстати, если вы можете предложить лучшее решение для решения этой проблемы, пожалуйста, будь моим гостем, я был бы благодарен :) – TiagoM

ответ

2

Определенные пользователем функции таблиц, состоящие из нескольких операторов, как тот, который вы нашли, создадут объект в базе данных системы tempdb, заполнить его и затем утилизировать, когда объект выходит из области видимости.

Если вы хотите запустить это несколько раз по тем же параметрам, вы можете подумать о создании переменной таблицы и кэшировании результата в этом самостоятельно. Если вы собираетесь называть его в разных списках значений, разделенных запятыми, то нет лучшего способа избежать накладных расходов. SQL Server на самом деле не построен для большого количества манипуляций с строками.

Как правило, для одноразовых заданий последствия использования этого tempdb не будут для вас серьезной проблемой. Это больше касается того, когда это обычная картина в повседневной жизни базы данных.

Предлагаю попробовать, если можно, подмножество данных, подходящих по размеру для оценки эффективности вашего решения.

Так как вы говорите, что вы на SQL Server 2016, вы можете использовать новую STRING_SPLIT функции, что-то вроде

SELECT t.Column1, t.Column2, s.value 
FROM table t 
CROSS APPLY STRING_SPLIT(t.CsvColumn, ',') s 

Может получить закрыть туда, где вы хотите, без необходимости определения новой функция.Обратите внимание: ваша база данных должна работать под уровнем совместимости 2016 (130), чтобы это было доступно, просто запуск на SQL 2016 недостаточен (они часто делают это с новыми функциями, чтобы избежать риска изменений обратной совместимости).

+0

спасибо за ваш ответ, я пытаюсь запустить этот запрос, чтобы проверить результат, но он пока не работает, он говорит «Недопустимое имя объекта« STRING_SPLIT ». Также мне пришлось изменить стирание s.value, так как «s» не соответствует ни одной таблице, возможно, это была опечатка, и вы имели в виду t? благодаря ! – TiagoM

+1

Итак, я хотел добавить s как псевдоним в таблицу, возвращенную STRING_SPLIT; но похоже, что у вас этого нет. Вы можете проверить уровень совместимости базы данных? Он может быть установлен в 2014 (120) или 2012 (110), что сделает STRING_SPLIT недоступным для вас, если вы не сможете его изменить. – TZHX

+0

Я просто заметил из google, что мне нужно запустить эту команду: «ALTER DATABASE TestAzureDB SET COMPATIBILITY_LEVEL = 130» – TiagoM