日期:2014-05-18 浏览次数:21068 次
--建议:
--1.sql server 2005支持 select top (@变量) * from tb 的形式,可以将动态语句变为静态,例如:
INSERT INTO #TempSecontSortTable
SELECT A.LCSORT2,B.SortName,A.SORTCOUNT
From
(select TOP (@SecondSortNum) LCSORT2,COUNT(LCSORT2) AS SORTCOUNT
FROM #TempLcInfo
GROUP BY LCSORT2 ORDER BY sortcount DESC
) A,
dic_LcSort2 B where A.LCSORT2=B.ID ORDER BY A.sortcount DESC
--2.去除在为临时表增加字段时的默认值设置,如果设置默认值,那么在创建这个字段的时候会向这个字段全部写一遍默认值,降低了效率
--先提这两点,楼主看着修改一下吧。
------解决方案--------------------
SQL2000?SQL 2005?
大概看了一下,
SQL2005的话,可以使用Top + 变量,
ROW_NUMBER等对你的数据进行分组处理,
另外,临时表使用的太多了,
看看是否可以减少一些。
------解决方案--------------------
和尚说的有道理呀。
楼主可以从下面几个地方着手。
1.尽量减少临时表。
2.减少动态SQL的使用
3.优化业务逻辑。
因为对你的业务不了解,所以只能说到这了。
------解决方案--------------------
Declare @MinTime datetime --数据库中最小的日期
Declare @MaxTime datetime --数据库中最大的日期
SELECT @MinTime=Min(LcCreateTime) from tbl_lcinfo
SELECT @MaxTime=Max(LcCreateTime) from tbl_lcinfo
/*
ashzs:
1、@MinTime和@MaxTime的取值过早,如果@BeginTime和@EndTime都不为null,岂不是白白浪费了两次查询?
2、tbl_lcinfo是不是有针对LcCreateTime的索引?索引问题不再重复提起。
*/
--验证输入参数有效性
IF @BeginTime IS NULL
SET @BeginTime=@MinTime
IF @EndTime IS NULL
SET @EndTime=@MaxTime
DECLARE @SecondSortNum int --取二级分类数量
SET @SecondSortNum=4
DECLARE @ThirdSortNum int --取三级分类数量
SET @ThirdSortNum=3
DECLARE @StreetNum int --街道数量
SET @StreetNum=13
/*
ashzs:
1、LcSort1和LcCreateTime字段从来没有用过,为什么要创建?
2、LcID为什么需要设置为主键?在INSERT INTO #TempLcInfo的时候会出现主键重复的情况?tbl_LcInfo中的LcID不是主键吗?
如果是,这里根本不需要设置主键。如果说是为了提高效率,后面的查询也没看到能够使用LcID提高效率的地方。
3、不判断临时表是否存在就直接创建?你后面的drop table有可能因为中途异常不能运行啊。
*/
--创建临时信息表
Create table #TempLcInfo
(
LcID varchar(20) not null primary key,
LcSort1 int,
LcSort2 int,
LcSort3 int,
DealDept varchar(40),
LcCreateTime datetime
)
/*
ashzs:
tbl_LcInfo上有针对LcCreateTime的索引吗?tbl_LcInfo上字段多吗?如果字段很多,请考虑索引覆盖。
*/
--插入数据
INSERT INTO #TempLcInfo
SELECT LcID,LcSort1,LcSort2,LcSort3,DealDept,LcCreateTime
From tbl_LcInfo where LcCreateTime Between @BeginTime and @EndTime
/*
ashzs:
1、SortName和SortCount在算法中也没有用到啊,为了最后的返回结果集?
2、SortID为什么是unique?保证唯一?但是如果不唯一的话你有错误处理吗?如果是为了提高查询,SortID根本不需要加唯一索引。
只是一个unqiue,你的SortID值就要存储两份。
后面的临时表不再为你检查是否有不需要的字段\unique。依例改之。
*/
--创建临时表,保存数量最多的二级分类ID
Create table #TempSecontSortTable
(
ID int identity(1,1),
SortID int unique,
SortName varchar(64),
SortCount int
)
--创建临时表,保存数量最多的三级分类ID
Create table #TemPThirdSortTable
(
ID int identity(1,1),
SortID int unique,
SortCount int,
ParentSortID int,
SortName varchar(64)
)
--创建临时表,用来保存返回给用户的分类的名称
Create table #TempReturnThirdSortTable
(
ID int identity(1,1),
SortName varchar(64)
)
/*
ashzs:
1、很不喜欢你这种不写明对应字段的做法,字段又不多,为什么不为#TempSecontSortTable写出插入的字段名?
2、如果是sql2005(包括200