标签归档:sql优化

mssql sqlserver “select * from tableName” 查询的缺点


摘要:
下文分享”select * from tableName”查询写法的危害,如下所示:
实验环境:sql server 2008 R2


select *写法缺点1:
返回多余的列给客户端,造成网络压力过大,增加服务器压力。
select *写法缺点2:
select * from table where [列] …
当我们对[列]添加索引后,返回数据时,都需要再次进行RID查找,获取列的全部信息,使索引效果减弱。
select *写法缺点3:
由于需返回全部列,数据库返回数据时,都会从系统基础表中获取相关列信息,增加服务器系统表查询次数。
select *写法缺点4:
如果涉及多表查询,可能会使相同表名的列返回数据混乱。

记录一次sql server 优化的经历(最大并行度的设置)


摘要:
下文讲述一次用户sqlserver查询超级慢的解决方法

用户的sqlserver查询数据非常慢,近期对sql server数据库进行了版本升级后,还是异常的慢,
我仔细跟进了所有的sql脚本,发现能优化的地方都进行了优化,已经找不出sql脚本和索引上的优化,
通过仔细对比最后发现,许多sql查询使用并行处理器,并行查询会导致sqlserver的整体性能下降问题出在 最大并行度的设置上
默认情况下sqlserver的最大并行度为0

mssql_sqlserver_最大并行度的查询方法

mssql_sqlserver_最大并行度的查询方法


重新将最大并行度调整为1,一切正常

EXEC sys.sp_configure N’show advanced options’, N’1′ RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’max degree of parallelism’, N’1′
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’show advanced options’, N’0′ RECONFIGURE WITH OVERRIDE
GO

mssql sqlserver 索引列与sql写法之间的说明


摘要:
在数据库中,索引非常的重要,有了索引,我们可以快速的获取数据,
下文将从不同sql写法中,分析使用索引列查找数据时,索引的各种不同查找方式
如下所示:



实验环境:
sqlserver 2008 R2
数据表:
[20180627Tmp]
拥有索引:
ix_tmp 包含列tmpZiDuan
拥有1041175行数据


将使用 索引查找功能的索引写法,
包含 全值匹配、不等于写法、or写法、in写法

select tmpZiDuan from [20180627Tmp] where tmpZiDuan =’B9BB6696-D7BC-40C9-99A8-00006A05F1AC’
select top 100 tmpZiDuan from [20180627Tmp] where tmpZiDuan !=’B9BB6696-D7BC-40C9-99A8-00006A05F1AC’ –索引查找
select top 100 tmpZiDuan from [20180627Tmp] where tmpZiDuan =’B720964E-862A-4E99-913F-000033E571C4′–索引查找
or tmpZiDuan =’F6A8CFDD-132C-4D93-A4A5-00004067D31C’
select top 100 tmpZiDuan from [20180627Tmp] where tmpZiDuan in
(
’61D889DF-A1F4-4C96-A862-00004597A850′,’A3A590D3-0807-4D89-B4EE-000049E51F88′
)
—索引查找

将使用 索引扫描功能获取相关数据写法,
包含左右匹配、左匹配、右匹配、索引列计算后匹配、is not null写法

select top 100 tmpZiDuan from [20180627Tmp] where tmpZiDuan like ‘%07%’

select top 100 tmpZiDuan from [20180627Tmp] where tmpZiDuan like ‘%07’

select top 100 tmpZiDuan from [20180627Tmp] where tmpZiDuan like ‘07%’

select top 100 tmpZiDuan from [20180627Tmp] where len(tmpZiDuan) = 36

select top 100 tmpZiDuan from [20180627Tmp] where left(tmpZiDuan,1) = ‘a’

select top 100 tmpZiDuan from [20180627Tmp] where tmpZiDuan is not null

将使用 常量查找方式,
包含is null 写法

select top 100 tmpZiDuan from [20180627Tmp] where tmpZiDuan is null