Самореференсный рекурсивный код отношений «многие ко многим» сначала Entity Framework

Я был бы очень удивлен, если бы вы могли обнаружить какую-либо разницу между WHERE col LIKE '[0-9]' и любыми другими методами, которые вы придумали. Но я согласен с Денисом, отложил это в функции, чтобы вы последовательно использовали одну и ту же проверку во всем своем коде (или, по крайней мере, если вы избегаете UDF из-за большого сканирования и т. Д., Поместите маркер в свой код, который будет упростить изменение в более широком масштабе позже).

Тем не менее, вы наверняка увидите больше производительности, просто используя скалярный UDF, чем тот метод, который вы используете для анализа внутри функции , Вы действительно должны сравнивать производительность UDF и делать это с помощью CASE. например,

SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]' 
       THEN SUBSTRING(postal, 2,1) END)
FROM ...

Это даст NULL, если символ не является числовым.

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

ИЗМЕНИТЬ добавление предложения к продемонстрированному предложению JOIN. Это потенциально приведет к менее постоянному сканированию, но будет намного более читаемым (гораздо меньше вызовов подстроки и т. Д.):

;WITH v AS 
(
    SELECT /* other columns, */ patientPostal, 
      ss = SUBSTRING(v.patientPostal,2,1),
      FROM [whatever table is aliased v in current query]
)
SELECT /* column list */
FROM [whatever table is aliased z in current query]
INNER JOIN v ON z.postal = CONVERT(INT, CASE 
    WHEN v.ss = '0' THEN ss
    WHEN v.ss LIKE '[1-9]' THEN LEFT(v.patientPostal, 3)
END);
42
задан Korayem 9 October 2012 в 10:49
поделиться