powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / TOP from Full Text Search
8 сообщений из 8, страница 1 из 1
TOP from Full Text Search
    #39798624
igor2222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста,
есть табличка на 3 млн строк с PK.
Нужно получить TOP50 последних значений (по дате) при существующем FullText индексе.
Т.е. нужно:
Код: sql
1.
2.
3.
4.
select top 50 *
FROM Content.Table1
where (CONTAINS (Title, 'Main'))
ORDER BY StartDate DESC

Такой запрос работает больше минуты (ФТС находит 450 тыс. строк, потом мапит на PK, потом сортирует и потом возвращает первые 50). Индекс по дате есть, но он не используется (судя по плану).
При этом вот такой запрос:
Код: sql
1.
2.
3.
select top 50 *
FROM Content.Table1
where (CONTAINS (Title, 'Main'))

работает 1 секунду.
Как правильно скрестить слона с носорогом?
Код: sql
1.
WITH (INDEX (IX_StartDate))

делает только хуже.
Заполнять темповую таблицу с 450 тыс строк- больше 40 секунд...
Использовать like - больше 13 секунд...
А надо 3-4 сек, не больше...
Можно ли как-то ФТС индекс завязать с датой и отсортировать? Понимаю, что бред, но всё же...
Код: sql
1.
2.
select @@VERSION 
Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64)   Aug 15 2017 10:23:29   Copyright (c) Microsoft Corporation  Developer Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor) 


Хелп! :)
...
Рейтинг: 0 / 0
TOP from Full Text Search
    #39798649
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igor2222,

не уверен, но попробуйте построить кластерный индекс по StartDate. Некластерный не сможет повлиять на порядок просмотра записей таблицы.
...
Рейтинг: 0 / 0
TOP from Full Text Search
    #39798674
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если PK кластерный, попробуйте так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select
 d.*
from
 (
  select top (50)
   a.PK
  from
   Content.Table1 a inner loop join 
   containstable(Content.Table1, Title, 'Main') b on b.[KEY] = a.PK
  order by
   a.StartDate desc
 ) c join
 Content.Table1 d on d.PK = c.PK
...
Рейтинг: 0 / 0
TOP from Full Text Search
    #39798695
igor2222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовigor2222,

не уверен, но попробуйте построить кластерный индекс по StartDate. Некластерный не сможет повлиять на порядок просмотра записей таблицы.
К сожалению, не вариант. PK кластерный. На него завязаны форейны. Я положу остальной перфоманс...
...
Рейтинг: 0 / 0
TOP from Full Text Search
    #39798700
igor2222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmЕсли PK кластерный, попробуйте так...

Спасибо, но пока не получилось :(
Весь селект остановил после 4х минут...
Внутренний с сортировкой остановил после 4х минут...
Внутренний без сортировки тоже не дождался...
А вот
Код: sql
1.
select * from containstable

выбрал 659 тыс за 5 сек...
Как бы умудриться его сортирнуть на лету?
...
Рейтинг: 0 / 0
TOP from Full Text Search
    #39798727
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igor2222Весь селект остановил после 4х минут...
Внутренний с сортировкой остановил после 4х минут...
Внутренний без сортировки тоже не дождался...Лучше планы показывать, хотя бы оценочные. И не картинкой, а в формате sqlplan

igor2222Как бы умудриться его сортирнуть на лету?Никак.
...
Рейтинг: 0 / 0
TOP from Full Text Search
    #39798760
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igor2222,

Можете попробовать вот такой изврат:
1. Добавить в таблицу вычисляемый столбец
Код: sql
1.
alter table add TitleWithRecordAge as Title + ' RecordAge:' + cast(datediff(day, getdate(), '99991231') as varchar(10))

и добавить его в FTI.
Также выключить стоп-лист.

2. Написать функцию:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create function dbo.fnGetMatchedByDate
(
 @SearchString varchar(100),
 @Date date
)
returns @result table (PK int primary key)
as
begin
 select @SearchString = @SearchString + ' and ' + cast(datediff(day, @Date, '99991231') as varchar(10));

 insert inot @result
  (PK)
  select [KEY] from containstable(Content.Table1, TitleWithRecordAge, @SearchString);

 return;
end;



3. Обеспечить в БД заполненую таблицу натуральных чисел, начиная с нуля.

4. Переписать запрос так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
 d.*
from
 (
  select top (50)
   b.PK
  from
   [Таблица чисел] a cross apply 
   dbo.fnGetMatchedByDate('Main', dateadd(day, a.Число, getdate()) b
 ) c join
 Content.Table1 d on d.PK = c.PK
...
Рейтинг: 0 / 0
TOP from Full Text Search
    #39801671
igor2222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmigor2222,
Можете попробовать вот такой изврат:


Спасибо! В прямом виде не получилось, но мысль поймал и результат есть! :)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / TOP from Full Text Search
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]