标签: calculated-columns

为什么执行计划包含用于持久保存的计算列的用户定义函数调用?

我有一个包含2个计算列的表,两个都将"Is Persisted"设置为true.但是,在查询中使用它们时,执行计划会显示用于计算列的UDF作为计划的一部分.由于列数据是由UDF在添加/更新行时计算的,为什么计划会包含它?

当这些列包含在查询中时,查询速度非常慢(> 30s),当排除它们时,查询速度非常快(<1s).这使我得出结论,查询实际上是在运行时计算列值,这不应该是这种情况,因为它们被设置为持久化.

我在这里错过了什么吗?

更新:这里有关于我们使用计算列的推理的更多信息.

我们是一家体育公司,有一个客户将完整的球员名称存储在一个列中.他们要求我们允许他们分别按名字和/或姓氏搜索玩家数据.值得庆幸的是,他们使用一致的播放器名称格式 - LastName,FirstName(NickName) - 因此解析它们相对容易.我创建了一个UDF,调用CLR函数来使用正则表达式解析名称部分.因此,显然调用UDF(后者又调用CLR函数)非常昂贵.但由于它仅用于持久列,我认为它只会在我们将数据导入数据库的一天中使用几次.

performance calculated-columns sql-server-2008-r2 sql-execution-plan

18
推荐指数
1
解决办法
2534
查看次数

SQL Server - 计算列的索引?

我加入一个表几十个不同的时间,每次,我根据其中一列的SUBSTRING结果加入(或过滤)(它是一个字符串,但左边用零填充,我不是'关心最后四位数).因此,即使此列已编制索引并且我的查询将使用索引,它也会进行表扫描,因为SUBSTRING本身未编入索引,因此SQL Server必须在加入之前为每一行计算它.

我正在寻找有关如何加快这一过程的任何想法.目前,在表上有一个视图(它是一个"SELECT*FROM",只是为了给表一个友好的名称),我正在考虑在计算的视图中添加一列,然后对其进行索引.不过,我对其他建议持开放态度 - 任何想法?

更多细节: 我应该首先分享这个.该表从我们的计费系统接收复制,因此编辑基础表以添加计算列不是一种选择.必须将任何计算列添加到表上的视图中.此外,前导零并不总是前导零 - 它们有时是我不感兴趣的其他数据.我认为真正的问题是" 如何在VARCHAR列的中间加入数据同时还可以使用一个索引?全文搜索? "

澄清我的例子 我正在简化,但实际上,假设我正在尝试使用以下值在列中查找值:

00000012345MoreStuff
00000012345Whatever
19834212345
Houses12345837443GGD
00000023456MoreStuff
Run Code Online (Sandbox Code Playgroud)

我对SUBSTRING(7,5)="12345"的行感兴趣,所以我想要1-4行,但不是第5行.我建议的是在我的"SELECT*"视图中添加一列在其中包含此子字符串,然后根据该索引进行索引.那更有意义吗?

sql-server indexing calculated-columns sql-server-2008

16
推荐指数
2
解决办法
2万
查看次数

使用列的值为另一列(SQL Server)?

假设我在某张桌子上有很大的选择.使用复数logc计算列的一个值,并将其称为ColumnA.现在,对于另一列,我需要来自ColumnA的值并向其添加一些其他静态值.

示例SQL:

select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ...
Run Code Online (Sandbox Code Playgroud)

[ColumnA] + 10是什么即时寻找.复杂的东西是一个巨大的案例/何时阻止.

想法?

sql sql-server calculated-columns

16
推荐指数
1
解决办法
3万
查看次数

如何将普通列更改为"计算"列

我在MSSQL server 2008中有一个表.我想将该表中的一列更改为计算列.有人能告诉我该怎么办?

sql-server calculated-columns

16
推荐指数
1
解决办法
8861
查看次数

使用条件在pandas dataframe中生成新列

我有一个像这样的pandas数据框:

   portion  used
0        1   1.0
1        2   0.3
2        3   0.0
3        4   0.8
Run Code Online (Sandbox Code Playgroud)

我想基于used列创建一个新列,所以df看起来像这样:

   portion  used    alert
0        1   1.0     Full
1        2   0.3  Partial
2        3   0.0    Empty
3        4   0.8  Partial
Run Code Online (Sandbox Code Playgroud)
  • alert基于创建新列
  • 如果used1.0,alert应该是Full.
  • 如果used0.0,alert应该是Empty.
  • 否则,alert应该是Partial.

最好的方法是什么?

python conditional calculated-columns pandas

16
推荐指数
4
解决办法
5万
查看次数

通过在两个现有列上使用lambda函数在Panda中创建新列

我可以通过定义用户函数然后使用apply在Panda中添加一个新列.但是,我想用lambda做到这一点; 有办法吗?

例如,df有两列ab.我想创建一个新列c,它等于a和之间的最长长度b.

就像是:

df['c'] = df.apply(lambda x, len(df['a']) if len(df['a']) > len(df['b']) or len(df['b']) )
Run Code Online (Sandbox Code Playgroud)

一种方法:

df = pd.DataFrame({'a':['dfg','f','fff','fgrf','fghj'], 'b' : ['sd','dfg','edr','df','fghjky']})

df['c'] = df.apply(lambda x: max([len(x) for x in [df['a'], df['b']]]))
print df
      a       b   c
0   dfg      sd NaN
1     f     dfg NaN
2   fff     edr NaN
3  fgrf      df NaN
4  fghj  fghjky NaN
Run Code Online (Sandbox Code Playgroud)

python lambda calculated-columns multiple-columns pandas

16
推荐指数
1
解决办法
3万
查看次数

如何在rails中缓存计算列?

我有一个活动记录对象树,如:

class Part < ActiveRecord::Base
  has_many :sub_parts, :class_name => "Part"

  def complicated_calculation
    if sub_parts.size > 0
      return self.sub_parts.inject(0){ |sum, current| sum + current.complicated_calculation }
    else
      sleep(1)
      return rand(10000)
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

每次重新计算复杂的计算成本太高.所以,我需要一种缓存值的方法.但是,如果更改了任何部分,则需要使其缓存及其父级和祖父级等的缓存无效.

作为一个粗略的草稿,我创建了一个列来保存"部件"表中的缓存计算,但这闻起来有点腐烂.看起来应该有一种更简洁的方法来缓存计算值,而不会将它们填充到"真实"列旁边.

ruby caching ruby-on-rails calculated-columns

14
推荐指数
2
解决办法
8388
查看次数

在where子句中使用计算列

我正在尝试在where子句中使用计算列.

我已尝试从CROSS APPLY到子查询选择的所有内容,但它并没有给我任何接近我需要的东西.

我的查询到目前为止:

SELECT p.Code, c.AccountNumber, Sales = (SUM(p.UnitPrice) * SUM(od.QtyShipped)) FROM [dbo].Customer c 
    LEFT JOIN [dbo].OrderHeader oh ON oh.CustomerId = c.Id 
    LEFT JOIN [dbo].OrderDetail od ON od.OrderHeaderId = oh.Id
    LEFT JOIN [dbo].Product p ON p.Id = od.ProductId
WHERE Sales > 100
GROUP BY p.Code, c.AccountNumber, Sales
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为'Sales'是无效列

t-sql sql-server calculated-columns where-clause

14
推荐指数
2
解决办法
2万
查看次数

将计算列转换为常规列

我在SQL Server 2005中的大表中有一个持久的计算列.

我想将它转换为常规列,保持当前值.

我是否必须重新创建列并在事务中更新整个表,或者是否可以只更改计算列规范,以及如何执行此操作?

sql-server calculated-columns

13
推荐指数
2
解决办法
9152
查看次数

将列添加到Pandas DataFrame的末尾,其中包含以前数据的平均值

我有一个ave_data包含以下内容的DataFrame :

ave_data

Time        F7           F8            F9  
00:00:00    43.005593    -56.509746    25.271271  
01:00:00    55.114918    -59.173852    31.849262  
02:00:00    63.990762    -64.699492    52.426017
Run Code Online (Sandbox Code Playgroud)

我想在此数据框中添加另一列,其中包含每行的F7,F8和F9列下的平均值.

ave_data我的代码不同的Excel文件中读取数据帧后可能会改变大小,所以该方法需要是通用的(即加总是包含平均在数据帧的最后一列列,不列号4)

desired output

Time        F7           F8            F9           Average
00:00:00    43.005593    -56.509746    25.271271    4.25  
01:00:00    55.114918    -59.173852    31.849262    9.26
02:00:00    63.990762    -64.699492    52.426017    17.24
Run Code Online (Sandbox Code Playgroud)

python calculated-columns dataframe pandas

12
推荐指数
3
解决办法
2万
查看次数