【发布时间】:2020-08-13 08:18:15
【问题描述】:
我正在一个 sql 数据库(我估计大约 10 万条记录)上设置一个相当大的数据集(目录)来存储有关产品的信息。每个产品都有大约 20-30 个属性,所以这基本上意味着 20-30 列。系统设置为使这些属性中的每一个实际上都链接到一个代码,因此每个产品的特征在于连接所有这些属性的唯一字符串(字符串必须是唯一的,如果两个产品代码相同,则两个产品实际上是相同的产品)。我想弄清楚的是,如果 sql-wise 将目录存储为 20-30 列的表有什么不同,或者我最好只使用 1 列的代码并从代码中解码属性。不同之处在于,在一种情况下我会这样做
SELECT * FROM Catalogue WHERE Color='RED'
对
SELECT * FROM Catalogue WHERE Code LIKE '____R____________'
此外,它可能更容易检查产品是否已经存在,因为我只比较单个列与 20-30 列。我也可以在完整的表中添加一个额外的列来存储代码,并在执行一项操作时使用一种方法,在执行另一项操作时使用另一种方法。
我对 SQL 引擎的工作原理几乎一无所知,所以我可能完全不理解这里的推理。
【问题讨论】:
-
如果每个“代码”是一个单独的实体,并且要单独查询,它们应该单独存储。上面的前一个查询具有正确的索引,可能只需要查找相关行。然而,后一个查询不是 SARGable,因为前导通配符,因此需要扫描 整个 表;性能要差得多,
-
第一个近似值,将逻辑上不同的数据片段组合到一个必须再次解码的列中,您的情况几乎总是更糟。打包/解包值所需的操作会减慢查询速度并阻止使用索引。在极少数情况下它有助于存储,但即使在这种情况下,您通常最好还是使用数据压缩(无论是行还是页)。如果经常将组合列本身作为一个整体进行查询,请将其设置为带有索引的计算列。
-
完全不相关,但是:100k 行现在被认为很小。绝对不是“相当大”
标签: sql sql-server sql-like