РЕДАКТИРОВАТЬ 2: Если подумать, сколько из этих масок начинаются с и и заканчиваются символами подстановки?Сначала вы можете повысить производительность:
- Индексирование
CUST_PO_NUMBER
- Создание сохраняемого вычисляемого столбца
CUST_PO_NUMBER_REV
, обратного CUST_PO_NUMBER
- Индексированиепостоянный столбец
- Размещение статистики по этим столбцам
Тогда вы можете построить три запроса и UNION ALL
результаты вместе:
SELECT ...
FROM ...
ON CUSTOM_PO_NUMBER LIKE CustomerMask
WHERE /* First character of CustomerMask is not a wildcard but last one is */
UNION ALL
SELECT ...
FROM ...
ON CUSTOM_PO_NUMBER_REV LIKE REVERSE(CustomerMask)
WHERE /* Last character of CustomerMask is not a wildcard but first one is */
UNION ALL
SELECT ...
FROM ...
ON CUSTOM_PO_NUMBER LIKE CustomerMask
WHERE /* Everything else */
Это просто быстроНапример, вам нужно позаботиться о том, чтобы предложения WHERE
давали вам взаимоисключающие результаты (или используйте UNION
, но сначала стремитесь к взаимоисключающим результатам).
Если вы можете сделать это, выдолжно иметь два запроса с использованием поиска по индексу и один запрос с использованием сканирования по индексу.
РЕДАКТИРОВАТЬ: Можно внедрить систему сегментирования для распределения таблиц клиентов и масок клиентов по нескольким серверам, а затемСервер оценивает 1/n
% результатов.Вам не нужно разбивать данные - подойдет простая репликация всего содержимого каждой таблицы.Подключите серверы к вашему главному серверу, и вы можете сделать что-то с эффектом:
SELECT ... FROM OPENQUERY(LinkedServer1, 'SELECT ... LIKE ... WHERE ID BETWEEN 0 AND 99')
UNION ALL
SELECT ... FROM OPENQUERY(LinkedServer2, 'SELECT ... LIKE ... WHERE ID BETWEEN 100 AND 199')
Примечание: OPENQUERY
может быть посторонним, SQL Server может быть достаточно умен для оценки запросов на удаленномсерверы и поток результатов обратно.Я знаю, что он не делает этого для связанных серверов JET, но он мог бы лучше справляться со своим собственным видом.
Это или с помощью большего количества оборудования в проблеме.
Выможно создать индексированное представление вашего запроса для повышения производительности.
с Проектирование индексированных представлений :
Для стандартного представления издержки динамического построения результирующего набора для каждого запроса, который ссылается на представление, могут быть значительными для представлений, которые включают в себя сложную обработку большого количества строк, например, агрегирование большого количества данных или объединение множества строк.Если на такие представления часто ссылаются в запросах, вы можете повысить производительность, создав уникальный кластеризованный индекс для представления.Когда в представлении создается уникальный кластеризованный индекс, результирующий набор сохраняется в базе данных так же, как хранится таблица с кластеризованным индексом.
Еще одно преимущество создания индекса для представления состоит в том, что оптимизатор запускаетсяиспользование индекса представления в запросах, которые непосредственно не называют имя в предложении FROM. Существующие запросы могут извлечь выгоду из улучшенной эффективности извлечения данных из индексированного представления без необходимости перекодирования.
Это должно повысить производительность этого конкретного запроса, но учтите, что вставки, обновления и удаление в используемые им таблицы могут быть замедлены.