使用通配符选择列有什么问题?

时间:2010-11-17 22:22:27

标签: sql-server caching

我有一个旧观点,当我查询它时会发出一些奇怪的数据。它的两个列C和D分别具有来自A列和B列的数据副本。所以C有一份A的数据,而D有一份B的数据。当我提取视图使用的查询并独立运行时,一切都很好。列A,B,C和D具有我期望看到的数据。当我查看视图定义时,我注意到它有一些通配符(*)用于列选择,如下所示:

SELECT
   TableX.*,
   TableY.*
FROM
   X AS TableX INNER JOIN
   Y AS TableY ON TableX.PK = TableY.FK

我被告知从不出于其他各种原因在视图中使用通配符,但我想知道为什么它有这种效果?我注意到,当我重新创建视图并在视图上运行select查询时,一切都很好。其中一位高级开发人员告诉我,问题出现是因为Sql Server的一些缓存,但我希望得到更详细的答案。

5 个答案:

答案 0 :(得分:4)

一个原因很糟糕,因为如果TableX和TableY具有相同的列名,那么您的结果中会出现列名冲突。

另一个原因是你应该只拉你需要的列。如果表有75列而你只需要4列,那么你需要提取大量不必要的数据,并且必须通过线路将额外的数据发送到客户端应用程序,这样会影响性能。

答案 1 :(得分:2)

来自联机丛书:

  

如果未使用创建视图   SCHEMABINDING子句,sp_refreshview   应该在进行更改时运行   视图底层的对象   影响视图的定义。   否则,视图可能会产生   查询时出现意外结果。

答案 2 :(得分:1)

  • 未定义。如果您将依赖特定的列顺序,则会得到不可预测的结果。

答案 3 :(得分:1)

如果要将新列添加到表中,您将加载其他(可能不需要的数据)列。

答案 4 :(得分:0)

  1. 如果您选择已使用的名称,则可以通过添加新列来中断随机代码。

  2. 将自动从应用程序的随机部分中的数据库中检索新列,以便将其丢弃。即使他们是一个巨大的BLOB。

  3. 您无法轻松找到代码中某些列的使用位置。