是否可以查询在 SQL 服务器中存储为二进制数据的 GZIP 文档?
Is it possible to query GZIP document stored as Binary data in SQL Server?
我有大约三万条二进制记录,全部使用 GZIP 压缩,我需要在每个文档的内容中搜索指定的关键字。目前,我正在启动时下载并提取所有文档。这很好用,但我希望每年再增加一万个。理想情况下,我想对 Binary 列本身执行 SELECT 语句,但我不知道如何去做,或者这是否可能。我想以尽可能少的离开服务器的数据执行此事务。任何帮助将不胜感激。
编辑:Sql 记录未压缩。我的意思是我在本地压缩数据并将压缩文件上传到 Binary 数据类型的 SQL Server 列。我正在寻找一种无需下载和解压缩每个文档即可查询压缩数据的方法。数据以这种方式存储以最大程度地减少开销并降低传输成本,但也必须查询数据。看起来我可能必须在服务器上存储两个版本的数据,一个被压缩以供用户下载,一个被解压缩以允许执行搜索操作。有没有更有效的方法?
为什么要压缩 30,000 或 40,000 条记录?听起来不像是一大堆数据,当然取决于记录的平均大小。
对于关键字搜索,您不应该压缩数据库记录。但是要保存在磁盘 space 上,在大多数操作系统中,可以在文件级别压缩数据,而 SQL 服务器甚至不会注意到。
更新:
正如 Vladimir 指出的那样,SQL 服务器不在压缩文件系统上 运行。然后您可以将该数据存储在两列中:一次解压缩,用于关键字搜索,一次压缩,用于改进数据传输。
将数据存储在单独的可搜索列中并不少见。例如,如果要搜索字段组合,不妨将该组合存储在搜索列中,以便为该列建立索引以加快搜索速度。在您的情况下,您可以将搜索列中的数据全部小写,并将重音字符转换为 ascii,并添加索引,以加速对 ascii 关键字的不区分大小写的搜索。
事实上,Vladimir 已经提出了这个建议。
SQL 服务器具有 Full-Text Search 功能。当然,它不会处理您在应用程序中压缩的数据。您必须将其以纯文本形式存储在数据库中。但是,它是专门为这种搜索设计的,所以性能应该不错。
SQL服务器也可以compress the data in rows or in pages, but this feature is not available in every edition of SQL Server. For more information, see Features Supported by the Editions of SQL Server。您必须衡量压缩对查询的影响。
另一种可能性是编写您自己的可在服务器上运行的 CLR 函数 - 加载压缩的二进制列,将其解压缩并进行搜索。性能很可能会比使用内置功能差。
考虑到您更新后的问题。
我认为你存储两个版本数据的想法很好。
存储压缩的二进制数据以便与服务器高效传输。
以具有适当索引(考虑全文索引)的未压缩格式存储数据的二级副本,以便通过关键字进行高效搜索。
考虑在插入过程中使用 CLR 函数来提供帮助。您可以只将压缩数据传输到服务器,然后调用 CLR 函数在服务器上解压缩它并使用未压缩的数据和索引填充辅助 table。
因此,您将同时拥有高效的 storage/retrieval 和高效的搜索,但要牺牲服务器上的额外存储空间。您可以将额外的存储空间视为有助于搜索的索引的额外结构。
我有大约三万条二进制记录,全部使用 GZIP 压缩,我需要在每个文档的内容中搜索指定的关键字。目前,我正在启动时下载并提取所有文档。这很好用,但我希望每年再增加一万个。理想情况下,我想对 Binary 列本身执行 SELECT 语句,但我不知道如何去做,或者这是否可能。我想以尽可能少的离开服务器的数据执行此事务。任何帮助将不胜感激。
编辑:Sql 记录未压缩。我的意思是我在本地压缩数据并将压缩文件上传到 Binary 数据类型的 SQL Server 列。我正在寻找一种无需下载和解压缩每个文档即可查询压缩数据的方法。数据以这种方式存储以最大程度地减少开销并降低传输成本,但也必须查询数据。看起来我可能必须在服务器上存储两个版本的数据,一个被压缩以供用户下载,一个被解压缩以允许执行搜索操作。有没有更有效的方法?
为什么要压缩 30,000 或 40,000 条记录?听起来不像是一大堆数据,当然取决于记录的平均大小。
对于关键字搜索,您不应该压缩数据库记录。但是要保存在磁盘 space 上,在大多数操作系统中,可以在文件级别压缩数据,而 SQL 服务器甚至不会注意到。
更新:
正如 Vladimir 指出的那样,SQL 服务器不在压缩文件系统上 运行。然后您可以将该数据存储在两列中:一次解压缩,用于关键字搜索,一次压缩,用于改进数据传输。
将数据存储在单独的可搜索列中并不少见。例如,如果要搜索字段组合,不妨将该组合存储在搜索列中,以便为该列建立索引以加快搜索速度。在您的情况下,您可以将搜索列中的数据全部小写,并将重音字符转换为 ascii,并添加索引,以加速对 ascii 关键字的不区分大小写的搜索。
事实上,Vladimir 已经提出了这个建议。
SQL 服务器具有 Full-Text Search 功能。当然,它不会处理您在应用程序中压缩的数据。您必须将其以纯文本形式存储在数据库中。但是,它是专门为这种搜索设计的,所以性能应该不错。
SQL服务器也可以compress the data in rows or in pages, but this feature is not available in every edition of SQL Server. For more information, see Features Supported by the Editions of SQL Server。您必须衡量压缩对查询的影响。
另一种可能性是编写您自己的可在服务器上运行的 CLR 函数 - 加载压缩的二进制列,将其解压缩并进行搜索。性能很可能会比使用内置功能差。
考虑到您更新后的问题。
我认为你存储两个版本数据的想法很好。
存储压缩的二进制数据以便与服务器高效传输。
以具有适当索引(考虑全文索引)的未压缩格式存储数据的二级副本,以便通过关键字进行高效搜索。
考虑在插入过程中使用 CLR 函数来提供帮助。您可以只将压缩数据传输到服务器,然后调用 CLR 函数在服务器上解压缩它并使用未压缩的数据和索引填充辅助 table。
因此,您将同时拥有高效的 storage/retrieval 和高效的搜索,但要牺牲服务器上的额外存储空间。您可以将额外的存储空间视为有助于搜索的索引的额外结构。