Плохая производительность FreeTextTable с SQL Server 2008

Мой индекс заполнен 12 миллионами строк из таблицы DatasSearch_fr.

Поля:

[Id] [int] IDENTITY(1,1) NOT NULL,
[Data] [nvarchar](max) NOT NULL,
[DataId] [varchar](200) NOT NULL,
[DataTypeId] [int] NOT NULL

Используя FREETEXTTABLE следующим образом:

SELECT * FROM FREETEXTTABLE(DatasSearch_fr, (Data), 'din', LANGUAGE 1036) AS FT

Запрос мгновенно возвращает 12 000 строк

Но с помощью FREETEXTTABLE следующим образом:

SELECT DataId, DataTypeId, MAX(Rank) as Rank FROM DatasSearch_fr
INNER JOIN FREETEXTTABLE(DatasSearch_fr, (Data), 'din', LANGUAGE 1036) AS FT ON FT.[Key] = Id
Group By DataId, DataTypeId

Запрос возвращает 4400 строк за 10 или 15 секунд...

Проблема для меня не в том, что возвращаются 4400 строк, эта точка логически связана с Max(rank) и Group by... Но 10 или 15 секунд кажутся слишком большими, и это самое медленное время отклика не всегда имеет место при поиске всех ключевых слов.

Знаете ли вы способ улучшить это время отклика?

Спасибо за помощь, Себастьян.


person Sébastien.B    schedule 17.07.2013    source источник
comment
Я заметил в плане выполнения запроса, что запрос, который занимает 10 или 15 секунд, использует параллелизм... Я не знаю, почему. У кого-нибудь есть идея?   -  person Sébastien.B    schedule 18.07.2013


Ответы (1)


Используя

set statistics io on

У меня есть этот результат:

Таблица «DatasSearch_fr». Количество сканирований 5, логических операций чтения 37861, физических операций чтения 0, упреждающего чтения 0, логических операций чтения больших объектов 0, физических операций чтения больших объектов 0, операций упреждающего чтения больших объектов 0.

Стол «Рабочий стол». Количество сканирований 0, логических операций чтения 0, физических операций чтения 0, упреждающего чтения 0, логических операций чтения 0 объектов, физических операций чтения 0 объектов, операций упреждающего чтения 0 объектов.

Если у кого-то есть идея. :)

РЕДАКТИРОВАТЬ: ниже план выполнения запроса

  |--Parallelism(Gather Streams)
       |--Hash Match(Aggregate, HASH:([DataBase].[dbo].[DatasSearch_fr].[DataId], [DataBase].[dbo].[DatasSearch_fr].[DataTypeId]), RESIDUAL:([DataBase].[dbo].[DatasSearch_fr].[DataId] = [DataBase].[dbo].[DatasSearch_fr].[DataId] AND [DataBase].[dbo].[DatasSearch_fr].[DataTypeId] = [DataBase].[dbo].[DatasSearch_fr].[DataTypeId]) DEFINE:([Expr1007]=MAX(CONVERT(int,[Expr1005],0))))
            |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([DataBase].[dbo].[DatasSearch_fr].[DataId], [DataBase].[dbo].[DatasSearch_fr].[DataTypeId]))
                 |--Hash Match(Inner Join, HASH:(FulltextMatch.[docid])=([DataBase].[dbo].[DatasSearch_fr].[Id]))
                      |--Bitmap(HASH:(FulltextMatch.[docid]), DEFINE:([Bitmap1012]))
                      |    |--Stream Aggregate(GROUP BY:(FulltextMatch.[docid]) DEFINE:([Expr1005]=MAX([Expr1004])))
                      |         |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:(FulltextMatch.[docid]), ORDER BY:(FulltextMatch.[docid] ASC))
                      |              |--Stream Aggregate(GROUP BY:(FulltextMatch.[docid], FulltextMatch.[colid]) DEFINE:([Expr1004]=SUM([Expr1008])))
                      |                   |--Compute Scalar(DEFINE:([Expr1008]=freetexttablerank((0),FulltextMatch.[termfrequency],FulltextMatch.[columnweight]*CONVERT_IMPLICIT(float(53),FulltextMatch.[documentlength],0),FulltextMatch.[columnweight]*CONVERT_IMPLICIT(float(53),FulltextMatch.[avdl],0),FulltextMatch.[termweight])))
                      |                        |--Parallelism(Distribute Streams, Hash Partitioning, PARTITION COLUMNS:(FulltextMatch.[docid], FulltextMatch.[colid]))
                      |                             |--Table-valued function
                      |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([DataBase].[dbo].[DatasSearch_fr].[Id]))
                           |--Index Scan(OBJECT:([DataBase].[dbo].[DatasSearch_fr].[IX_DatasSearch_fr_IdNew]),  WHERE:(PROBE([Bitmap1012],[DataBase].[dbo].[DatasSearch_fr].[Id],N'[IN ROW]')))
person Sébastien.B    schedule 18.07.2013