首先原谅我,我不是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 的速度。
(此外,由于您是从不相关的数据表中查询,因此联合的“不同”部分应该是不必要的。)
归档时间: |
|
查看次数: |
521 次 |
最近记录: |