全文索引和数据库结构

kev*_*n80 5 sql-server

首先原谅我,我不是DBA,我们公司真的没有DBA。我是一名开发人员,谷歌搜索答案已经无济于事了。提前致谢。

我的问题是关于我们数据库的最佳结构。我们有一个网站,允许用户轻松搜索和查找 PDF。大多数情况下它只是元数据搜索,但我们确实允许全文搜索(所有单词、任何单词、精确短语)。

大约有 300 万个 PDF(每天增加),大小约为 2.3 TB。这些使用 VARBINARY(MAX) 存储在对应日期的表中(File1980、File1990、File2000 等)。我们没有把它做成一个单一的表,因为我们的系统管理员在备份方面遇到了麻烦。每个文件表(File1990 等)都有自己的 MDF 文件。

我们的网站使用 Microsoft 动态数据和实体框架。我们使用下面与 LINQ 查询的其余部分连接的表值函数之一在 PDF 中进行搜索。

ALTER FUNCTION [dbo].[udf_ContainsSearch]   (@keywords nvarchar(4000))
RETURNS @containsTable TABLE
(
    [key] [uniqueidentifier] NOT NULL, --PRIMARY KEY NONCLUSTERED,
    [rank] [int] NOT NULL
    PRIMARY KEY NONCLUSTERED ([key], [rank])

)

AS
BEGIN
    insert into @containsTable 

    select [key],[rank] from ContainsTable(File2010,Content,@keywords)
    union  
    select [key],[rank] from  ContainsTable(File2000,Content,@keywords)
    union    
    select [key],[rank] from  ContainsTable(File1990,Content,@keywords)
    union    
    select [key],[rank] from  ContainsTable(File1980,Content,@keywords)
    union    
    select [key],[rank] from  ContainsTable(File1970,Content,@keywords)

    RETURN
END

ALTER FUNCTION [dbo].[udf_FreetextSearch]   (@keywords nvarchar(4000))
RETURNS @containsTable TABLE
(
    [key] [uniqueidentifier]  NOT NULL, --PRIMARY KEY NONCLUSTERED,
    [rank] [int] NOT NULL
    PRIMARY KEY NONCLUSTERED ([key], [rank]) 
)

AS
BEGIN
    insert into @containsTable 

        select [key],[rank] from FreetextTable(File2010,Content,@keywords)
        union  
        select [key],[rank] from  FreetextTable(File2000,Content,@keywords)
        union    
        select [key],[rank] from  FreetextTable(File1990,Content,@keywords)
        union    
        select [key],[rank] from  FreetextTable(File1980,Content,@keywords)
        union    
        select [key],[rank] from  FreetextTable(File1970,Content,@keywords)

    RETURN
END
Run Code Online (Sandbox Code Playgroud)

我们一直在网站上遇到超时问题,并一直在研究性能。运行数据库调谐器并在一周的查询中添加一些索引有帮助,但还不够。

现在的问题:

有没有更好的方法来构造数据以提供更好的性能?

我们使用专业的 SQL Server 2008,Enterprise 会帮助我们吗?

全文搜索部分有更好的方法吗?

小智 0

您是否尝试用单独的插入语句替换 insert..union 语句?

例如:

insert into @containsTable select [key],[rank] from ContainsTable(File2010,Content,@keywords)
insert into @containsTable select [key],[rank] from ContainsTable(File2000,Content,@keywords)
insert into @containsTable select [key],[rank] from ContainsTable(File1990,Content,@keywords)
insert into @containsTable select [key],[rank] from ContainsTable(File1980,Content,@keywords)
insert into @containsTable select [key],[rank] from ContainsTable(File1970,Content,@keywords)   
Run Code Online (Sandbox Code Playgroud)

它可能很简单,因为联合的处理成本增加,加上同时打开 5 个进程在该插入上使用它们而增加的内存使用量,从而减慢了 UDF 的速度。

(此外,由于您是从不相关的数据表中查询,因此联合的“不同”部分应该是不必要的。)