Хранение предварительно обработанного столбца varchar в базе данных вместе с исходным - PullRequest
1 голос
/ 09 марта 2010

У меня есть большая таблица с именами и фамилиями. Люди ищут эту базу данных через веб-интерфейс. PHP-код запрашивает таблицу с LOWER(@name) = LOWER(name). Чтобы ускорить поиск, я хочу создать производный столбец в таблице с именем lower_name и всегда LOWER() имен перед сохранением. Но когда дело доходит до отправки результатов в веб-интерфейс, я хочу показать оригинальные. Однако я не хочу менять структуру таблицы. Есть ли какой-то индекс, который автоматически делает хитрость или возможность создать «невидимый столбец» в SQL Server или что-то подобное?

Ответы [ 3 ]

2 голосов
/ 09 марта 2010

Вы можете создать вычисляемый столбец с указанием индекса:

ALTER TABLE YourTable ADD lower_name AS LOWER(name) PERSISTED 
go
CREATE NONCLUSTERED INDEX IX_YourTable_lower_name 
ON YourTable (lower_name)
go

Вы не ВСТАВЛЯЕТЕ и НЕ ОБНОВЛЯЕТЕ этот столбец, БД сделает это за вас и всегда будет синхронизировать его с вашим столбцом "name".

Если вы не хотите использовать вычисляемый столбец, вы можете создать представление с столбцом LOWER(name) AS lower_name и указателем для этого столбца:

http://msdn.microsoft.com/en-us/library/cc917715.aspx

1 голос
/ 09 марта 2010

У вас есть различные варианты:

  • объявить имя столбца без учета регистра, используя предложение COLLATE

  • сравнить Name и @Name с помощью предложения COLLATE

  • создайте вычисляемый столбец LowerName AS LOWER (Name) PERSISTED и индексируйте этот вычисляемый столбец

0 голосов
/ 09 марта 2010

PHP-код запрашивает таблицу с НИЖНЯЯ (@name) = НИЖНЯЯ (name)

Спасибо в мире боли. LOWER (имя) запускает сканирование таблицы. Это не делает это быстрее, это - грубо - ошибка новичка, которая убивает производительность. Никогда не следует сравнивать с вычислением полей таблицы, если только вы не получили результат в предварительно рассчитанном индексе (например, в SQL Server 2008).

Как насчет

ГДЕ имя НРАВИТСЯ @ имя

, который должен игнорировать регистр ... плюс индекс в поле имени.

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