【问题标题】:SQL - combine multiple columns into one for easy select and indexSQL - 将多列合并为一列,以便于选择和索引
【发布时间】:2019-08-08 00:47:21
【问题描述】:

我有一些表必须有一些唯一索引,包括多个列。

例如;

Date       |   ChannelId   |   SellerId   |   ProductId   |   TotalSale
------------------------------------------------------------------------
2019-08-08         1              1            1                100
2019-08-08         2              1            1                100
2019-08-08         3              1            1                100
2019-08-08         4              1            1                100

我在 Date,ChannelId,SellerId,ProductId 列上有一个唯一索引。

一般情况下,我需要通过唯一索引选择一行。

我的正确查询是

SELECT Date,ChannelId,SellerId,ProductId,Total 
FROM Reports
WHERE Date = @Date 
  AND ChannelId = @ChannelId 
  AND SellerId = @SellerId  
  AND ProductId = @ProductId 

我知道WHERE 子句中的条件越多,性能就越慢。

我计划在表中添加一个 varchar 键列,以便轻松选择单行。如下所示。

Key                  |   Date       |   ChannelId   |   SellerId   |   ProductId   |   TotalSale
---------------------------------------------------------------------------------------
2019-08-08_1_1_1       2019-08-08         1              1            1                100
2019-08-08_2_1_1       2019-08-08         2              1            1                100
2019-08-08_3_1_1       2019-08-08         3              1            1                100
2019-08-08_4_1_1       2019-08-08         4              1            1                100

通过这种方式,我将有机会通过单个参数选择一行。

 SELECT Date,ChannelId,SellerId,ProductId,Total 
 FROM Reports
 WHERE [Key]= @Key 

但是,我不确定这种方法是否是一个好的选择。

我知道varchar 类型的性能会更慢。

我想了解这两种方法的优缺点。

【问题讨论】:

  • 我删除了不一致的数据库标签。请仅使用您实际使用的数据库进行标记。有你声望的人应该知道这一点。
  • 你不应该那样做。因为我需要 SQL Server 和 Postgresql 的答案。我实际上使用了这两个数据库。
  • 那你应该问两个问题。如果你得到一个答案是 Postgres 不能在 SQL Server 上运行,而 SQL Server 一个答案不能在 Postgres 上工作,你会怎么做?你接受哪一个?
  • "我知道 WHERE 子句中的条件越多,性能就越慢。" 这是一个错误的假设。由于数据库必须处理更少的行,它们通常会提高性能。

标签: sql sql-server postgresql indexing


【解决方案1】:

我知道 WHERE 子句中的条件越多,性能就越慢。

这对我来说是个新闻。如果索引中有所有列并且所有比较都是相等的,那么查找应该没问题。

在索引使用方面可能会有一些微优化——比较多个列会产生非常、非常、非常小的额外开销。但是,如果您能在这样的查询中始终如一地衡量这一点,我会感到惊讶。

【讨论】:

  • 也许我错了。但是,请考虑一个具有数百万行和数千个并发事务的表。在这种情况下比较一列或多列是一回事吗?如是!为什么我们需要键值数据库?
  • @MehmetOtkun 。 . .是的,它是相同的,并且在具有正确索引的数据库中应该是相同的。 Postgres 必须对数据页进行额外的检查以查看该行是否被锁定,但索引不会影响它。
  • @MehmetOtkun:我认为这种方法——如果有的话——可能会使事情变得变慢,因为你增加了表格的大小并添加了另一个必须维护的索引(因为您需要保留原始唯一索引以确保您的业务约束)。另外:将多个不同的东西存储到一个列中是糟糕的数据建模开始 - 如果 UPDATE 发生更改,您将如何处理该键,例如channel_id 列中的值?
猜你喜欢
  • 2023-02-23
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 2023-01-19
  • 1970-01-01
相关资源
最近更新 更多