2013-02-11 3 views
3

Итак, я занимаюсь некоторыми исследованиями, и мне нужно написать инструкцию INSERT для вставки уникальных имен клиентов в таблицу на моем сервере. Однако стандартный стандарт базы данных уже имеет в нем тысячи клиентов, а при вставке новых клиентов нам нужно проверить, существуют ли они до того, как добавить его в систему.Проверка дубликатов перед вставкой в ​​базу данных SQL

Мой вопрос в том, что было бы лучшим/быстрым способом для этого? Было бы лучше запустить простой запрос выбора в таблице клиентов (упорядочен по ASC) и выполнить бинарный поиск или что-то по результатам или, возможно, просто выполнить SQL-запрос, подобный приведенному ниже?

IF NOT EXISTS (SELECT 1 FROM clients AS c WHERE c.clientname = ?) 
BEGIN 
    INSERT INTO clients (clientname, address, ...) 
    VALUES (?, ?, ...) 
END 

Является ли это медленным заявлением? Возможно, мне придется запускать вставку несколько сотен раз за каждое представление.

ответ

3

Стандартным советом является создание ограничения UNIQUE, если вы хотите, чтобы данный столбец был уникальным.

ALTER TABLE clients ADD UNIQUE KEY (clientname); 

Тогда попробуйте сделать INSERT, и он будет успешным, если нет соответствующей строки, и это будет ошибкой, если есть дубликат. Нет SELECT.

+0

Это также работает с экземплярами строк? – SNpn

+0

+1. Такой подход «проще просить прощения, чем разрешение» более безопасен, чем «смотреть до того, как вы прыгаете», как описывает OP, если есть возможность одновременного одновременного подключения к базе данных. – ruakh

+0

Да, это работает для строковых столбцов. –

2

Не слишком необычно рассчитать стоимость SQL в запросе в терминах операций с дисками (обычно это означает, что чтение/запись блока (обычно 8 КБ) является единицей для ваших затрат). (В памяти-БД должно что-то изменить в этой линии мысли).

Если у вас есть сотни, возможных тысяч предметов и каждый элемент ... Скажите 20 байтов, то ваша полная база данных, возможно, будет входить в один блок на диске (400 элементов/блок). Может быть, ему нужна еще пара блоков, но ура: это малозаметное небольшое число. С такой небольшой базой данных ваша база данных, вероятно, будет располагаться в кеше памяти вашей базы данных, и вам нужно будет заплатить только за доступ на запись. По мере роста вашей базы данных количество доступных блоков доступа может быть экспоненциально уменьшено, если у вас есть индекс.

Как ваше решение, так и решение Билла не будут вызывать доступ к записи, если элемент уже присутствует в базе данных, и поэтому он должен быть одинаково быстрым.

Интересная часть будет:

Я, возможно, придется запустить Вкладыше несколько сотен раз в каждом представления.

Это означает, что вы можете написать один и тот же блок на диске сотни раз. Это было бы быстрее, если бы вы могли сделать это за один шаг. Однако это действительно проблема, поскольку я не знаю никакой функции SQL, которая допускает такое поведение. MySQL INSERT предлагает способ указать несколько значений в одном статусе. Это МОЖЕТ быть значительным плюсом (я не знаю, как умный MySQL обрабатывает эту ситуацию), но он специфичен для MySQL и не переносится.

Еще один способ ускорить процесс - не дожидаться, пока блоки, которые вы изменили, записаны на диск. Это сопряжено с риском потери данных без уведомления, но может быть значительным повышением производительности. Опять же, это относится к используемой СУБД. Например. если вы используете MySQL с InnoDB, вы можете установить опцию innodb_flush_log_at_trx_commit=0 в my.ini для архивирования этого поведения.

было бы лучше, чтобы запустить простой запрос на выборку на столе клиентов (по заказу ASC), и сделать бинарный поиск или что-то по результатам

Это приведет к ненужному копирования больших объемов данные из вашей СУБД на клиента (которые могут быть на разных компьютерах, обмениваясь данными по сетевому протоколу). Это будет все еще в порядке для вашей небольшой БД, но это не очень хорошо масштабируется. Он может быть полезен только в том случае, если он поможет вам сохранить данные за одну операцию на диск.

+0

благодарит за информацию! Я хотел сделать «INSERT INTO clients (...) VALUES (...), (...) и т. Д. Однако из-за моего заявления« IF »это казалось сложным, но с предложением Bills это может случиться и ускорит мой процесс! – SNpn

Смежные вопросы