0

我不是 SQL Server 方面的专家,这个问题可能有点令人费解,但我必须尝试一下!

我正在运行服务器上的每个数据库以收集一些统计信息。在开发正确的 SQL 代码时,我使用了一个相对较小的服务器(约 150 个数据库)。我得到查询执行错误的结果,这很好 - 这是预期的。所有需要完成的事情都完成了,我得到了我的结果。

现在我的问题是当我使用实时服务器时。这是理所当然的,更大一点的数据更多。我不介意我的查询需要很长时间才能运行,我的问题是当它运行时,最终它会停止(它可能会在 20 个数据库完成后停止,它可能会在 30 个后停止 - 它永远不会相同)。它执行相同的查询时出现错误,但正如我所提到的,这很好 - 我之前已经很好地处理了这个错误(它是一个不在每个数据库中的表)。所以基本上,查询虽然没有完成,但无论如何都会停止。

我只是想知道,有人知道可能是什么问题吗?我会发布我的查询,但我不确定这是否是问题所在,因为它在开发服务器上运行良好..

我正在努力解决这个问题——谷歌今天也不友好。正如我所说,我不是专家——我对现实生活中的开发还比较陌生,所以我可能会做一些幼稚的事情。

这只是在 SQL Server 中运行的查询 - 它不是更大项目的一部分,它是独立的。

declare @name nvarchar(100)
declare @sql varchar(2000)
declare @sql2 varchar (2000)
declare @repname nvarchar (200), @time DateTime, @pos int
declare @rn nvarchar (200), @ts DateTime, @p int

DECLARE GetDatabaseName CURSOR LOCAL FOR
    SELECT Name FROM sys.sysdatabases WHERE name not in ('master', 'tempdb', etc') order by name

OPEN GetDatabaseName
FETCH NEXT FROM GetDatabaseName INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET NOCOUNT ON
print @name
DROP table Results
DROP table TrueResults
DROP table temp
Create table Results (Position int, Name nvarchar(200), TimeStamp DateTime)
Create table TrueResults (Position int, Name nvarchar (200), TimeStamp DateTime)
Create table temp (Position int, Name nvarchar (200), TimeStamp DateTime)

ALTER TABLE Results
ALTER COLUMN Name VARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
set @sql2 = 'insert into Results select ROW_NUMBER()over (order by TimeStamp), Name, TimeStamp from ' + @name                 + '.dbo.MyTableName'
exec (@sql2)
Declare Curses CURSOR
FOR select Name, TimeStamp, Position from Results
    Open Curses
while @@FETCH_STATUS = 0
    BEGIN
        fetch next from Curses
        into @rname, @time, @pos
        if exists (select * from Results where @rname= 'What I'm Looking For')
        BEGIN       
            if exists (select * from Results where Position = @pos + 1 and Name != 'What I'm Looking                For')
            BEGIN
                insert into temp (Position, Name, TimeStamp)
                values (@pos, @rname, @time)
                set @pos = (select temp.Position from temp, Results where temp.Position =                       Results.Position and Results.Position = @pos)+1
                set @p = (select Position from Results where Position = @pos)
                set @rn = (select Name from Results where Position = @pos)
                set @ts = (select TimeStamp from Results where Position = @pos)
                insert into TrueResults (Position, Name, TimeStamp)
                values (@p, @rn, @ts)
            END
        END
    END
CLOSE Curses
DEALLOCATE Curses

select @name
 set @sql = 'select Name, count(Name) as RCount from TrueResults group by Name order by RCount desc'
    exec (@sql)
FETCH NEXT FROM GetDatabaseName INTO @name

END
CLOSE GetDatabaseName
DEALLOCATE GetDatabaseName
GO

我已经尝试了这里提到的东西无济于事。但是,我确实添加了一个子句,只返回过去 7 天的结果——这使得查询运行时间更长。将其更改为 1 天,并且一直运行。(该表具有时间戳属性)。所以现在我想知道这是否与返回的大量数据有关?我不知道有任何限制,因此。但是,这样的事情会导致这样的问题吗?会不会是内存问题?

4

1 回答 1

2

首先编辑这个查询块

Declare Curses CURSOR
FOR select Name, TimeStamp, Position from Results
Open Curses
fetch next from Curses
    into @rname, @time, @pos
while @@FETCH_STATUS = 0
BEGIN
    if exists (select * from Results where @rname= 'What Im Looking For')
    BEGIN       
        if exists (select * from Results where Position = @pos + 1 and Name != 'What I'm Looking                For')
        BEGIN
            insert into temp (Position, Name, TimeStamp)
            values (@pos, @rname, @time)
            set @pos = (select temp.Position from temp, Results where temp.Position =                       Results.Position and Results.Position = @pos)+1
            set @p = (select Position from Results where Position = @pos)
            set @rn = (select Name from Results where Position = @pos)
            set @ts = (select TimeStamp from Results where Position = @pos)
            insert into TrueResults (Position, Name, TimeStamp)
            values (@p, @rn, @ts)
        END
    END
    fetch next from Curses
    into @rname, @time, @pos
END
CLOSE Curses
DEALLOCATE Curses

然后增加远程查询超时

于 2013-09-09T18:54:33.420 回答