- 浏览: 84681 次
文章分类
- 全部博客 (136)
- 我的技术资料收集 (98)
- 具体技术 (1)
- 的技术资料收集 (4)
- All Articles (1)
- 机器学习 Machine Learning (1)
- 网络编程 (1)
- java (2)
- ava (1)
- 零散技术 (1)
- C# (3)
- 技术资料收集 (1)
- CQRS (1)
- 数据库技术(MS SQL) (1)
- .Net微观世界 (1)
- Oracle SQL学习之路 (1)
- C/C++ (1)
- JS/JQ (1)
- Js封装的插件/实例/方法 (2)
- 敏捷个人 (2)
- Javascript (1)
- 程序设计---设计模式 (1)
- Bug (1)
- 未知分类 (1)
- 程序设计 (1)
- Sharepoint (1)
- Computer Graphic (1)
- IT产品 (1)
- [06]JS/jQuery (1)
- [07]Web开发 (1)
- .NET Solution (1)
- Android (3)
- 机器学习 (1)
- 系统框架设计 (1)
- Others (1)
- 算法 (1)
- 基于Oracle Logminer数据同步 (1)
- 网页设计 (1)
- 原创翻译 (1)
- EXTJS (1)
- Jqgrid (1)
- 云计算 (1)
最新评论
阅读导航
1. TVF(表-值行数Table-Valued Functions)
上一篇介绍了关于“临时表、表变量和Union优化”这次转向关注定义函数——也就是表-值函数、标量函数。
UDF(用户定义函数,User defined Function)对于集中精力处理业务逻辑很方便,因为可以在UDF中指定一组业务逻辑,其中可以设计多个存储过程和一些特定的查询语句。但是,由于UDF对CPU的大量请求可能导致性能下降
1. TVF(表-值行数Table-Valued Functions)
一般情况,当使用TVF与一个对象内联接,如果该对象没有索引将会导致TVF像索引扫描或表扫描一样做扫描操作。
作为一个选择,可以创建临时表,临时表上创建适当的聚集索引或非聚集索引。
详情如下:
- 创建适当的临时表。
- 根据T-SQL创建适当的聚集索引和非聚集索引。
- 将TVF的数据插入到临时表中。
- 用临时表和相关的列替换每一个TVF。
- 在查询语句执行结束后,删除临时表。
注意,临时表的性能提升是超过表参数,在上一篇博客中提到的,表参数不支持索引。
a. 创建TVF:
1: use [MyDemo]
<!--CRLF-->
2: go
<!--CRLF-->
3: alter FUNCTION Dep_Salaries1
<!--CRLF-->
4: (
<!--CRLF-->
5: @empid int
<!--CRLF-->
6: )
<!--CRLF-->
7: RETURNS @table table
<!--CRLF-->
8: (
<!--CRLF-->
9: Department int,
<!--CRLF-->
10: Salary_Max int,
<!--CRLF-->
11: Salary_Min int
<!--CRLF-->
12: )
<!--CRLF-->
13: AS
<!--CRLF-->
14: BEGIN
<!--CRLF-->
15: declare @Department int = (select S.deptid from Employees s where s.empid=@empid)
<!--CRLF-->
16: insert into @table
<!--CRLF-->
17: SELECT S.deptid , max (Salary) , MIN(Salary) FROM Employees s inner join Departments T ON S.deptid =T.deptid group by S.deptid having S.deptid =@Department
<!--CRLF-->
18: RETURN
<!--CRLF-->
19: END
<!--CRLF-->
20: GO
<!--CRLF-->
b. 使用TVF的低性能T-SQL:
1: alter procedure Unperformant_SP1
<!--CRLF-->
2: @empid int
<!--CRLF-->
3: as
<!--CRLF-->
4: begin
<!--CRLF-->
5: select T.deptid as department_name , s.* from Dep_Salaries1 (@empid )S inner join Departments T ON S.Department =T.deptid
<!--CRLF-->
6: end
<!--CRLF-->
c. 使用临时表代替TVF:
1: go
<!--CRLF-->
2: alter procedure Performant_SP1
<!--CRLF-->
3: @empid int
<!--CRLF-->
4: as
<!--CRLF-->
5: begin
<!--CRLF-->
6: create table #table
<!--CRLF-->
7: (
<!--CRLF-->
8: Department int,
<!--CRLF-->
9: Salary_Max int,
<!--CRLF-->
10: Salary_Min int
<!--CRLF-->
11: )
<!--CRLF-->
12: create clustered index #table_index1 on #table (Department)
<!--CRLF-->
13: insert into #table select * from Dep_Salaries1 (@empid )
<!--CRLF-->
14: select T.deptid as department_name , s.* from #table S inner join Departments T ON S.Department =T.deptid
<!--CRLF-->
15: end
<!--CRLF-->
在使用具体的查询和数据时,还是应该进行必要的性能测试,发现最适合自己情况的解决方案。
2. 标量函数
标量函数,对于确定存储过程或特定查询语句的聚合值、累计值、差分值非常方便的,但是对性能是有损失的,尤其使用大数据,标量函数将执行每一个记录。
3. 替代标量函数
1). 临时表
使用临时表,但是这个解决方案有一点不同于TVF的情况,这里希望完全放弃标量函数并且也不去直接使用内部T-SQL代码。
2). 持久化确定的计算列
持久化确定的计算列值不是每次选择都重新计算该列,而只是在创建时计算一次。因此,这时可以添加不同的T-SQL语句提高性能,因为这样可以减少进程的开销。
这个功能可以通过下面步骤添加:
- 增加一个新的计算列存储标量函数的结果。
- 启用这个计算列的持久化功能。
- 在列(不管是主键列还是包含列)上设置适当的索引。
但是要注意持久化功能还是有一些限制,如:
i. 计算列不应该使用任何其他记录的聚合功能。
ii. 计算列不应该使用调用外部系统过程的功能。
iii. 计算列不应该使用任何其他表的其他字段的功能。
iv. 计算列生成最好是使用系统提供的功能,例如:Convert、Cast、Replace等等,并且开发者不能创建UDF,因为UDF通常和该功能相矛盾。
这仅仅是适用于持久化的功能,但是可以添加计算列索引,应该通过确定计算数据的精确类型(如,INT、 Bigint、 DateTime和decimal)精确列的类型。如果数据类型不精确,可以添加这些列为索引的包含列的一部分,但不是主键列的一部分。
3). 使用计划更新工作
如果不可能使用持久化确定的计算列,可以创建普通列并同时创建计划更新工作,更新这些列的标量函数输出,然后用T-SQL代替标量函数并且在T-SQL中使用这些列。具体如下:
a. 创建标量函数:
1: use [Workshops]
<!--CRLF-->
2: go
<!--CRLF-->
3: create FUNCTION Salary_Tax
<!--CRLF-->
4: (
<!--CRLF-->
5: @empid int
<!--CRLF-->
6: )
<!--CRLF-->
7: RETURNS float
<!--CRLF-->
8: AS
<!--CRLF-->
9: BEGIN
<!--CRLF-->
10: declare @salary int = (select (S.salary-100) from Employees s where s.empid=@empid)
<!--CRLF-->
11: RETURN @salary
<!--CRLF-->
12: END
<!--CRLF-->
13: GO
<!--CRLF-->
14: --性能低些的标量函数
<!--CRLF-->
15: Select empid ,dbo.Salary_Tax (empid) as 'SalaryWithTax' from Employees
<!--CRLF-->
b. 使用临时表替换标量函数:
1: Create Table #temp (Empid int primary key clustered , Salary_Tax float)
<!--CRLF-->
2: Create nonclustered index #temp_Index1 on #temp (Empid ) include (Salary_Tax )
<!--CRLF-->
3: insert into #temp select Empid ,(Salary-100) as salary_Tax from Employees
<!--CRLF-->
4: select * from #temp
<!--CRLF-->
c. 使用持久化确定的计算列:
1: ALTER TABLE dbo.Employees ADD Salary_Tax AS Salary-100 PERSISTED
<!--CRLF-->
2: Create nonclustered index Employees_Index1 on Employees (Empid, Salary_Tax )
<!--CRLF-->
3: select empid ,Salary_Tax from Employees
<!--CRLF-->
d. 使用计划工作代替标量函数:
1: ALTER TABLE dbo.Employees ADD Salary_Tax1 float, update_flag bit
<!--CRLF-->
2: ALTER TABLE dbo.Employees ADD CONSTRAINT DF_Employees_update_flag DEFAULT 0 FOR update_flag
<!--CRLF-->
3: Schedule the below DML update by an appropriate frequency according to your workload
<!--CRLF-->
4: Update Employees set Salary_Tax1=Salary-100 WHERE UPDATE_Flag=0
<!--CRLF-->
5: Then you can include the below select query within your stored procedure.
<!--CRLF-->
6: select empid , Salary_Tax1 from Employees
<!--CRLF-->
上班时间到了!
期待下一篇吧!
任何的优化的不是绝对的,只有适应自己环境才是最好的,性能测试是必要。
在此谢谢读完这篇博客,有什么写的不对的地方请指正
有帮助就推荐下,有感想就写下留言,不满意也写下留言,有问题就更正。
发表评论
-
C#WebBrowser控件使用教程与技巧收集--苏飞收集 - sufeinet
2013-06-28 12:07 1076原帖地址:http://www.cnblogs.com/suf ... -
我要喷一个自认为很垃圾的网站架构 - 老赵【苏州】
2013-06-28 12:01 1138原帖地址:http://www.cnblogs.com/lao ... -
[翻译] Oracle Database 12c 新特性Multitenant - Cheney Shue
2013-06-28 11:43 626原帖地址:http://www.cnblogs.com/ese ... -
memcahd 命令操作详解 - 阿正-WEB
2013-06-28 11:37 476原帖地址:http://www.cnblogs.com/azh ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 601原帖地址:http://www.cnblogs.com/ste ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 564原帖地址:http://www.cnblogs.com/ste ... -
RPG游戏之组队测试 - zthua
2013-06-27 10:22 562原帖地址:http://www.cnblogs.com/zth ... -
IT人们给个建议 - SOUTHER
2013-06-26 14:06 527原帖地址:http://www.cnblogs.com/sou ... -
Java向前引用容易出错的地方 - 银河使者
2013-06-26 14:00 498原帖地址:http://www.cnblogs.com/nok ... -
使用Func<T1, T2, TResult> 委托返回匿名对象 - 灰身
2013-06-26 13:54 806原帖地址:http://www.cnblo ... -
【web前端面试题整理03】来看一点CSS相关的吧 - 叶小钗
2013-06-25 10:45 791原帖地址:http://www.cnblogs.com/yex ... -
Windows 8 动手实验系列教程 实验6:设置和首选项 - zigzagPath
2013-06-25 10:27 625原帖地址:http://www.cnblogs.com/zig ... -
闲聊可穿戴设备 - shawn.xie
2013-06-25 10:21 571原帖地址:http://www.cnblo ... -
CentOS下Mysql安装教程 - 小学徒V
2013-06-23 15:24 614原帖地址:http://www.cnblogs.com/xia ... -
vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化) - skyme
2013-06-23 15:18 842原帖地址:http://www.cnblogs.com/sky ... -
之前专门为IE6、7开发的网站如何迁移到IE10及可能遇到的问题和相应解决方案汇总 - 海之澜
2013-06-23 15:12 960原帖地址:http://www.cnblogs.com/wuz ... -
Android学习笔记--解析XML之SAX - 承香墨影
2013-06-23 15:01 414原帖地址:http://www.cnblo ... -
Nginx学习笔记(二) Nginx--connection&request
2013-06-19 09:26 676原帖地址:http://www.cnblogs.com/cod ... -
从郭美美霸气侧漏看项目管理之项目经理防身术
2013-06-19 09:20 505原帖地址:http://www.cnblogs.com/had ... -
1、图解Oracle Logminer配置使用
2013-06-18 10:37 1615原帖地址:http://www.cnblogs.com/shi ...
相关推荐
在SQL Server中,自定义函数(User-Defined Functions, UDFs)是数据库开发者和管理员扩展数据库功能的重要工具。它们允许我们创建自己的函数,以处理特定的数据操作或业务逻辑,这些函数可以像内置函数一样在SQL...
1.Python实现TVF-EMD-LSTM时间序列预测(完整源码和数据) anaconda + pycharm + python +Tensorflow 注意事项:保姆级注释,几乎一行一注释,方便小白入门学习! 2.代码特点:参数化编程、参数可方便更改、代码编程...
在SQL Server 2008中,使用CLR...总之,使用CLR访问SQL Server 2008是提升数据库功能和效率的有效途径,但需要谨慎评估安全性和性能影响。开发者应当熟悉.NET编程和SQL Server的管理,以充分利用这一强大的技术。
SQL Server 是一种关系型数据库管理系统,具有强大的数据处理能力和存储能力。在实际应用中,我们经常需要将一个字段的多个记录值合并到一行显示,以便于数据分析和展示。在本文中,我们将介绍如何在 SQL Server ...
通过以上内容的介绍,我们可以看出TVF-EMD不仅在理论上有其独特之处,而且在实际应用中也展现出了极高的价值。无论是对于科研工作者还是工业界的专业人士来说,掌握这项技术都将大有益处。希望本文能够帮助读者更好...
快手通过对Flink SQL的扩展和优化,不仅提升了性能和稳定性,而且通过高阶窗口函数增加了分析的维度和深度。快手的经验对其他大数据公司也具有借鉴意义,尤其是在数据流处理、实时分析和批处理集成方面。 未来展望...
不要错过通过用户定义函数(UDF)和表值函数(TVF)将简单表达式的查询性能显着提高300% ,将复杂代码的查询性能显着提高2000%以上的机会。 在SQL中使用分隔符分割字符串的基准 方法 1,000行 10,000行 100,000行...
T-SQL表值函数分为内联表值函数和多语句表值函数。内联TVF的性能通常更好,因为它们可以被优化器更有效地处理,而多语句TVF则提供了更大的灵活性,可以包含复杂的逻辑。 创建T-SQL内联表值函数的基本语法如下: ```...
您可以通过提供的链接下载"Using-Table-Valued-Functions-in-SQL-Server.pdf"文档,了解更多关于在实际项目中使用表值函数的详细示例和最佳实践。此外,"Script.zip"可能包含示例脚本,供您动手实践和学习。 总之...
执行SQL脚本文件`my.sql`,`-t`表示跟踪模式,用于检查SQL语法错误;`-v`选项使输出更加详细;`-f`选项用于指定SQL脚本文件。 - **db2level** 该命令用来显示当前安装的DB2版本信息。 - **db2 "?" sql6031** ...
变频器说明书大全系列-TVF7000.rar是一个压缩包文件,包含了关于TVF7000系列变频器的详细技术资料,主要目的是帮助用户理解和操作这种高性能的变频器。TVF7000系列变频器是工业自动化领域广泛应用的一种设备,它主要...
但在这个案例中,由于我们可能需要兼容SQL Server 2005及更低版本,我们可以使用其他函数,如`CHARINDEX()`和`SUBSTRING()`。以下是一个示例: ```sql DECLARE @Skills NVARCHAR(MAX) = '编程,数据库设计,项目...
《变频器说明书大全系列——TVF7100》 在现代工业自动化领域,变频器扮演着至关重要的角色,它能通过调整电机的供电频率来改变电机的转速,实现对机械设备的精确控制。TVF7100系列变频器是其中一款广泛应用的产品,...
《变频器说明书大全系列——TVF1000》 在现代工业自动化领域,变频器扮演着至关重要的角色。变频器是一种能够改变电机输入电源频率的电力控制设备,通过调整频率来控制电动机的转速和扭矩,从而实现对机械设备的...
这个系列的变频器是工业自动化领域常见的一种设备,用于控制电动机的速度和转矩,以适应不同生产需求或优化能源效率。下面将对TVF5000系列变频器及其使用手册中的关键知识点进行详细介绍。 1. 变频器的基本原理:...
3. **参数设置**:TVF8000变频器有许多可调参数,用于优化其性能以适应不同应用。说明书将列出所有可用参数及其作用,指导用户进行正确的设定。 4. **操作与控制**:文档会解释如何使用面板控制、外部信号控制、...
变频器,作为一种电力控制设备,广泛应用于工业自动化领域,...全面理解并熟练运用TVF3000变频器的说明书,对于操作者来说至关重要,它不仅可以确保设备正常运行,还能帮助优化系统性能,减少故障发生,提升生产效率。
TVF2000变频器采用了现代微处理器技术,具有高效率、低噪音和出色的动态性能。 二、TVF2000变频器特性 1. 控制方式:TVF2000支持多种控制方式,包括V/F控制(电压/频率比控制)、无速度传感器矢量控制、有速度...
在这个2D版本的TVF框架中,可能包含了一系列的算法和函数,用于读取边缘数据、构建张量场、执行投票过程、并最终输出处理后的结果。通过研究`create_stick_tensorfield.m`脚本以及可能的其他相关代码,我们可以深入...