Чи є РЕАЛЬНА різниця в роботі між первинними ключами INT і VARCHAR?


174

Чи є вимірювана різниця в продуктивності між використанням INT проти VARCHAR в якості основного ключа в MySQL? Я хотів би використовувати VARCHAR як основний ключ для довідкових списків (думаю, штати США, коди країн), а колега не зміщуватиметься на INT AUTO_INCREMENT як первинний ключ для всіх таблиць.

Мій аргумент, докладно описаний тут , полягає в тому, що різниця в продуктивності між INT і VARCHAR незначна, оскільки для кожного посилання на зовнішній ключ INT потрібна ПРИЄДНАЙТЕ, щоб мати сенс посилання, ключ VARCHAR буде безпосередньо представляти інформацію.

Отже, хтось має досвід роботи з цим конкретним випадком використання та пов'язаними з ним ефективністю?


3
Я створив пост з відповіддю "ні" з деякими деталями тестів, які я провів ... але це був SQL Server, а не MySQL. Тому я видалив свою відповідь.
Тимофій Хорі

17
@Timothy - ти не повинен був її видаляти. Я був у процесі його голосування. Більшість серверів баз даних SQL мають подібні планувачі запитів та подібні вузькі місця.
Пол Томблін

9
@ Тимофій, будь ласка, опублікуйте свої результати.
Джейк Макгрю

2
Так багато коментарів і відповідей припускають, що ключі можна використовувати для приєднання. Вони не. Ключі можна використовувати для узгодження даних - щоб уникнути повторюваних рядків (більше одного рядка, що представляє одну сутність). Будь-який стовпець (або набір стовпців) може бути використаний при з'єднанні, і щоб гарантувати, що приєднання - це один до нуля, або багато колонок [s] просто повинні бути унікальними. Будь-який унікальний індекс гарантує це, і він не повинен бути значимим.
Чарльз Бретана

Відповіді:


78

Ви добре зазначаєте, що можете уникнути деякої кількості об'єднаних запитів, використовуючи природний ключ замість сурогатного ключа . Тільки ви можете оцінити, чи користь від цього значна у вашій заявці.

Тобто ви можете виміряти запити у вашій програмі, які є найважливішими для швидкої роботи, оскільки вони працюють з великими обсягами даних або виконуються дуже часто. Якщо ці запити виграють від усунення приєднання і не страждають за допомогою первинного ключа varchar, виконайте це.

Не використовуйте жодної стратегії для всіх таблиць у вашій базі даних. Цілком ймовірно, що в деяких випадках природний ключ краще, але в інших випадках сурогатний ключ.

Інші люди добре підкреслюють, що на практиці рідко природний ключ ніколи не змінюється чи не має дублікатів, тому сурогатні ключі зазвичай варті.


3
І іноді, (імхо, часто), і краще, і сурогат використовувати для посилань на FK в інших таблицях, і для Joins, і природний ключ для забезпечення узгодженості даних
Чарльз Бретана

@CharlesBretana Це цікаво. Використання природного ключа для узгодженості даних поряд із ФК є звичайною практикою? Перша моя думка полягала в тому, що додаткове зберігання, яке знадобиться для великих столів, може зробити це не вартим. Будь-яка інформація цінується. FYI - У мене є пристойний досвід програмування, але мій досвід SQL здебільшого обмежений SELECT запитами
Роб

2
@CharlesBretana Коли я читаю "зберігати їх обох", я думаю, що "надмірність" і "не нормалізується", що дорівнює "Цей матеріал може закрутитися" і "я повинен переконатися, що обидва змінені, якщо колись буде змінено". Якщо у вас є надмірність, це має бути дуже вагома причина (наприклад, абсолютно неприйнятна ефективність), оскільки надмірність завжди може призвести до суперечливості ваших даних.
jpmc26

3
@ jpmc26, Тут абсолютно немає проблем з надмірністю або нормалізацією. Сурогатний ключ не має змістовного зв’язку зі значеннями природного ключа, тому його ніколи не потрібно змінювати. Щодо нормалізації, про які питання нормалізації ви говорите? Нормалізація застосовується до змістовних ознак відношення; числове значення сурогатного ключа (дійсно, саме поняття сурогатного ключа) лежить повністю поза контекстом будь-якої нормалізації.
Чарльз Бретана

1
І щоб відповісти на ваше інше запитання, зокрема про таблицю штатів, якщо у вас на цьому столі був сурогатний ключ із значеннями, скажімо, від frpom 1 до 50, але ви НЕ ввели інший унікальний індекс чи ключ на державний поштовий індекс, (і, на мою думку, і на державну назву), що тоді заважає комусь вводити два ряди з різними сурогатними ключовими значеннями, але з тим самим поштовим індексом та / або іменем штату? Як би клієнтська програма впоралася з цим, якщо були два ряди з "NJ", "New Jersey"? Натуральні ключі забезпечують узгодженість даних!
Чарльз Бретана

81

Справа не в продуктивності. Йдеться про те, що робить хороший первинний ключ. Унікальний і незмінний з часом. Ви можете подумати, що така організація, як код країни, ніколи не змінюється з часом і була б хорошим кандидатом на первинний ключ. Але гіркий досвід - це рідко так.

INT AUTO_INCREMENT відповідає умові "унікального та незмінного у часі". Звідси перевага.


25
Правда. Одна з моїх найбільших баз даних має записи для Югославії та Радянського Союзу. Я радий, що вони не є первинними ключами.
Пол Томблін

8
@Steve, то чому ANSI SQL підтримує синтаксис ON UPDATE CASCADE?
Білл Карвін

5
Незмінюваність - це не вимога ключа. У будь-якому випадку, сурогатні ключі іноді теж змінюються. Нічого поганого в зміні клавіш, якщо вам потрібно.
nvogel

9
Пол, значить, ти змінив Радянський Союз на Росію у своїй базі даних? І робити вигляд, що СУ ніколи не існує? І всі посилання на СУ зараз вказують на Росію?
Даїній

6
@alga Я народився в СУ, тому я знаю, що це таке.
Даїній

52

Мене трохи роздратувала відсутність орієнтирів для цього в Інтернеті, тому я сам пройшов тест.

Зауважте, що я не роблю це регулярно, тому, будь ласка, перевірте мої налаштування та дії, щоб виявити будь-які фактори, які могли б ненавмисно вплинути на результати, та залиште свої занепокоєння у коментарях.

Установка була такою:

  • Процесор Intel® Core ™ i7-7500U при 2,70 ГГц × 4
  • 15,6 Гб оперативної пам’яті, з яких я гарантував, що близько 8 ГБ було вільним під час тесту.
  • SSD накопичувач 148,6 ГБ, з великою кількістю вільного місця.
  • 64-розрядний Ubuntu 16.04
  • MySQL Ver 14.14 Distrib 5.7.20, для Linux (x86_64)

Таблиці:

create table jan_int (data1 varchar(255), data2 int(10), myindex tinyint(4)) ENGINE=InnoDB;
create table jan_int_index (data1 varchar(255), data2 int(10), myindex tinyint(4), INDEX (myindex)) ENGINE=InnoDB;
create table jan_char (data1 varchar(255), data2 int(10), myindex char(6)) ENGINE=InnoDB;
create table jan_char_index (data1 varchar(255), data2 int(10), myindex char(6), INDEX (myindex)) ENGINE=InnoDB;
create table jan_varchar (data1 varchar(255), data2 int(10), myindex varchar(63)) ENGINE=InnoDB;
create table jan_varchar_index (data1 varchar(255), data2 int(10), myindex varchar(63), INDEX (myindex)) ENGINE=InnoDB;

Потім я заповнив 10 мільйонів рядків у кожній таблиці сценарієм PHP, суть якого така:

$pdo = get_pdo();

$keys = [ 'alabam', 'massac', 'newyor', 'newham', 'delawa', 'califo', 'nevada', 'texas_', 'florid', 'ohio__' ];

for ($k = 0; $k < 10; $k++) {
    for ($j = 0; $j < 1000; $j++) {
        $val = '';
        for ($i = 0; $i < 1000; $i++) {
            $val .= '("' . generate_random_string() . '", ' . rand (0, 10000) . ', "' . ($keys[rand(0, 9)]) . '"),';
        }
        $val = rtrim($val, ',');
        $pdo->query('INSERT INTO jan_char VALUES ' . $val);
    }
    echo "\n" . ($k + 1) . ' millon(s) rows inserted.';
}

Для intтаблиць біт ($keys[rand(0, 9)])було замінено на просто rand(0, 9), а для varcharтаблиць я використав повні імена штатів США, не розрізаючи і не поширюючи їх на 6 символів. generate_random_string()генерує 10-символьну випадкову рядок.

Потім я побіг у MySQL:

  • SET SESSION query_cache_type=0;
  • Для jan_intстолу:
    • SELECT count(*) FROM jan_int WHERE myindex = 5;
    • SELECT BENCHMARK(1000000000, (SELECT count(*) FROM jan_int WHERE myindex = 5));
  • Для інших таблиць, як і вище, myindex = 'califo'для charтаблиць і myindex = 'california'для varcharтаблиць.

Часи BENCHMARKзапиту в кожній таблиці:

  • січень: 21.30 сек
  • jan_int_index: 18,79 сек
  • січень: 21,70 сек
  • jan_char_index: 18,85 сек
  • січень: 21,76 сек
  • jan_varchar_index: 18,86 сек

Що стосується розмірів таблиць та індексів, то тут виводиться результат show table status from janperformancetest;(без декількох стовпців не показано):

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Name              | Engine | Version | Row_format | Rows    | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Collation              |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| jan_int           | InnoDB |      10 | Dynamic    | 9739094 |             43 |   422510592 |               0 |            0 |   4194304 |           NULL | utf8mb4_unicode_520_ci |  
| jan_int_index     | InnoDB |      10 | Dynamic    | 9740329 |             43 |   420413440 |               0 |    132857856 |   7340032 |           NULL | utf8mb4_unicode_520_ci |   
| jan_char          | InnoDB |      10 | Dynamic    | 9726613 |             51 |   500170752 |               0 |            0 |   5242880 |           NULL | utf8mb4_unicode_520_ci |  
| jan_char_index    | InnoDB |      10 | Dynamic    | 9719059 |             52 |   513802240 |               0 |    202342400 |   5242880 |           NULL | utf8mb4_unicode_520_ci |  
| jan_varchar       | InnoDB |      10 | Dynamic    | 9722049 |             53 |   521142272 |               0 |            0 |   7340032 |           NULL | utf8mb4_unicode_520_ci |   
| jan_varchar_index | InnoDB |      10 | Dynamic    | 9738381 |             49 |   486539264 |               0 |    202375168 |   7340032 |           NULL | utf8mb4_unicode_520_ci | 
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

Мій висновок полягає в тому, що для цього конкретного випадку використання немає різниці в продуктивності.


Я знаю, що вже пізно, але мені було б цікаво побачити результати, якби ви вибрали менш ідеальну рядок для умови, де. "califo [rnia]" був ідеальним, оскільки міг усунути невідповідність після порівняння першого символу, лише потрібно додатково перевірити фактичні збіги; щось на кшталт "Ньюхама" дало б більш цікаві результати, так як було б новим порівняти більше символів, щоб усунути всі невідповідності. Крім того, обмежуючи ваші цілі числа таким чином, також укладаються шанси проти них, я дав би їм принаймні 26 значень.
Uueerdo

15
Дивовижно, що на запитання 10 років це лише одна з двох відповідей, яка не є лише спекуляцією та спирається на фактичні орієнтири.
Адріан Бейкер

1
Але ваші таблиці не мають первинного ключа, який насправді в InnoDB є впорядкованою структурою даних. Швидкість між цілим сортуванням і сортуванням рядків повинна бути різною.
Мелькор

1
@ Мелкор Справедлива точка, яку я використовую INDEXзамість PRIMARY KEY. Я не пам’ятаю своїх міркувань - я, мабуть, припускав, що PRIMARY KEYце лише INDEXунікальність. Однак, читаючи розділ про те, як зберігаються речі в InnoDB в federico-razzoli.com/primary-key-in-innodb , я думаю, що мої результати все ще застосовуються до первинних ключів, і я відповідаю на питання про різницю в пошуку значень пошуку. Крім того, ваш коментар пропонує переглянути ефективність алгоритмів сортування , які не застосовуються до досліджуваного нами випадку використання, який шукає значення у наборі.
Ян Żankowski

1
Операція пошуку також вимагає порівняння в полі первинного ключа (як бинарний пошук), де int повинен бути трохи швидшим, ніж varchar. Але як показали ваші експерименти, це не так очевидно (а може, тому, що у вас не було первинного ключа, тому запити були повільнішими). Я думаю, що це одне і те ж, що стосується вставлення та пошуку.
Мелькор

38

Залежить від довжини .. Якщо варчар буде 20 символів, а int - 4, то, якщо ви використовуєте int, ваш індекс матиме П'ять разів більше вузлів на сторінці місця в індексі на диску ... Це означає, що обхід для індексу знадобиться п'ята частина більшої кількості фізичних та / або логічних читань.

Отже, якщо продуктивність - це проблема, надається можливість, завжди використовуйте цілісний несуттєвий ключ (який називається сурогатом) для ваших таблиць та для зовнішніх ключів, які посилаються на рядки в цих таблицях ...

У той же час , щоб гарантувати узгодженість даних, кожна таблиця, де це має значення, також повинна мати значущий нечисловий альтернативний ключ (або унікальний індекс), щоб забезпечити неможливість вставлення повторюваних рядків (дублікат на основі значущих атрибутів таблиці).

Для конкретного використання, про яке ви говорите (наприклад, пошук у державі), це насправді не має значення, оскільки розмір таблиці настільки малий. Загалом, на показники роботи на показниках на таблицях з меншими кількома тисячами рядків немає впливу. ..


Впевнені? Чи базується найбільше рядків форматів даних? Окрім ключів є й інші дані. Чи не коефіцієнт 5 утопічний?
ManuelSchneid3r

1
@ manuelSchneid3r, Що? утопічний? Ні, фактор 5 не "утопічний". Це просто 20, поділене на 4. І що означає "на основі рядка формату даних"? Індекси не є "рядковими", вони є збалансованими структурами дерев.
Чарльз Бретана

36

Абсолютно не.

Я зробив кілька ... кілька ... перевірок працездатності між INT, VARCHAR і CHAR.

10-мільйонна таблиця записів з ПЕРВИЧНИМ КЛЮКОМ (унікальна та кластеризована) мала точно таку ж швидкість та продуктивність (і вартість піддерева) незалежно від того, який із трьох я використовував.

За словами ... використовуйте все, що найкраще для вашої програми. Не турбуйтеся про виступ.


42
безглуздо, не знаючи, скільки тривали вархари ... Якщо б вони були 100 байтів, тоді гарантували, що ви не отримаєте такої ж продуктивності, як 4-байтний інт
Чарльз Бретана

6
Це також допоможе дізнатися, яку базу даних ви використовуєте та яку версію бази даних. Налаштування продуктивності майже завжди працює і вдосконалюється від версії до версії.
Дейв Блек

VARCHAR, безумовно, має значення для розміру індексу. І індекс визначає, скільки можна вмістити в пам'яті. І індекси в пам’яті набагато, набагато швидші, ніж ті, що ні. Можливо, для ваших 10м рядків у вас було доступно 250 МБ пам'яті для цього індексу, і це було добре. Але якщо у вас буде 100 м рядків, ви будете менш добре в цій пам'яті.
Пол Дрейпер

9

Для коротких кодів, мабуть, різниці немає. Це особливо вірно, оскільки таблиця з цими кодами, ймовірно, буде дуже маленькою (максимум пару тисяч рядків) і не часто змінюється (коли востаннє ми додали новий штат США).

Для більших таблиць із більшою варіацією серед ключових це може бути небезпечно. Наприклад, подумайте про використання електронної пошти / імені користувача з таблиці користувача. Що відбувається, коли у вас є кілька мільйонів користувачів, а деякі з них мають довгі імена або адреси електронної пошти. Тепер, коли вам потрібно приєднатися до цієї таблиці за допомогою цього ключа, вона стає значно дорожчою.


2
Ви точно знаєте, що це буде дорого? Або ти просто здогадуєшся?
Стів Маклеод

Звичайно, це залежить від реалізації rdbms, але, наскільки я розумію, більшість серверів збереже хеш фактичного значення для цілей індексації. Незважаючи на це, і навіть якщо це порівняно короткий хеш (скажімо, 10 байт), порівняти 2 10 байтових хешів все ж більше роботи, ніж 2 4 байт.
Джоель Куехорн

НІКОЛИ не використовуйте довгу (широку) клавішу для приєднання ... Але якщо це найкраще подання того, що є унікальним для рядків у таблиці, тоді краще мати унікальний ключ (або індекс - що це те саме) на таблиці з використанням цих природних цінностей. Ключів немає для приєднання, ви можете приєднатись до всього, що вам хочеться. Ключі є, щоб забезпечити узгодженість даних.
Чарльз Бретана

6

Що стосується первинного ключа, те, що фізично робить рядок унікальним, слід визначати як первинний ключ.

Довідка як іноземний ключ, використання автоматичного приростаючого цілого числа в якості сурогата є приємною ідеєю з двох основних причин.
- По-перше, у з'єднанні зазвичай виникає менше накладних витрат.
- По-друге, якщо вам потрібно оновити таблицю, яка містить унікальний варчар, то оновлення має спускатися до всіх дочірніх таблиць і оновлювати їх усі, а також індекси, тоді як при сурогаті int воно має лише оновити оновлення головна таблиця та її індекси.

Недолік використання сурогату полягає в тому, що ви можете дозволити змінити значення сурогату:

ex.
id value
1 A
2 B
3 C

Update 3 to D
id value
1 A
2 B
3 D

Update 2 to C
id value
1 A
2 C
3 D

Update 3 to B
id value
1 A
2 C
3 B

Все залежить від того, про що ви дійсно повинні турбуватися у своїй структурі та що найбільше означає.


3

Поширені випадки, коли сурогат AUTO_INCREMENTболить:

Поширений шаблон схеми - це багато-багато-зіставлення :

CREATE TABLE map (
    id ... AUTO_INCREMENT,
    foo_id ...,
    bar_id ...,
    PRIMARY KEY(id),
    UNIQUE(foo_id, bar_id),
    INDEX(bar_id) );

Продуктивність цієї моделі значно краща, особливо при використанні InnoDB:

CREATE TABLE map (
    # No surrogate
    foo_id ...,
    bar_id ...,
    PRIMARY KEY(foo_id, bar_id),
    INDEX      (bar_id, foo_id) );

Чому?

  • Вторинні ключі InnoDB потребують додаткового пошуку; переміщення пари в ПК, що уникається в одному напрямку.
  • Вторинний індекс "охоплює", тому він не потребує додаткового пошуку.
  • Ця таблиця менша через звільнення idта один індекс.

Інший випадок ( країна ):

country_id INT ...
-- versus
country_code CHAR(2) CHARACTER SET ascii

Надто часто новачок нормалізує код країни в 4-байт INTзамість того, щоб використовувати "природний" 2-байтний, майже незмінний 2-байтний рядок. Швидше, менше, менша кількість ПРИЄДНАЙТЕСЬ, читабельніше.


2

У HauteLook ми змінили багато наших таблиць, щоб використовувати природні ключі. Ми відчули збільшення продуктивності в реальному світі. Як ви вже згадували, багато наших запитів зараз використовують менше приєднань, що робить запити більш ефективними. Ми навіть використовуватимемо складений первинний ключ, якщо це має сенс. Незважаючи на це, з деякими таблицями просто легше працювати, якщо у них є сурогатний ключ.

Крім того, якщо ви дозволяєте людям писати інтерфейси до вашої бази даних, сурогатний ключ може бути корисним. Третя сторона може розраховувати на те, що сурогатний ключ зміниться лише в дуже рідкісних обставинах.


2

Я зіткнувся з тією ж дилемою. Я зробив DW (схему сузір'я) з 3 таблицями фактів, дорожньо-транспортні пригоди, транспортні засоби при ДТП та ДТП. Дані включають усі нещасні випадки, зафіксовані у Великобританії з 1979 по 2012 роки, та 60 розмірних таблиць. Усього разом близько 20 мільйонів записів.

Стосунки таблиць фактів:

+----------+          +---------+
| Accident |>--------<| Vehicle |
+-----v----+ 1      * +----v----+
     1|                    |1
      |    +----------+    |
      +---<| Casualty |>---+
         * +----------+ *

RDMS: MySQL 5.6

Рідно індекс ДТП - це вархар (цифри та літери) з 15 цифрами. Я намагався не мати сурогатних ключів, як тільки показники аварій ніколи не зміниться. У комп'ютері i7 (8 ядер) DW став надто повільним для запиту після 12 мільйонів записів навантаження залежно від габаритів. Після багатого переробітку та додавання сурогатних ключів bigint я отримав середнє підвищення швидкості роботи на 20%. І все-таки низький приріст продуктивності, але спробуйте. Я працюю в настройці та кластеризації MySQL.


1
Схоже, вам потрібно придивитися до розділення.
jcoffland

2

Питання стосується MySQL, тому я кажу, що є суттєва різниця. Якщо мова йшла про Oracle (який зберігає числа як рядок - так, спершу я не міг повірити), то різниці не було.

Зберігання в таблиці не є проблемою, але оновлення та посилання на індекс є. Запити, пов'язані з пошуком запису на основі його основного ключа, є частими - ви хочете, щоб вони виникали якомога швидше, оскільки вони трапляються так часто.

Річ у тому, що процесор має 4 байтові та 8 байтові цілі числа, природно, у кремнію . Справді швидко порівняти два цілі числа - це відбувається за один або два тактових цикли.

Тепер погляньте на рядок - вона складається з безлічі символів (більше одного байта на символ в ці дні). Порівнювати два рядки за перевагою не можна за один або два цикли. Натомість символи рядків повинні бути повторені, поки не буде знайдена різниця. Я впевнений, що в деяких базах даних є прийоми, щоб зробити це швидше, але це не має значення, оскільки порівняння int відбувається природним чином і блискавично відбувається в силіконі процесором.

Моє загальне правило - кожен первинний ключ повинен бути автоматичним збільшенням INT, особливо в додатках OO, що використовують ORM (Hibernate, Datanucleus, будь-що інше), де між об'єктами існує велика кількість взаємозв'язків - вони завжди завжди реалізуються як простий FK та можливість для БД для вирішення цих швидких важливих для вашої програми.


0

Не впевнений у наслідках для продуктивності, але, мабуть, можливим компромісом, принаймні під час розробки, було б включити як автоматично збільшений, цілочисельний "сурогатний" ключ, так і ваш призначений, унікальний, "природний" ключ. Це дасть вам можливість оцінити продуктивність, а також інші можливі проблеми, включаючи зміну природних ключів.


0

Як завжди, бланкетних відповідей немає. 'Це залежить!' і я не ставлюсь до вибагливості. Моє розуміння первісного питання полягало в тому, що ключі на невеликих таблицях - наприклад, Country (цілий ідентифікатор або char / varchar-код), який є іноземним ключем до потенційно величезної таблиці, як-от адреса / таблиця контактів.

Тут є два сценарії, коли потрібно повернути дані з БД. По-перше, це список списку / пошукового запиту, де потрібно перелічити всі контакти з кодами штату та країни чи іменами (ідентифікатори не допоможуть, а значить, знадобиться пошук). Інший - сценарій отримання на первинному ключі, який показує єдину запис контактів, де має бути вказана назва держави, країни.

Для останнього отримання, мабуть, не має значення, на чому заснований ФК, оскільки ми об'єднуємо таблиці для одного запису або декількох записів і для ключових зчитувань. Наш вибір (пошук або список) може вплинути на наш вибір. Оскільки потрібно показати країну (принаймні, розпізнаваний код і, можливо, навіть сам пошук включає код країни), не потрібно приєднуватися до іншої таблиці через сурогатний ключ потенційно (я просто насторожений тут, тому що я насправді не перевіряв це, але здається дуже ймовірним) підвищення продуктивності; незважаючи на те, що це безумовно допомагає в пошуку.

Оскільки коди мають невеликі розміри - зазвичай не більше 3 символів для країни та штату, у цьому випадку може бути нормально використовувати природні ключі як зовнішні ключі.

Інший сценарій, коли клавіші залежать від більш довгих значень вархара та, можливо, від більших таблиць; сурогатний ключ, ймовірно, має перевагу.


0

Дозвольте сказати, що так, безумовно, є різниця, беручи до уваги масштаб продуктивності (Визначення з поля):

1- Використання сурогатного int швидше в застосуванні, оскільки вам не потрібно використовувати у своєму коді чи запиті ToUpper (), ToLower (), ToUpperInvarient () або ToLowerInvarient (), і ці 4 функції мають різні показники ефективності. Про це див. Правила продуктивності Microsoft. (виконання заявки)

2- Використання сурогатного int гарантує не змінювати ключ з часом. Навіть коди країн можуть змінюватися, дивіться у Вікіпедії, як змінилися коди ISO з часом. На це знадобиться багато часу, щоб змінити основний ключ для subtrees. (продуктивність обслуговування даних)

3- Здається, є проблеми з рішеннями ORM, наприклад, NHibernate, коли PK / FK не є int. (продуктивність розробника)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.