У меня есть строка «ключ», которую мне нужно сохранить в столбце базы данных 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
, есть ли способ индексировать это поле, чтобы сделать его приемлемым, когда я получу миллион строк данных здесь?
Просто создайте на нем некластерный указатель, и вы получите упорядоченное сканирование, если «%» находится справа. Идея создания n столбцов плоха на многих уровнях, поэтому лучше забудьте об этом прямо сейчас. – dean
Если вы используете 'key like 'foo.%'', Тогда можно использовать индекс на 'key' *. Только когда у вас есть главный шаблон, который становится не-SARGable – alroc
** 2016.sucked ** lol;) –