我已经在我的 SQL Server DB 上的一varbinary(max)
列上设置了全文索引。我指定了一个类型列,其中包含文件的扩展名,例如“.doc”、“.pdf”等。
但是,我注意到当任何 .rtf 文件被索引时,SQL 将包含文件中的所有元信息(例如 RTF 标记“listoverridecount0”)。
这使索引膨胀很多,也意味着搜索将匹配这些标签(即我可以搜索“listoverridecount0”并返回每个 .rtf)。
.rtf 的 iFilter 是否有任何理由不会删除 RTF 标签?
当我运行这个:
SELECT * FROM sys.fulltext_document_types WHERE document_type = '.rtf';
Run Code Online (Sandbox Code Playgroud)
我明白了:
document_type .rtf
class_id C7310720-AC80-11D1-8DF3-00C04FB6EF4F
path c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\msfte.dll
version 12.0.6828.0
manufacturer Microsoft Corporation
Run Code Online (Sandbox Code Playgroud)
我已提交Microsoft Connect 错误,因为我似乎无法找到任何解决方法。据推测,这是 a) RTF iFilter 未删除标签的错误,或 b) 全文索引问题。
我的 SQL Server 版本是:
Microsoft SQL Server 2012 (SP1) - 11.0.3393.0 (X64) 2013 年 10 月 25 日 19:04:40 版权所有 (c) 微软公司 …
我最近继承了一个包含大量存储过程的代码库。他们支持的系统遇到了许多我正在研究的性能问题。
许多存储过程都有这样的模式:
建立动态 SQL 查询以插入一堆记录,例如
DECLARE @sql VARCHAR(MAX)
SET @sql = 'INSERT INTO @tempTable
SELECT SomeColumn, SomeColumn2, SomeColumn3, etc FROM MyTable'
IF @someParam = [SomeValue]
SET @sql = @sql + 'WHERE SomeColumn = [SomeValue]';
IF @someOtherParam = [SomeOtherValue]
SET @sql = @sql + 'WHERE SomeOtherColum = [SomeOtherValue]';
Run Code Online (Sandbox Code Playgroud)执行这个动态sql
EXEC(@sql);
Run Code Online (Sandbox Code Playgroud)从临时表中选择并带入一堆附加信息以返回给客户端。
SELECT
...
FROM
@tempTable
INNER JOIN ...
Run Code Online (Sandbox Code Playgroud)我的即时想法是:
INSERT
SELECT
模式,所以表锁定更有可能是一个问题。我用这种方式重写了一些存储过程:
SELECT
...
FROM
MyTable
INNER JOIN ...
WHERE
(
@someParam != SomeValue
OR
SomeColumn …
Run Code Online (Sandbox Code Playgroud) performance sql-server stored-procedures t-sql query-performance performance-tuning