我对SQL Server非常陌生,最终让我的代码运行,但速度很慢。我的数据库有点大(1.22毫米行,3列),我有一些while循环,我知道这并不理想,但我找不到解决方法。获取SQL服务器查询运行速度更快
任何帮助将不胜感激!
declare @b float
declare @c float
declare @dateloopfora datetime
declare @dateloopforc datetime
BEGIN
SET @MYCURSOR = CURSOR FOR
SELECT DISTINCT [STOCKS] FROM [tsxvPrices].[dbo].[3coldata]
OPEN @MYCURSOR
FETCH NEXT FROM @MYCURSOR INTO @STOCK
set @end = '12/30/2012'
WHILE @@FETCH_STATUS = 0
BEGIN
print ('Stockname restart: ' + @stock)
SET @dateloop = '01/01/2012'
WHILE (@dateloop <= @end)
BEGIN
set @datedelta = 0
SET @dateloop = dateadd(day,1,@dateloop)
set @b = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE([dates] = @dateloop and [stocks] = @stock))
WHILE (@datedelta < 4)
BEGIN
set @datedelta = @datedelta + 1
if (@b is null)
begin
SET @dateloop = dateadd(day,1,@dateloop)
set @b = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE([dates] = @dateloop and [stocks] = @STOCK))
/*print ('b= ' + cast(@b as varchar(10)) + ' dateadd1=' + cast(@datedelta as varchar(10))) */
end
END
SET @datedelta = 0
set @a = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE([dates] = dateadd(day,-1,@dateloop) and [stocks] = @stock))
set @c = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE([dates] = dateadd(day,+96,@dateloop) and [stocks] = @stock))
if @b/@a < 0.8
begin
WHILE (@datedelta < 4)
BEGIN
set @datedelta = @datedelta + 1
if (@a is null)
begin
SET @dateloopfora = dateadd(day,[email protected],@dateloop)
set @a = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE([dates] = @dateloopfora and [stocks] = @STOCK))
/*print ('b= ' + cast(@b as varchar(10)) + ' dateadd1=' + cast(@datedelta as varchar(10))) */
end
if (@c is null)
begin
SET @dateloopforc = dateadd(day,[email protected],@dateloop)
set @c = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE([dates] = @dateloopforc and [stocks] = @STOCK))
/*print ('b= ' + cast(@b as varchar(10)) + ' dateadd1=' + cast(@datedelta as varchar(10))) */
end
END
/*print ('Stockname: ' + @stock)
print @dateloop
print('daily')
print @b/@a
print ('quarterly')*/
print @c/@b
/*print ('======================')*/
end
END
FETCH NEXT FROM @MYCURSOR INTO @STOCK
END
CLOSE @MYCURSOR
DEALLOCATE @MYCURSOR
你有一个嵌套循环的O(N^3)。这将会有非常糟糕的表现。我建议使用基于集合的方法。如果您提供样本数据,并且期望的输出将会很好。 –
您正在编写SQL,就像它是面向对象的编程语言,而不是基于集合的查询语言。 我建议你首先用你所拥有的表格列出需求(你期待的结果集)。然后再次,堆栈溢出不是真的是我的论坛的一个请写我的代码。但是,我不确定从你发布的内容开始。 我想如果我是主持人,我会投票结束。 – maplemale
你没有机会去sql server来优化任何东西,因为你正在一步一步做。 –