стоит ли переключать ПЕРВИЧНЫЙ КЛЮЧ с типа NVARCHAR на тип INT?

В нашей базе данных SQL SERVER 2008 R2 у нас есть COUNTRIES справочная таблица, содержащая страны. PRIMARY KEY - это столбец nvarchar:

create table COUNTRIES(
   COUNTRY_ID nvarchar(50) PRIMARY KEY,
   ... other columns
)

Первичный ключ содержит такие значения, как «FR», «GER», «US», «UK» и т. Д. Эта таблица содержит макс. 20 рядов.

У нас также есть SALES таблица, содержащая данные о продажах:

create table SALES(
    ID int PRIMARY KEY
    COUNTRY_ID nvarchar(50),
    PRODUCT_ID int,
    DATE datetime,
    UNITS decimal(18,2)        
    ... other columns
)

Эта таблица продаж содержит столбец с именем COUNTRY_ID, также типа nvarchar (не первичный ключ). Эта таблица намного больше и содержит около 20 миллионов строк.

Внутри нашего приложения при запросе к таблице SALES мы почти каждый раз фильтруем COUNTRY_ID. Даже в этом случае выполнение большинства запросов агрегирования занимает слишком много времени (даже при наличии соответствующих индексов).

Мы находимся на этапе разработки, чтобы повысить производительность запросов к SALES таблице. У меня вопрос:

Стоит ли переключать тип COUNTRY_ID с nvarchar(50) на тип int? Если столбец COUNTRY_ID в обеих таблицах преобразован в тип int, могу ли я ожидать повышения производительности при объединении двух таблиц?


person Lucian    schedule 04.07.2013    source источник
comment
Это потенциальный дубликат.   -  person Scott    schedule 04.07.2013
comment
@Scott - событие, если это почти то же самое, этот вопрос относится к MySQL, а не к SQL Server. Некоторые ответы там могут соответствовать моему случаю, но я надеялся получить еще несколько технических ответов, относящихся к SQL Server (возможно, также и некоторые числа). Я надеюсь, что вы, ребята, не закроете мой вопрос   -  person Lucian    schedule 04.07.2013
comment
Тип int, вероятно, будет быстрее, если у вас есть соединения, но, с другой стороны, наличие семантического первичного ключа может означать, что вам часто даже не придется присоединяться к таблице страны, поскольку вы можете фильтровать непосредственно по внешнему ключу.   -  person alun    schedule 04.07.2013
comment
@alun - Спасибо, я понимаю вашу точку зрения. В моем случае я думаю получить значения INT во временной таблице перед запросом в большой таблице. Затем я могу использовать эту временную таблицу для присоединения к SALES   -  person Lucian    schedule 04.07.2013


Ответы (1)


Я лично рекомендую изменить COUNTRY_ID с nvarchar(50) на INT. Тип int использует 4 байта данных и обычно быстрее JOIN, чем VARCHAR.

Вы также можете проверить, уменьшилось ли используемое пространство, используя stored procedure sp_spaceused

EXEC sp_spaceused 'TableName'
person Darren    schedule 04.07.2013
comment
Спасибо за sp_spaceused. Я провел несколько тестов и получил только 101 МБ на пространстве, используемом данными (1855488 КБ против 1751408 КБ). Практически то же самое для места, занимаемого индексами (разница 91 Мб). Думаю, с этой точки зрения особой разницы нет. - person Lucian; 04.07.2013
comment
@Lucian - это еще достаточно места для экономии. По мере роста таблиц сэкономленное пространство становится ценным. - person Darren; 04.07.2013