Я бы сказал, что тестирование требуется, но приятно знать опыт других народов. По моему опыту на сервере ms sql, значения NULL могут и могут вызвать серьезные проблемы с производительностью (различия). В очень простом тесте теперь я видел, как запрос возвращался через 45 секунд, когда не было установлено значение null в связанных полях в инструкции create table и более 25 минут, где она не была установлена (я отказался от ожидания и просто взял пик на оценочный план запроса).
Данные испытаний - 1 миллион строк x 20 столбцов, которые построены из 62 случайных строчных альфа-символов на стандартном ядре i5-3320 и 8 ГБ оперативной памяти (SQL Server с использованием 2 ГБ)/SQL Server 2012 Enterprise Edition на Windows 8.1. Важно использовать случайные данные/нерегулярные данные, чтобы сделать тестирование реалистичным «худшим» случаем. В обоих случаях таблица воссоздавалась и перезагружалась случайными данными, которые занимали около 30 секунд в файлах базы данных, которые уже имели подходящее количество свободного места.
select count(field0) from myTable where field0
not in (select field1 from myTable) 1000000
CREATE TABLE [dbo].[myTable]([Field0] [nvarchar](64) , ...
vs
CREATE TABLE [dbo].[myTable]([Field0] [nvarchar](64) not null,
по соображениям эффективности обе имели параметр таблицы data_compression = набор страниц, а все остальное было по умолчанию. Нет индексов.
alter table myTable rebuild partition = all with (data_compression = page);
Не имея аннулирует является требование в памяти оптимизировано таблиц, для которых я специально не используя однако SQL-сервер, очевидно, будет делать то, что является самым быстрым, который в данном конкретном случае, как представляется, в широком масштабе в пользу не имея провалов в данные и использование не null в таблице create.
Любые последующие запросы в той же форме в этой таблице возвращаются через две секунды, поэтому я бы предположил, что стандартная статистика по умолчанию и, возможно, таблица (1.3 ГБ), помещенная в память, работают хорошо. т.е.
select count(field19) from myTable where field19
not in (select field18 from myTable) 1000000
На в стороне, не имеющие нули и не иметь дело с нулевыми случаями также делает запросы, много проще, короче, меньше ошибок и очень нормально быстрее. Если это вообще возможно, лучше избегать нулей, как правило, на сервере ms sql, по крайней мере, если они явно не требуются и не могут быть разумно разработаны из решения.
Начиная с новой таблицы и ее размера до 10 м строк/13 ГБ один и тот же запрос занимает 12 минут, что очень респектабельно, учитывая аппаратные средства и не используемые индексы. Для информационного запроса было полностью привязано IO с IO, зависающим от 20 МБ/с до 60 МБ/с. Повторение того же запроса заняло 9 минут.
Jakob, с какими проблемами с производительностью вы столкнулись с NULL? –
хорошо - проблем пока нет. Но я помню, что я прочитал статью о более низкой производительности при использовании нулевых значений. Итак, в нашей команде началось обсуждение вопроса о том, нужно ли нам разрешать нулевые значения или нет, - и мы еще не пришли к какому-либо заключению. У нас есть несколько очень больших таблиц с миллионами строк в нем и с большим количеством клиентов, поэтому для проекта это довольно большое изменение. Но клиенты подняли вопрос о производительности в поисковой системе. –
Если у вас есть проблемы с производительностью в поисковой системе, я бы посмотрел много других мест, прежде чем устранять нули. Начните с индексации. Посмотрите на планы выполнения, чтобы увидеть, что на самом деле происходит. Посмотрите на вас, где есть статьи, чтобы узнать, являются ли они доступными. Посмотрите, что вы возвращаете, вы использовали select * (плохо для производительности, если у вас есть соединение, поскольку одно поле, по крайней мере, повторяется, таким образом, wating nework), вы использовали подзапросы вместо соединений? Вы использовали курсор? Является ли предложение where достаточно эксклюзивным? Вы использовали подстановочный знак для первого персонажа? И дальше, и так далее. – HLGEM