1

Мой индекс населен с 12 миллионами строк из DatasSearch_fr таблицыFREETEXTTABLE плохой производительности с SQL Server 2008

Поля:

[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 li ка это:

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 секунд, кажется, слишком много, и это самое медленное время отклика не всегда происходит при поиске всех ключевых слов.

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

Спасибо за вашу помощь, Себастьен

+0

Я заметил в запросе план выполнения этого запроса, который займет 10 или 15 секунд, используемых параллелизм ... Я не знаю, почему. У кого-то есть идея? –

ответ

0

Используя

set statistics io on 

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

Таблица 'DatasSearch_fr'. Число сканирования 5, логическое считывание 37861, физическое чтение 0, чтение-вперед 0, логическое чтение лоб 0, физическое чтение лоб 0, считывание с чтением 0-го чтения 0.

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

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

EDIT: Ниже Query Execution Plan

|--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]'))) 

 Смежные вопросы

  • Нет связанных вопросов^_^