Приведение типа данных сервера SQL - PullRequest
0 голосов
/ 31 мая 2011

Мне интересно, какое влияние может оказать следующее на производительность. Допустим, есть таблица с одним из столбцов данных, типизированный как int. Эта таблица содержит миллионы и миллионы строк. Затем допустим, что выполняются следующие 2 SQL-оператора.

SELECT * FROM tblTest WHERE colInt in (3,4)

и

SELECT * FROM tblTest WHERE colInt in ('3','4')

Я полагаю, что во втором запросе подразумеваемый символьный тип данных попытается преобразовать все значения в colInt, а затем попытается выполнить сравнение. Кто-нибудь может подтвердить, что это так? Кто-нибудь знает статью MSDN, которая объясняет это? Это довольно дорого?

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

Ответы [ 2 ]

2 голосов
/ 31 мая 2011

Вы должны запустить это против ваших данных, чтобы увидеть.

Однако будьте ОЧЕНЬ ОЧЕНЬ осторожны при конвертации из int в varchar или наоборот. Вы получите неожиданное поведение, особенно с операторами упорядочения или неравенства, такими как < и >:

SELECT 'True'
WHERE 100 < 20

SELECT 'True'
WHERE '100' < '20'

100 больше 20, но '100' меньше '20', потому что varchars сравниваются по первому символу первым, а 2 больше 1.

Будет еще сложнее, если вы включите ведущие 0 s в свои варианты:

SELECT 'True'
WHERE 0100 < 020

SELECT 'True'
WHERE '0100' < '0020'

Второй оператор больше не True, потому что '0020' меньше '0100', так как начинается с 2 0 с.

Будьте ОЧЕНЬ ОЧЕНЬ осторожны.

2 голосов
/ 31 мая 2011

Более вероятный сценарий состоит в том, что оптимизатор приведёт два литерала к INT.

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