2015-05-11 3 views
0

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

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

Простой пример: скажем, у меня есть атрибут в моей таблице, называемый fun как тип данных int. Я хочу обработать свой стол так, чтобы все строки с забавой < 10 были «foo», и все строки с потерей> 10 были «faa».

Так я пишу функцию SQL-то вроде

CREATE FUNCTION dbo.fooORfaa 
(
    @fun AS int 
) 
RETURNS VARCHAR(3) 
AS 
BEGIN 
    IF (@fun < 10) 
     RETURN 'foo' 
    RETURN 'faa' 
END 

Тогда я использую свою функцию в чем-то вроде этого оператора выбора

select dbo.fooORfaa([mytable].[fun]) AS 'blah' 
from mytable 

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

Мне нужно обработать много записей за разумный промежуток времени. Является ли этот метод эффективным способом решения этой проблемы? Есть ли другой метод, который я должен использовать вместо этого?

+0

, если поля, лежащие в основе вашей 'функции fooORfaa' относительно неизменны, и/или расчеты вы делаете, является«тяжелым»или«дорогой», то вы, вероятно, будет лучше сохранять их в дополнительные поля, поэтому вы не тратите тонну процессора, переделывая все вычисления каждый раз, когда работаете со столом. несколько подходящих триггеров могут поддерживать актуальность таблицы в случае (надеюсь) редких случаев изменения значений. –

+0

Использование магазина Процедура магазина – Hiten004

+0

Хотя неинтуитивные табличные функции часто более эффективны, чем скалярнозначные функции. –

ответ

2

Для этого варианта использования вам нужна конструкция CASE.

SELECT 
    CASE 
    WHEN T.fun < 10 THEN 'foo' 
    ELSE 'faa' 
    END foo_faa 
FROM 
    myTable T 

Всегда старайтесь использовать операции на основе набора. Пользовательские функции будут (в основном) убивать вашу производительность и должны быть в крайнем случае.

See: CASE (Transact-SQL)

+0

Спасибо, я думаю, что могу применить это к большинству моих преобразований. Еще один вопрос, как, как я могу предотвратить выскакивание операторов select? Одним из приятных побочных эффектов скалярных функций был гораздо более читаемый код. Я мог бы вложить кучу предложений с использованием хранимой процедуры, но я думаю, что это может отрицательно сказаться и на производительности. – user3538411

+0

Вы действительно не можете. На этом нет бесплатного обеда. Иногда вы можете поместить несколько вещей в точку зрения, но затем вы получаете спагетти представлений, ссылающихся на представления, и оптимизатору запросов становится трудно сделать эффективные планы, поскольку он пытается свернуть взгляды вместе. Таким образом, жить с SQL - это жить с этим. Это не похоже на C# или другие процедурные языки. Многие диалекты SQL имеют процедурные расширения, такие как UDF, но обычно они хранятся для краевых случаев или транзакционных приложений. Retrievals, как то, что вы делаете, почти всегда лучше всего нравится. –

+0

Спасибо. Наверное, я просто становлюсь действительно суетливым из-за моих отступов. Очень признателен. – user3538411

Смежные вопросы