У меня есть ситуация, когда мне нужно динамически создавать строки SQL, и я пытаюсь использовать параметры и sp_executesql, где это возможно, чтобы я мог повторно использовать планы запросов. При большом количестве чтения в Интернете и личного опыта я обнаружил, что «NOT IN» и «INNER / LEFT JOIN» являются медленными и дорогими, когда базовая (крайняя левая) таблица большая (1,5 млн. Строк с примерно 50 столбцами). ). Я также читал, что следует избегать использования любых типов функций, поскольку это замедляет запросы, поэтому мне интересно, что хуже?
Я использовал этот обходной путь в прошлом, хотя я не уверен, что это лучшее, что нужно сделать, чтобы не использовать «NOT IN» со списком элементов, когда, например, я передаю список 3 строки символов с, например, разделителем канала (только между элементами):
LEN(@param1) = LEN(REPLACE(@param1, [col], ''))
вместо:
[col] NOT IN('ABD', 'RDF', 'TRM', 'HYP', 'UOE')
... представьте, что список строк имеет длину от 1 до примерно 80 возможных значений, и этот метод также не пригоден для параметризации.
В этом примере я могу использовать «=» для NOT IN, и я буду использовать традиционную технику списка для моего IN, или! =, Если это быстрее, хотя я сомневаюсь в этом. Это быстрее, чем использование NOT IN?
В качестве возможной третьей альтернативы, что если бы я знал все другие возможности (возможности IN, которые потенциально могли бы быть в 80-95 раз длиннее списка) и пропустил бы их вместо этого; это будет сделано на бизнес-уровне приложения, чтобы снять нагрузку с SQL Server. Не очень хорошая возможность для повторного использования плана запроса, но если он экономит секунду или две от большого неприятного запроса, то, черт возьми, нет.
Я также опытный в создании функции SQL CLR. Поскольку вышеизложенное - это манипулирование строками, будет ли лучше функция CLR?
Мысли
Заранее спасибо за любую помощь / советы / и т. Д.