2016-04-18 6 views
0

Мне нужен совет, как получить быстрый результат для запросов на таблице большого размера. Я использую SQL Server 2012, мое состояние выглядит так:Самое быстрое время выполнения запросов на таблицу большого размера

У меня 5 таблиц содержит запись транзакции, каждая таблица содержит 35 миллионов записей. Все таблицы имеют 14 столбцов, столбцы, которые мне нужно найти, - это GroupName, CustomerName и NoRegistration. И у меня есть представление, которое содержит 5 из всех этих таблиц. Записи GroupName, CustomerName и NoRegistration не являются уникальными для каждой таблицы.

У моего приложения есть функция для поиска в этом столбце. Этот запрос, как это:

Поиск по названию группы:

SELECT DISTINCT(GroupName) FROM TransactionRecords_view WHERE GroupName LIKE ''[email protected]+'%' 

Поиск по имени:

SELECT DISTINCT(CustomerName) AS 'CustomerName' FROM TransactionRecords_view WHERE CustomerName LIKE ''[email protected]+'%' 

Поиск по NoRegistration:

SELECT DISTINCT(NoRegistration) FROM TransactionRecords_view WHERE LOWER(NoRegistration) LIKE LOWER(@NoRegistration)+'%' 

Мой вопрос, как может Я добился самого быстрого времени выполнения для поиска? С моим состоянием прямо сейчас, каждый раз, когда я искал, это заняло 3 - 5 минут.

Моя идея состоит в том, чтобы создать новые таблицы, содержащие различные имена GroupName, CustomerName и NoRegistration из всех 5 таблиц.

Является ли моя идея делать время выполнения быстрее? или любая другая идея?

Спасибо


EDIT:

Это запрос для просмотра "TransactionRecords_view"

CREATE VIEW TransactionRecords_view 
AS 
SELECT * FROM TransactionRecords_1507 
UNION ALL 
SELECT * FROM TransactionRecords_1506 
UNION ALL 
SELECT * FROM TransactionRecords_1505 
UNION ALL 
SELECT * FROM TransactionRecords_1504 
UNION ALL 
SELECT * FROM TransactionRecords_1503 
+0

Так столбцы Введенные в строки? Вы можете ввести новую транзакцию с помощью GroupName 'NewGroup', и если вы случайно использовали это несколько лет назад, новая транзакция совпадает в одной группе? Но если есть опечатка типа «NewGrooup», то это по совпадению группа? Я предпочел бы ожидать таблицу GroupName с транзакциями, ссылающимися на ее записи. –

+0

'SELECT * ... UNION ALL'? Итак, ваши пять таблиц структурированы одинаково? Почему тогда у вас есть пять столов, а не один? Разве это не было бы намного лучше? –

+0

@ThorstenKettner, потому что это транзакционные записи каждый месяц. другая функция в моих приложениях вычисляет транзакцию в месяц, в прошлом месяце и в прошлом году, поэтому я думал, что разделить ее на каждый месяц даст лучшую производительность. – user1008497

ответ

1

Итак, вам не нужно создавать эти новые таблицы. Если вы создаете индексы без кластеризации на основе этих полей, он (по сути) сделает то, что вам нужно. Индекс будет хранить данные только по столбцам, а не по всей таблице. Однако имейте в виду, что индексы отлично помогают в операторах SELECT, но будут отрицательно влиять на любые записи (INSERT, UPDATE и т. Д.).

Далее вы хотите запустить запросы с включенным планом выполнения. Это покажет вам, как оптимизатор решил запустить каждый запрос (в конце). Существуют ли какие-либо конкретные проблемы здесь, какие-либо из шагов, требующих большой общей стоимости оператора? Есть много отличных учебных видеороликов о планах исполнения на youtube, проверьте их, если вы еще не смотрели планы exe.

+1

Спасибо за ваш совет. Я запускаю запрос, используя фактическое время выполнения, и пропускаю 2 индекса. – user1008497

3

Вы должны показать СКП TransactionRecords_view. У вас есть индексы? Что такое сортировка столбца NoRegistration? Вставьте фактический план выполнения для каждого запроса.

+1

IS, что ** Ответ ** или ** Комментарий **. –

+0

Я уже индексирую все таблицы, но это только для другой и более важной функции в моем приложении. Забудьте об индексировании для этой функции. Использование фактического плана выполнения и отсутствие двух индексов. Спасибо – user1008497

+0

@NeerajPrasadSharma это комментарий с ответом, чтобы рассмотреть сам :) –

0

Вы пытались проверить, отсутствуют ли индексы с фактическим планом выполнения?

Кроме того, поскольку вы используете предложение на varchar, я слышал о полнотекстовом поиске.может быть, это может быть полезно для вас:

https://msdn.microsoft.com/en-us/library/ms142571(v=sql.120).aspx

+0

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