Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ускорение выборки из нескольких таблиц  [new]
Mokronozhka
Member

Откуда:
Сообщений: 11
Добрый день.
Прошу помочь ускорить выборку в MS SQL.
Есть 2 таблицы, не постоянные, загружаются на время работы пользователя с документом в программе 1С, затем удаляются при закрытии документа, минут через 10-30.

Таблица 1 содержит запросы, слова 1-7 - это слова из этого запроса, разбитые по колонкам:
Запрос nvarchar(max),
Слово1 nvarchar(50),
Слово2 nvarchar(50),
Слово3 nvarchar(50),
Слово4 nvarchar(50),
Слово5 nvarchar(50),
Слово6 nvarchar(50),
Слово7 nvarchar(50),

Таблица загружается из файла при помощи bulk insert.
Пример строк для загрузки:
" отслеживание почтовых отправлений ems из китая ;отслеживание;почтовых;отправлений;ems;из;китая;;61"
" что такое отправление ems ;что;такое;отправление;ems;;;;39"

Таблица 2 содержит группы и слова, принадлежащие этим группам:
ИдентификаторГруппы nvarchar(36),
СловоГруппы nvarchar(50)

Таблица тоже загружается из файла.
Пример строк для загрузки:
"140581cf-4995-43b9-b1bb-e8865559ad9d;китая"
"2f5f2ad3-29b1-4f25-80ce-a7141c353b9e;больницам"

Задача - выбрать из таблицы 1 все строки, в которых содержатся слова из таблицы 2.
Условий может быть от 1 до 5.
Например, выбрать из таблицы 1 все строки, в которых содержатся слова из таблицы 2, где ИдентификаторГруппы = <ПервыйИД> и ИдентификаторГруппы = <ВторойИД>.

Я делал запрос след. образом (пример из 2х условий, максимум может быть 5 условий):

+ Текст запроса
select distinct
	Запрос,
	Слово1,
	Слово2,
	Слово3,
	Слово4,
	Слово5,
	Слово6,
	Слово7
from
	Таблица1 as Т1 
where 

	(exists (	select
				Слово
			from
				Таблица2 as Т2
			where
				(Т2.ИдентификаторГруппы = '2f5f2ad3-29b1-4f25-80ce-a7141c353b9e') and
				(Т1.Слово1 = Т2.СловоГруппы or
				Т1.Слово2 = Т2.СловоГруппы or
				Т1.Слово3 = Т2.СловоГруппы or
				Т1.Слово4 = Т2.СловоГруппы or
				Т1.Слово5 = Т2.СловоГруппы or
				Т1.Слово6 = Т2.СловоГруппы or
				Т1.Слово7 = Т2.СловоГруппы)))

	and

	(exists (	select
				Слово
			from
				Таблица2 as Т2
			where
				(Т2.ИдентификаторГруппы = 'b0a1fd38-7dc9-40c7-a793-551094310010') and
				(Т1.Слово1 = Т2.СловоГруппы or
				Т1.Слово2 = Т2.СловоГруппы or
				Т1.Слово3 = Т2.СловоГруппы or
				Т1.Слово4 = Т2.СловоГруппы or
				Т1.Слово5 = Т2.СловоГруппы or
				Т1.Слово6 = Т2.СловоГруппы or
				Т1.Слово7 = Т2.СловоГруппы)))


Выборка получается очень долгой, причем в таблицу 1 всегда загружается от 1 до 50 млн строк. В таблице строк примерно 5000.
Может есть какой-то другой способ выборки или нужно создать индексы?
Создавал некластеризированные индексы для колонок Слово1-Слово7 таблицы 1, и по двум колонкам таблицы 2, выборка вообще не ускорилась.
Прошу помощи, т.к. опыта работы с большими объемами данных нет.
11 окт 16, 11:42    [19768132]     Ответить | Цитировать Сообщить модератору
 Re: Ускорение выборки из нескольких таблиц  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5121
имхо,
учитывая
Mokronozhka
Есть 2 таблицы, не постоянные, загружаются на время работы пользователя с документом в программе 1С, затем удаляются при закрытии документа
написать на каком нибудь Perl скрипт который будет искать ваши вхождения строк за миллисекунды и не забивать шурупы молотком...
11 окт 16, 22:35    [19771282]     Ответить | Цитировать Сообщить модератору
 Re: Ускорение выборки из нескольких таблиц  [new]
AHDP
Member

Откуда:
Сообщений: 1226
Mokronozhka,

Выбрать из таблицы 1 все строки != select distinct

1) Я б сделал так:
1.1) Подготовка:
1.1.1) Добавить ключевое поле в таблицу 1;
1.1.2) Создать индексы для каждой колонки с включением ключа;
1.2) Выборка:
1.2.1) Получить временную таблицу с ключевыми словами;
1.2.2) Получить кличи таблицы 1 по каждой колонке;
1.2.3) Получить по ключу строки

2) Если условия можно как-то отождествить с колонками:
2.1) Использовать Join
2.2) Создавать таблицу 1 с кластерным индексом по всем полям, которые могут участвовать в условии. Или даже несколько таблиц под условия выборки.

3) Для единственной выборки - сразу получать нужные данные.


P.S. Исходя из
(Т1.Слово1 = Т2.СловоГруппы or
Т1.Слово2 = Т2.СловоГруппы or
Т1.Слово3 = Т2.СловоГруппы or
Т1.Слово4 = Т2.СловоГруппы or
Т1.Слово5 = Т2.СловоГруппы or
Т1.Слово6 = Т2.СловоГруппы or
Т1.Слово7 = Т2.СловоГруппы)
SQL вполне логично игнорирует созданные вами индексы по колонкам.
12 окт 16, 09:21    [19771795]     Ответить | Цитировать Сообщить модератору
 Re: Ускорение выборки из нескольких таблиц  [new]
Mokronozhka
Member

Откуда:
Сообщений: 11
Всем большое спасибо за советы.
Решил задачу через внутренние соединения, выигрыш в 7,5 раз. 43 сек против 5,5 минут.
12 окт 16, 13:03    [19772994]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить