Вопрос о присоединении к SQL Server - PullRequest
1 голос
/ 14 июня 2010

Это на Microsoft SQL Server.У нас есть запрос, в котором мы пытаемся объединить две таблицы в полях, содержащих числовые данные.

В одной таблице поле определено как числовое (18,2), а в другой таблице поле определено как десятичное (244).При соединении с нативными типами данных запрос зависает, и у нас заканчивается терпение, прежде чем он завершится (оставил его на 6 минут…).Поэтому мы попытались привести оба поля к числовому (18,2), и запрос был завершен менее чем за 10 секунд.Поэтому мы попытались привести оба поля к десятичному (18,2), и снова запрос зависает.Кто-нибудь знает разницу между десятичными и числовыми типами данных, которые заставляют их работать так по-разному?

Ответы [ 3 ]

1 голос
/ 14 июня 2010

Почему вы используете два типа данных для начала?Если они содержат данные одного и того же типа (и присоединение к ним подразумевает, что они это делают), они должны иметь один и тот же тип данных.Исправьте это, и все ваши проблемы исчезнут.Зачем тратить ресурсы сервера на постоянное приведение в соответствие двум полям, которые должны быть определены одинаково?

Вам, конечно, может потребоваться настроить входные переменные для любых запросов вставки или обновления, чтобы они соответствовали выбранному вами типу данных.

1 голос
/ 14 июня 2010

Типы DECIMAL и NUMERIC - это одно и то же в SQL Server.

Цитата из BOL :

Числовые типы данных, которые исправили точность и масштаб.

десятичный [(p [, s])] и числовой [(p [ , s])] Фиксированная точность и масштаб номера. Когда максимальная точность используются, допустимые значения от - 10 ^ 38 +1 через 10 ^ 38 - 1. Синонимы ISO для десятичной - это dec и dec (p, s). число функционально эквивалентно десятичное.

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

0 голосов
/ 14 июня 2010

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

Я не знаю, почему будет разница с вашим первым запросом и вторым, где вы явно конвертируете, но я понимаю, почему может возникнуть проблема, когда вы конвертируете в тип данных, который не соответствует, а затем SQL Server все равно должен их неявно конвертировать (как в третьем случае). Возможно, в первом случае SQL Server неявно преобразует оба значения в десятичное (24,4), чтобы не потерять данные, и эта операция занимает больше времени, чем преобразование другим способом. Вы пытались явно преобразовать числовое (18,2) в десятичное (24,4)?

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