Как избежать тайм-аутов с помощью полнотекстового поиска SqlServer? - PullRequest
1 голос
/ 26 августа 2010

Мы используем SqlServer 2008. В SSMS запросы в полнотекстовом каталоге в первый раз могут занимать 2-5 секунд, но после этого возвращаются довольно быстро.

С другой стороны, выполнениезапрос от через Linq2Sql будет тайм-аут.

Вот что мы имеем:

UDF Inline Table SQL

CREATE FUNCTION dbo.SearchArchiveFTS
(   
    @query nvarchar(255)
)
RETURNS @ret TABLE 
(
            ID      NVarChar(12) NOT NULL,
            snapshotDate    DateTime NOT NULL,
            -- about 10 more
)
AS BEGIN
    declare @innerQuery nvarchar(255)
    set @innerQuery = @query
    insert into @ret
    select      ID,
                snapshotDate,
                -- about 10 more
        from dbo.Archive a
        where contains(a.*, @innerQuery)
    return

Запрос в SSMS

select * from dbo.SearchArchiveFTS('query')
//3 seconds / 3k rows

Запрос в Linq2Sql

db.SearchArchiveFTS("query").ToArray();
// timeout exception

Есть идеи о том, в чем может быть проблема?

Ответы [ 3 ]

0 голосов
/ 26 августа 2010

Я согласен с @SQLMenace, когда что-то быстро работает в SSMS, но не из приложения, это обычно разница в соединении.

Однако зачем использовать функцию для чего-то подобного?

если вы должны использовать функцию, почему бы не использовать функцию табличного значения, например:

CREATE FUNCTION dbo.SearchArchiveFTS
(   
    @query nvarchar(255)
)
RETURNS TABLE 
AS RETURN
(
    select      ID,
                snapshotDate,
                -- about 10 more
        from dbo.Archive a
        where contains(a.*, @query)
);
0 голосов
/ 10 сентября 2010

Проблема, по-видимому, связана с функцией SQL Server, где индексы FTS выгружаются после определенного периода бездействия. Фоновая работа, чтобы держать их свежими, решила проблему.

0 голосов
/ 26 августа 2010

Убедитесь, что ваше соединение не входит с arithabort off. В SSMS он включен

Вы можете легко проверить, как это

select arithabort,* 
from sys.dm_exec_sessions
where is_user_process =1

просто найдите SPID, который попадает в БД

Вы также пытаетесь увидеть, что происходит, когда вы делаете это в SSMS

SET ARITHABORT OFF 
select * from dbo.SearchArchiveFTS('query')

Теперь это занимает намного больше времени?

Также возможно, что вы получаете плохой план от LINQ

Вы можете очистить кэш процедур и буферы памяти, выполнив следующую команду

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Просто имейте в виду, что он уничтожит все планы на сервере, и SQL Server придется заново создать их, а также снова прочитать все данные с диска .......

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...