我最近开始在一家拥有巨大“企业”的公司工作。应用。在我上一份工作中,我设计了数据库,但是在这里我们有一个我不属于的整个数据库架构部门。

他们的数据库中的一个奇怪的事情是他们有一堆视图,而不是让用户提供他们想要看到的日期范围,而是与(全局临时)表“TMP_PARM_RANG”连接。有一个开始和结束日期。每当主应用程序开始处理请求时,它首先执行它“ DELETE FROM TMP_PARM_RANG ;"然后插入其中。

这似乎是一种奇怪的做事方式,并不是很安全,但这里的其他人似乎都很好。这是正常的,还是我的不安有效?

更新我应该提到他们使用事务和每个客户端锁,因此它可以防止大多数并发问题。此外,还有几十个(如果不是数百个)视图都依赖于 TMP_PARM_RANG

有帮助吗?

解决方案

我能理解这一点吗?

有这样的观点:

SELECT * FROM some_table, tmp_parm_rang
  WHERE some_table.date_column BETWEEN tmp_parm_rang.start_date AND tmp_parm_rang.end_date;

然后在某些前端用户输入日期范围,应用程序执行以下操作:

  1. 删除所有现有行 TMP_PARM_RANG
  2. 插入新行     带有用户值的TMP_PARM_RANG
  3. 从视图中选择所有行
  4. 我想知道是否提交或回滚了对TMP_PARM_RANG的更改,如果是,那么什么时候?它是临时表还是普通表?基本上,根据这些问题的答案,对于多个用户并行执行,该过程可能不安全。人们希望,如果是这样的话,他们就会发现并解决它,但谁知道呢?

    即使以线程安全的方式完成,对数据库进行简单查询操作的更改也没有多大意义。这些DELETE和INSERT正在生成重做/撤消(或非Oracle数据库中的等价物),这是完全没有必要的。

    实现相同目标的一种简单且更常规的方法是执行此查询,将用户的输入绑定到查询参数:

    SELECT * FROM some_table WHERE some_table.date_column BETWEEN ? AND ?;
    

其他提示

如果数据库是oracle,那么它可能是一个全局临时表;每个会话都会看到自己的表格版本,插入/删除不会影响其他用户。

此表必须有一些商业原因。我已经看到日期硬编码的视图实际上是一个分区视图,他们使用日期作为分区字段。我也看到加入一张桌子,比如在处理日光时节省时间想象一个视图返回在夏令时期间发生的所有活动。这些东西都不会删除并插入到表中......这只是奇怪的

所以要么有更深层次的理由需要挖出来,或者只是当时看起来像是个好主意的事情,但为什么这样做已经失去了部落知识。

就我个人而言,我猜这将是一个非常奇怪的事情。从你所说的两个方法同时调用这个过程可能非常有趣。

通常,日期范围作为视图上的过滤器完成,而不是由存储在其他表中的外部值驱动。

我能看到的唯一理由是,如果有一个多步骤过程,一次只执行一次,并且多个存储过程需要多个操作的日期。

我想它会让他们支持多个范围。例如,他们可以返回2008年1月1日至1/1/2009和1/1/2006以及1/1/2007之间的所有日期,以将2006年数据与2008年数据进行比较。你不能用一对绑定参数做到这一点。另外,我不知道Oracle如何对视图进行查询计划缓存,但也许它与此有关?在将日期列作为视图的一部分进行检查时,服务器可以缓存一个始终假定将检查日期的计划。

在这里抛出一些猜测:)

另外,你写道:

  

我应该提到他们使用   事务和每个客户端锁,所以   它被防范大多数并发   问题。

虽然这可以防止由于并发导致的数据一致性问题,但是由于并发性而导致性能问题会受到伤害。

他们是否还在应用程序中添加一个 - 以生成主键的下一个唯一值?

似乎共享国家的概念躲过了这些人,或者共享国家的原因使我们失望。

这听起来像是一个非常奇怪的算法。我想知道它如何处理并发 - 它是否包含在事务中?

听起来像是有人不确定如何编写WHERE子句。

视图可能用作临时表。在SQL Server中,我们可以使用表变量或临时表(#/ ##)来实现此目的。虽然专家不推荐创建视图,但我已经为我的SSRS项目创建了很多视图,因为我正在处理的表没有相互引用(没有FK,严重!)。我必须解决数据库设计方面的缺陷;这就是为什么我经常使用观点。

使用您在此处使用注释的全局临时表GTT方法,该方法对于多用户系统肯定是安全的,因此没有问题。如果这是Oracle,那么我想检查系统是否正在使用适当级别的动态采样,以便正确连接GTT,或者调用DBMS_STATS来提供GTT的统计信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top