Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让SQL server查询运行得更快_Sql_Sql Server_Performance - Fatal编程技术网

让SQL server查询运行得更快

让SQL server查询运行得更快,sql,sql-server,performance,Sql,Sql Server,Performance,我对SQL Server非常陌生,最终让代码运行起来,但速度非常慢。我的数据库有点大(1.22mil行,3列),我有一些while循环,我知道这并不理想,但我找不到解决方法 任何帮助都将不胜感激 declare @b float declare @c float declare @dateloopfora datetime declare @dateloopforc datetime BEGIN SET @MYCURSOR = CURSOR FOR SELECT

我对SQL Server非常陌生,最终让代码运行起来,但速度非常慢。我的数据库有点大(1.22mil行,3列),我有一些while循环,我知道这并不理想,但我找不到解决方法

任何帮助都将不胜感激

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,-@datedelta,@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,96+@datedelta,@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
declare@b float
声明@c float
声明@dateloopfora datetime
声明@dateloopforc datetime
开始
设置@MYCURSOR=CURSOR
从[tsxvPrices].[dbo].[3coldata]中选择不同的[STOCKS]
打开@MYCURSOR
从@MYCURSOR获取下一个到@STOCK
设置@end='12/30/2012'
而@@FETCH\u STATUS=0
开始
打印('Stockname restart:'+@stock)
SET@dateloop='01/01/2012'

虽然(@dateloop我可以马上看到一个简单的问题,但您使用的是光标。 这可能是处理SQL最糟糕的方法之一,它非常慢,并且迫使SQL引擎非常低效

您是SQL新手,因此我将放弃一个技术解释,但请看另一个StackOverflow问题:


我可以提供进一步的建议,您使用的是什么版本的SQL?

我可以马上看到一个简单的问题,您使用的是游标。 这可能是处理SQL最糟糕的方法之一,它非常慢,并且迫使SQL引擎非常低效

您是SQL新手,因此我将放弃一个技术解释,但请看另一个StackOverflow问题:


我可以提供进一步的建议,您使用的是什么版本的SQL?

您有一个O(N^3)的嵌套循环。这将有非常差的性能。我建议使用基于集合的方法。如果您提供示例数据和所需的输出,那将是非常好的。您像编写SQL一样编写SQL,它是一种面向对象的编程语言,而不是基于集合的查询语言。我建议您从说明需求开始(您期望的结果集是什么)关于您拥有的表列表。再说一遍,堆栈溢出并不是一个真正的问题,请为我编写代码论坛。但是,我不确定从何处开始您发布的内容。我想如果我是版主,我会投票关闭。您没有机会让sql server优化任何内容,因为您正在一步一步地做每件事。您有一个嵌套的O(N^3)的循环。这将有非常差的性能。我建议使用基于集合的方法。如果您提供示例数据以及所需的输出,那将非常好。您像编写SQL一样编写SQL,它是一种面向对象的编程语言,而不是基于集合的查询语言。我建议您从说明需求开始(您期望的结果集是什么)还有你的表列表。再说一遍,堆栈溢出不是一个真正的“请为我编写代码”论坛。但是,我不确定从哪里开始你发布的内容。我想如果我是版主,我会投票关闭。你没有机会让sql server优化任何内容,因为你在一步一步地做每件事。我使用的是MS sqlerver 2014。最初我计划使用循环而不是游标,但由于这些数据是股票名称,我开始寻找一个可以工作的循环,并找到了游标。是的,对于SQL新手来说,这是一个很容易的陷阱,也许您可以按照maplemale对您的问题的评论,将一个对我们有意义的数据小样本发布到Analyse。我使用的是MS sql server 2014。最初我计划使用循环而不是游标,但由于这些数据是股票名称,我开始寻找一个可以工作的循环,我找到了游标。是的,对于sql新手来说,这是一个很容易的陷阱,也许你可以按照maplemale对你的问题的评论来做,并发布一个小样本的数据对我们来说进行分析是有意义的。