[翻译]通过使用正确的search arguments来提高SQL Server数据库的性能

原文地址:http://www.sqlpassion.at/archive/2014/04/08/improving-query-performance-by-using-correct-search-arguments/

Improving Query Performance by using correct Search Arguments


通过使用正确的search arguments来提高数据库的性能

今天的博客,我想谈谈在SQL Server上关于indexing的一个特定的性能问题

问题

看看下面的简单的query语句,可能你已经在你看到过几百次了

-- Results in an Index Scan
SELECT * FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate) = 2005 AND MONTH(OrderDate) = 7
GO

上门的代码查询一个销售信息,需要一个特定的月份和年份的,这不是很复杂。但是不幸的的事,这个qeury的效率不行,即使OrderDate这一列已经做了Non-Clustered Index。可以看看下面的qeury执行图,你能看到Query Optimizer已经选择了定义在列OrderDate下的Non-Clustered Index,但是SQL Server却做了Index的一个完整扫描,而不是期待中的Seek operation。

这实际上不是SQL Server的限制,而是relational database都是这样的。只要你对一个做了index的列(Search Argument)加了函数操作,数据库引擎就必须再次扫描这个index,而不是去直接执行seek operation

 

解决方案

为了解决上门的问题,必须要避免在列上门直接应该函数,比如上面的问题可以用下面的代码来代替

-- Results in an Index Seek
SELECT * FROM Sales.SalesOrderHeader
WHERE OrderDate >= '20050701' AND OrderDate < '20050801'
GO

我们重写的这个query语句,能达到同样的效果,不用函数MONTH了。从此query的执行图来看,SQL Server执行了seek operation,在查询的范围内进行的scan。所以,如果你要在where查询中用到函数,用到表达式的右侧,来避免性能问题。比如下面的例子。

-- Results in an Index Scan
SELECT * FROM Sales.SalesOrderHeader
WHERE CAST(CreditCardID AS CHAR(4)) = '1347'
GO

这个query会使SQL Server扫描了整个Non-Clustered Index。所以当表变得更大的时候,这个扩展性等各方面就很差了。如果把函数放在表达式的右侧,SQL Server就能执行seek operation了

-- Results in an Index Seek
SELECT * FROM Sales.SalesOrderHeader
WHERE CreditCardID = CAST('1347' AS INT)
GO

 

总结

通过今天的blog,我想你们已经认识到了不要在做过indexed的列上直接应用函数,不然SQL Server会扫描你整个index,而不是做seek operation。当你的表变得越来越大的时,你会崩溃的。


 

译后记

这也是我在看微软SQL Server认证考试Exam70-461的TrainingKit的时候,它书里面反复强调的。简单来讲就是保证不要直接用函数作用在做过index的列上,要用函数的话,变通到表达式的右侧来。至于为什么会影响性能。因为我对index还不熟悉,我理解的不是很清晰。

我大概猜想如下,先记下,欢迎讨论。

对某一个列做index,是不是类似对这一列的数据做一个hash映射,当在查找这一列的数据的时候,直接可以做O(1)的操作(是不是就是它讲的seek operation)。如果对这一列使用了函数,SQL Server的机制就是不会重新做一个作用了函数后的列的hash,它就简单的一个一个的比较了。是O(N)的操作了。

  

 

  

转载于:https://www.cnblogs.com/wtang/p/6074190.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将SQL Server数据库安装包和WPF程序安装包一起打包成一个安装程序,并实现自动安装数据库和WPF程序,可以按照以下步骤操作: 1. 将SQL Server数据库安装包和WPF程序安装包放置在同一文件夹中。 2. 使用Visual Studio创建一个新的安装程序项目。对于Visual Studio 2019及更高版本,可以选择Visual Studio Installer项目模板。 3. 在安装程序项目中添加需要安装的文件,包括SQL Server数据库安装包、WPF程序安装包和其他必需的文件。 4. 在安装程序项目中添加自定义操作。对于Visual Studio Installer项目,可以使用Custom Actions功能来实现自定义操作。 5. 在自定义操作中添加以下代码来安装SQL Server: ``` string arguments = "/QS /IACCEPTSQLSERVERLICENSETERMS /ACTION=install /FEATURES=SQL /INSTANCENAME=MSSQLSERVER /SQLSVCACCOUNT=\"NT AUTHORITY\\Network Service\" /SQLSYSADMINACCOUNTS=\"BUILTIN\\Administrators\" /TCPENABLED=1 /NPENABLED=1 /SECURITYMODE=SQL /SAPWD=\"myPassword123\""; ProcessStartInfo startInfo = new ProcessStartInfo("SQLEXPR_x64_ENU.exe", arguments); startInfo.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(startInfo).WaitForExit(); ``` 该代码将执行SQL Server的安装程序,并使用指定的参数进行安装。您可以根据自己的需求修改参数。请注意,此代码仅适用于64位版本的SQL Server。 6. 在自定义操作中添加以下代码来安装WPF程序: ``` string arguments = "/SILENT /NORESTART /DIR=\"[TARGETDIR]\""; ProcessStartInfo startInfo = new ProcessStartInfo("MyWPFAppInstaller.msi", arguments); startInfo.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(startInfo).WaitForExit(); ``` 该代码将执行WPF程序的安装程序,并使用指定的参数进行安装。您需要将"MyWPFAppInstaller.msi"替换为实际的WPF程序安装包名称。请注意,此代码仅适用于MSI安装程序。 7. 编译并测试您的安装程序。 以上步骤将帮助您将SQL Server数据库安装包和WPF程序安装包一起打包成一个安装程序,并实现自动安装数据库和WPF程序的功能。请注意,在安装过程中,SQL Server的安装程序可能需要管理员权限才能运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值