有如下一个存储过程,执行该存储过程平均每次需要10秒左右,
为什么会需要这么长的时间呢?是数据表太大了的问题呢?
还是我的存储过程有问题呢(是不是UNION ALL太耗时间了啊)?
有办法优化吗?
DECLARE @SQL varchar(max)
SET @SQL = ''
SELECT @Sql =
@Sql + 'SELECT
[Project_Name],
[Station],
[Barcode_SN]
FROM '
+ NAME + ' A WITH(NOLOCK),
(SELECT
MAX(ID) AS ID
FROM
' + NAME + ' WITH(NOLOCK)
GROUP BY [Project_Name], [Barcode_SN], SUBSTRING([Station] , 0 , charindex(''_'', [Station]))) B
WHERE A.ID = B.ID' +
' AND A.[Upload_DateTime] >= ' + '''' + @StartTime + '''' +
' AND A.[Upload_DateTime] < ' + '''' + @EndTime + '''' +
' UNION ALL '
FROM
SYS.TABLES
WHERE
LEFT(NAME, '9') = 'LOG_INFO_'
SET @SQL = LEFT(@SQL, LEN(@SQL)-10)
SELECT @Sql = 'SELECT
[Project_Name] as ''product'',
[Station] as ''station_id''
FROM '
+ '(' + @Sql + ') t'
+' GROUP BY
[Project_Name],
[Station]'
EXEC(@SQL)
------解决方案--------------------
设计问题,非改这个SQL能大幅提长效率
------解决方案--------------------
1、每个表的ID加一个聚集索引,
2、每个表的[Upload_DateTime]加一个非聚集索引