我应该创建View还是编写Query以获得更好的性能?

时间:2013-08-14 10:17:20

标签: sql sql-server

为了帮助您理解,请考虑一下,我正在制作一些电子邮件系统,其中电子邮件保存在Db中,可以是也可以不是草稿。

问题:

我有2个表格,结构如下

tblUsers
=========
Id - PK
Fname

tblMails
=========
Id - PK
UserId - F.K. tblUsers.Id
isDraft - Bit(boolean) field, default = 0

我需要在'tblMails'中搜索特定UserId的所有邮件和草稿。要做到这一点,我有两种方式:

  1. 我可以创建2个View - 'showMails'和'showDraft',根据'isDraft'字段从'tblMails'中选择所有记录。此后,我可以在视图上应用'WHERE'条件以获取特定用户的详细信息。

  2. 我不是在编写View,而是在代码中的任何地方应用'isDraft = 1'或'isDraft = 0'。

  3. 考虑到获取记录所需的计算周期,哪一项应该更合适?

2 个答案:

答案 0 :(得分:2)

选择草稿和常规电子邮件的逻辑非常简单。我认为将它包含在代码中的任何地方都没有问题。另一方面,视图是封装逻辑的好方法,特别是当底层数据结构可能发生变化时。

这里的表现问题很微妙。如果您在事务系统中使用它来进行必须非常快速运行的小查询,那么我认为该视图略有优势。在首次使用时,视图往往会被编译一次,然后再次使用查询计划。其他查询将缓存其计划,但视图不太可能需要重新编译。

另一方面,这也是一个缺点。如果底层数据发生变化,那么视图可能会有一个糟糕的执行计划 - 伤害所有内容。

要真正确定正确的方法(还有其他方法),您需要问自己一些问题,例如:

  • 导入是如何表现的?
  • 查询是否应该具有高吞吐量,响应时间以毫秒为单位?
  • 有多少人在使用该系统?
  • “草稿”和“常规”电子邮件是否真的存储在同一个表格中?
  • 表格会随着时间的推移而增长多少?
  • 基础数据结构是否会发生变化?

答案 1 :(得分:0)

  

恕我直言创建一个名为draft的新字段并在其上设置默认值(比如= 1)。   每当它的草稿=默认值将设置值(= 1)并在   其他情况明确将草稿设置为0.检索和读取值   不会对性能产生影响。