Я хотел бы знать, существует ли неявный SELECT, выполняющийся до выполнения INSERT в таблице, которая имеет любой столбец, определяемый как UNIQUE. Я не могу найти ничего об этом в документации для INSERT.
Я задал еще несколько вопросов, на которые никто, похоже, не может ответить - возможно, потому, что я не объясняю себя, - которые связаны с вышеупомянутым вопросом.
Если я правильно понимаю, тогда я предполагаю, что следующее будет верно:
CASE 1:
У вас есть таблица с 1 миллиардом строк. Каждая строка имеет уникальный столбец UUID. Если вы выполняете вставку, сервер должен сделать неявный SELECT COUNT(*) FROM table WHERE UUID = [new uuid]
и определить, является ли счет 0 или 1. Правильно?
CASE 2:
У вас есть таблица с 1 миллиардом строк. Каждая строка имеет составной уникальный ключ, состоящий из DATE и UUID. Если вы выполняете вставку, сервер должен выполнить неявный SELECT COUNT(*) FROM table WHERE DATE = [date] AND UUID = [new uuid]
и проверить, равен ли счету 0 или 1. Да?
Я использую слово неявное, потому что в какой-то момент, где-то в процессе, сервер ДОЛЖЕН проверять значение. Если бы это не потребовало, чтобы законы физики диктовали, что две идентичные строки не могут существовать, и, насколько мне известно, физика не играет большой роли, когда речь идет о уникальности чисел, записанных где-то, в двоичном, на магнитный диск в компьютере.
Предположим, что ваши 1 миллиард строк одинаково и последовательно распределены по 2000 различным датам. Разве это не означает, что случай 2 будет выполнять вставку быстрее, потому что он может искать UUID, сегментированные в дате? Если нет, то было бы лучше использовать случай 1 для скорости вставки - и в этом случае, почему?
Этот вопрос является теоретическим, поэтому не беспокойтесь, рассматривая регулярную производительность SELECT в этом случае. Первичный ключ не будет индексом UUID + DATE.
В ответ на комментарии: UUID в моем случае разработан исключительно для того, чтобы избежать дублирования записей из-за плохих соединений. Так как вы не можете сделать одну и ту же запись для другой даты дважды (без логического ввода новой записи), UUID не обязательно должен быть глобально уникальным - он должен быть уникальным только для каждой даты. Вот почему я могу позволить ему быть частью составного ключа.