Допустим, у нас есть база данных из 12 миллионов имен и адресов, которые необходимо искать с помощью полнотекстового поиска, но каждая строка также содержит целочисленное значение, скажем COMPANYID
. Таблица содержит около 250 различных идентификаторов COMPANYID по этим 12 миллионам строк.
Можно ли при определении полнотекстовых индексов дать каждой COMPANY
своей «ветке» в дереве?
company
, и всем так понравилось, что они хотят, чтобы я запустил его в производство для всех компаний, и у меня не было возможности создать макет с 12 миллионами значимых фиктивных строк данных. еще. Такие значения, как «Фамилия1», «Фамилия2», «Город1» и т. Д. Не будут иметь достаточного отклонения и могут исказить результаты теста. Данные меняются так часто, что я не уверен, что SQL Server будет достоверно знать, какой индекс является более узким в любом конкретном запросе, а количество строк в каждой компании сильно различается. Одна компания может иметь только 1000 строк, другая - 60 000.Ответы:
Нет, это короткий ответ, и вам это не нужно. Полнотекстовые индексы являются инвертированными, поэтому в них хранятся разделенные слова по уникальному doc_id, который необходимо указать при создании полнотекстового индекса. Это должен быть «уникальный столбец без ключа, однозначный ключ», в идеале - целое число. То, что по сути является внешним ключом, не фигурирует, и нет простого способа разделить их на этой основе.
Вы можете подделать что-то вроде этого с таблицей для каждой компании и полнотекстовым индексом для таблицы. Вам понадобится какая-то кодовая логика, сидящая впереди, чтобы определить, из какой таблицы вставить / извлечь из. Это было бы значительной головной болью, с которой почти невозможно справиться.
Если у вас был какой-то серьезный объем (например, более 23 миллиардов записей), то вы могли бы взглянуть на решение с сегрегацией, например что-то вроде виртуальной машины Azure для каждой компании с приложением, расположенным перед ними, чтобы определить, к какой машине подключаться. Но, очевидно, вам это тоже не нужно.
В SQL 2008 также был ряд улучшений для полнотекстового, который теперь более интегрирован в ядро базы данных. Один сценарий, в котором вы задаете предложение WHERE для обычного столбца и используете полнотекстовые функции, называется «смешанным запросом» и обсуждается здесь . Это все еще отличная статья, хотя информация для SQL 2008.
Если вы, как правило, беспокоитесь о производительности и планах, почему бы не ускорить некоторые тестовые данные, представьте некоторые перекосы и попробуйте их. Я выбил этот скрипт с ~ 2 миллионами строк за несколько минут:
источник