2016-12-27 1 views
2

У меня есть строка «ключ», которую мне нужно сохранить в столбце базы данных SQL Server. Этот ключ представляет собой список токенов, разделенных точками, любого размера. Примеры:Как индексировать строковые значения SQL Server для оптимизации поиска по шаблону слева?

keanu 
2016.sucked 
foo.bar.baz 
the.cake.is.a.lie 

мне нужно будет искать строки по любой коллекции жетонов с левой. Таким образом, я мог бы найти все маркеры, которые начинаются :

foo 
foo.bar 
foo.bar.baz 

(Очевидно, что последний из них весь маркер).

Единственный способ я знаю, как сделать это в SQL есть с LIKE оператором:

SELECT * FROM [table] WHERE key LIKE 'foo.%' 

Насколько это плохо? LIKE имеет репутацию проблем с производительностью, но так как я всегда ищу от левого конца строки и оставляю правый конец открытым - это помогает?

я имел мимолетную идею сделать что-то вроде этого:

| key   | base1 | base2 | base3  | 
|-------------|-------|----------|-------------| 
| foo.bar.baz | foo. | foo.bar. | foo.bar.baz | 

Очевидно, я должен был бы иметь N столбцов для baseX, что ужасно, но нет никаких сомнений, что это будет быстро.

Предполагая, что я использую простое поле VARCHAR, есть ли способ индексировать это поле, чтобы сделать его приемлемым, когда я получу миллион строк данных здесь?

+0

Просто создайте на нем некластерный указатель, и вы получите упорядоченное сканирование, если «%» находится справа. Идея создания n столбцов плоха на многих уровнях, поэтому лучше забудьте об этом прямо сейчас. – dean

+2

Если вы используете 'key like 'foo.%'', Тогда можно использовать индекс на 'key' *. Только когда у вас есть главный шаблон, который становится не-SARGable – alroc

+0

** 2016.sucked ** lol;) –

ответ

2

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

Но в вашем случае промежуточные узлы значения ключа можно найти из корня B-дерева, так как мы знаем стартовые символы. Создание столбца Non clustered Index на key должно помочь вам. Следующий запрос по-прежнему является приемлемым.

SELECT * FROM [table] WHERE key LIKE 'foo.%'