Проблема производительности в функции T-SQL - PullRequest
1 голос
/ 14 марта 2011

Я написал следующую функцию T-SQL, но при реализации она кажется очень медленной (в основном она возвращает номер телефона из строки, такой как "01530 999111 - не звоните вечером!".

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

ALTER FUNCTION [dbo].[xfnJustNumbers](@inStr varchar(255))
RETURNS [varchar](255)
AS
BEGIN

  DECLARE @outStr varchar(255)
  SELECT @outStr = ''
  DECLARE @charNo int
  SELECT @charNo = 0
  WHILE @CharNo < len(@inStr) begin
    SELECT @CharNo = @CharNo +1
    IF isnumeric(substring(@inStr,@CharNo,1))=1 SELECT @outStr = @outStr + substring(@inStr,@CharNo,1)
  END
  RETURN @outStr

END

Спасибо:)

1 Ответ

1 голос
/ 14 марта 2011

Вероятно, вы могли бы немного повысить производительность в версии TSQL, попробовав что-то из следующего.

  1. Вызов только в том случае, если вы установили, что строка содержит хотя бы одно число CASE WHEN COl NOT LIKE '%[0-9]%' THEN '' ELSE [dbo].[xfnJustNumbers](col) END
  2. Хранение substring(@inStr,@CharNo,1) и len(@inStr) в переменных вместо оценки их более одного раза.
  3. Проверка ASCII(@chr) вместо вызова isnumeric это, скорее всего, будет больше, чем вам нужно.
  4. Включение опции WITH SCHEMABINDING в объявлении функции , чтобы гарантировать, что планы, использующие эти пользовательские функции, не будут делать ненужных катушек .

Сказав все это, я бы использовал для этого CLR функцию с использованием RegularExpressions.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...