Столбец GUID, используемый для обновления таблицы - нужно ли ее индексировать? - PullRequest
0 голосов
/ 16 августа 2011

Я работаю над базой данных, в которой я получаю идентификатор своей записи после добавления, сохраняя и получая известный идентификатор GUID.Мое приложение работает как на SQL Server, так и на Oracle, поэтому я не могу использовать @@ IDENTITY *.

Скажем, например, я добавляю новый адрес:

ID (identity column in SQL Server;sequenced/trigger column in Oracle)
... address data... (street, town, postcode, etc.)
GUID

Я получаю идентификаторвернемся, выполнив следующее:

1. INSERT INTO ADDRESS (... address details, GUID = {some new GUID value})
2. SELECT ID FROM ADDRESS WHERE GUID = {my GUID value}
3. UPDATE ADDRESS SET GUID = NULL WHERE GUID = {my GUID value}

В первой части я добавляю детали адреса и устанавливаю значение GUID в базе данных;во второй части я получаю обратно свой идентификатор, а в третьей я удаляю значение GUID из базы данных (чтобы избежать маловероятного события дублирования GUID).

Когда я смотрю наПредполагаемый план выполнения SQL Server 2008 для третьего бита, он показывает следующий путь, если у меня нет индекса для столбца GUID:

Image shows the estimated execution plan where there's no index on the GUID column

и следующий путь, если у меня есть индексв столбце GUID:

Image shows the estimated execution plan where there's an index on the GUID column

Мой вопрос: я понимаю, что сканирование, показанное на первом изображении, не так хорошо, как поиск, показанный на втором изображении, но будетТот факт, что столбец GUID является по существу пустым 99,999% времени, означает, что я не должен индексировать поле, потому что оно будет фрагментировано все время и будет тратить ресурсы?Или же индекс все равно поможет, потому что он легко покажет мне, где мой единственный GUID, который я только что добавил, вместо того, чтобы выполнять его полное сканирование?

В итоге: учитываятот факт, что GUID добавляются, а затем сразу удаляются, есть ли смысл индексировать столбец GUID?

* На самом деле, дизайн не мой, поэтому я не могу использоватьдругой метод;однако вы должны заметить, что структура моей конкретной базы данных не влияет на мой общий вопрос.

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Да, вам обязательно нужно индексировать столбец для того, что вы делаете.Используйте отфильтрованный индекс в SQL Server (не уверен, что эквивалентно Oracle):

create index AddressGuid on ADDRESS(GUID) where GUID is not NULL;

Но есть более подходящий способ: используйте предложение OUTPUT / RETURNING из INSERT. SQL Server и Oracle поддерживают его (каждый по-своему), и вам больше не нужен обходной путь GUID.

0 голосов
/ 16 августа 2011

Если вы не индексируете этот столбец, каждый из этих операторов SELECT и UPDATE должен будет сканировать всю таблицу, чтобы найти вашу строку. Если это не то, что вы хотите, вам придется индексировать. Я бы не стал устанавливать для этого столбца GUID значение NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...