Es ist nicht genügend Systemarbeitsspeicher im Ressourcenpool 'internal'
SQL Server 2008 Verknüpfte Server-und ad-hoc-Einsätze bewirken einen schnellen memory-leak, die schließlich bewirkt, dass der server nicht mehr reagiert und beendet mit dem folgenden Fehler:
Msg 701, Level 17, State 123, Server BRECK-PC\SQLEXPRESS, Line 2
There is insufficient system memory in resource pool 'internal' to run this
query.
Location: qxcntxt.cpp:1052
Expression: cref == 0
SPID: 51
Process ID: 1880
Dem server bleibt nicht mehr reagiert, bis SQL Server neu gestartet wird.
Software im Einsatz:
- Windows Vista Ultimate 64 bit-build 6001 SP1
- Microsoft SQL Server 2008 (SP1) - 10.0.2734.0 (X64), 11 Sep 2009 14:30:58 Copyright (c) 1988-2008 Microsoft Corporation Express Edition mit Advanced Services (64-bit) unter Windows NT 6.0 (Build 6001: Service Pack 1)
- SAOLEDB.11-Treiber von SQL Anywhere 11.0.1.2276
Einstellung max server memory (MB) 2048 nicht helfen.
Hinzufügen von verschiedenen -g Werte (z.B., -g256;) der server-Start-Parameter hat nicht geholfen.
Mithilfe von DBCC FREESYSTEMCACHE ( 'ALL' ), DBCC FREESESSIONCACHE und DBCC FREEPROCCACHE nicht helfen.
Installation der Cumnulative update-Paket 4 für SQL Server 2008 Service Pack 1 nicht helfen, obwohl er enthielt einen fix, um einen Speicherverlust symptom, die Verknüpfte Server-Nutzung.
Trennung der SELECT ... ROW_NUMBER() OVER ... " - Abfrage aus dem EINFÜGEN hat nicht geholfen. Experimente zeigten, dass der Komplex WÄHLEN Sie nicht die Ursache für den Speicherverlust, der INSERT hat.
Ändern Sie den code, den ad-hoc "INSERT INTO OPENROWSET" syntax statt einen verknüpften server nicht helfen; der code unten zeigt die verlinkten server-Nutzung.
Den sysinternals.com Prozess Erkunden Dienstprogramm zeigt, dass die Speicherauslastung wurde im Zusammenhang mit sqlserver.exe nicht die DLLs verwendet, die von der SQL Anywhere OLE DB-Treiber SAOLEDB.11.
Beachten Sie, dass der SQL Anywhere-version der linked-server (proxy-Tabellen) funktioniert OK, zu "ziehen" 1,9 Millionen Zeilen aus einer SQL Server 2008-Tabelle in einen SQL Anywhere 11-Datenbank in einer einzigen Transaktion. Die Logik, die hier gezeigt ist ein Versuch, die Verwendung der linked-server-Funktion zu "schieben" den Zeilen; gleiche Richtung, andere syntax.
Den code folgt; 4G RAM erschöpft ist, nach drei oder vier Ausführungen der AUSFÜHRUNG copy_mss_t2:
EXEC sys.sp_configure
N'show advanced options',
N'1'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure
N'max server memory (MB)',
N'2048'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure
N'show advanced options',
N'0'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC master.dbo.sp_MSset_oledb_prop
N'SAOLEDB.11',
N'AllowInProcess',
1
GO
sp_addlinkedserver
@server = 'mem',
@srvproduct = 'SQL Anywhere OLE DB Provider',
@provider = 'SAOLEDB.11',
@datasrc = 'mem_PAVILION2'
GO
EXEC master.dbo.sp_serveroption
@server=N'mem',
@optname=N'rpc',
@optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption
@server=N'mem',
@optname=N'rpc out',
@optvalue=N'true'
GO
sp_addlinkedsrvlogin
@rmtsrvname = 'mem',
@useself = 'false',
@locallogin = NULL,
@rmtuser = 'dba',
@rmtpassword = 'sql'
GO
CREATE PROCEDURE copy_mss_t2
@from_row BIGINT,
@to_row BIGINT,
@rows_copied_count BIGINT OUTPUT
AS
SELECT *
INTO #t
FROM ( SELECT *,
ROW_NUMBER()
OVER ( ORDER BY sample_set_number,
connection_number )
AS t2_row_number
FROM mss_t2 ) AS ordered_mss_t2
WHERE ordered_mss_t2.t2_row_number BETWEEN @from_row AND @to_row;
SELECT @rows_copied_count = COUNT(*)
FROM #t;
INSERT INTO mem..dba.sa_t2
SELECT sampling_id,
sample_set_number,
connection_number,
blocker_owner_table_name,
blocker_lock_type,
blocker_owner_name,
blocker_table_name,
blocker_reason,
blocker_row_identifier,
current_engine_version,
page_size,
ApproximateCPUTime,
BlockedOn,
BytesReceived,
BytesSent,
CacheHits,
CacheRead,
"Commit",
DiskRead,
DiskWrite,
FullCompare,
IndAdd,
IndLookup,
Isolation_level,
LastReqTime,
LastStatement,
LockCount,
LockName,
LockTableOID,
LoginTime,
LogWrite,
Name,
NodeAddress,
Prepares,
PrepStmt,
QueryLowMemoryStrategy,
QueryOptimized,
QueryReused,
ReqCountActive,
ReqCountBlockContention,
ReqCountBlockIO,
ReqCountBlockLock,
ReqCountUnscheduled,
ReqStatus,
ReqTimeActive,
ReqTimeBlockContention,
ReqTimeBlockIO,
ReqTimeBlockLock,
ReqTimeUnscheduled,
ReqType,
RequestsReceived,
Rlbk,
RollbackLogPages,
TempFilePages,
TransactionStartTime,
UncommitOp,
Userid,
previous_ApproximateCPUTime,
interval_ApproximateCPUTime,
previous_Commit,
interval_Commit,
previous_Rlbk,
interval_Rlbk
FROM #t;
GO
DECLARE @rows_copied_count BIGINT
EXECUTE copy_mss_t2 1110001, 1120000, @rows_copied_count OUTPUT
SELECT @rows_copied_count
GO
EXECUTE create_linked_server
GO
DECLARE @rows_copied_count BIGINT
EXECUTE copy_mss_t2 1120001, 1130000, @rows_copied_count OUTPUT
SELECT @rows_copied_count
GO
EXECUTE create_linked_server
GO
Hier ist der SQL Server-Tabelle, die etwa 1G Daten in 1,9 Millionen Zeilen:
CREATE TABLE mss_t2 (
sampling_id BIGINT NOT NULL,
sample_set_number BIGINT NOT NULL,
connection_number BIGINT NOT NULL,
blocker_owner_table_name VARCHAR ( 257 ) NULL,
blocker_lock_type VARCHAR ( 32 ) NULL,
blocker_owner_name VARCHAR ( 128 ) NULL,
blocker_table_name VARCHAR ( 128 ) NULL,
blocker_reason TEXT NULL,
blocker_row_identifier VARCHAR ( 32 ) NULL,
current_engine_version TEXT NOT NULL,
page_size INTEGER NOT NULL,
ApproximateCPUTime DECIMAL ( 30, 6 ) NULL,
BlockedOn BIGINT NULL,
BytesReceived BIGINT NULL,
BytesSent BIGINT NULL,
CacheHits BIGINT NULL,
CacheRead BIGINT NULL,
"Commit" BIGINT NULL,
DiskRead BIGINT NULL,
DiskWrite BIGINT NULL,
FullCompare BIGINT NULL,
IndAdd BIGINT NULL,
IndLookup BIGINT NULL,
Isolation_level BIGINT NULL,
LastReqTime TEXT NOT NULL DEFAULT '1900-01-01',
LastStatement TEXT NULL,
LockCount BIGINT NULL,
LockName BIGINT NULL,
LockTableOID BIGINT NULL,
LoginTime TEXT NOT NULL DEFAULT '1900-01-01',
LogWrite BIGINT NULL,
Name VARCHAR ( 128 ) NULL,
NodeAddress TEXT NULL,
Prepares BIGINT NULL,
PrepStmt BIGINT NULL,
QueryLowMemoryStrategy BIGINT NULL,
QueryOptimized BIGINT NULL,
QueryReused BIGINT NULL,
ReqCountActive BIGINT NULL,
ReqCountBlockContention BIGINT NULL,
ReqCountBlockIO BIGINT NULL,
ReqCountBlockLock BIGINT NULL,
ReqCountUnscheduled BIGINT NULL,
ReqStatus TEXT NULL,
ReqTimeActive DECIMAL ( 30, 6 ) NULL,
ReqTimeBlockContention DECIMAL ( 30, 6 ) NULL,
ReqTimeBlockIO DECIMAL ( 30, 6 ) NULL,
ReqTimeBlockLock DECIMAL ( 30, 6 ) NULL,
ReqTimeUnscheduled DECIMAL ( 30, 6 ) NULL,
ReqType TEXT NULL,
RequestsReceived BIGINT NULL,
Rlbk BIGINT NULL,
RollbackLogPages BIGINT NULL,
TempFilePages BIGINT NULL,
TransactionStartTime TEXT NOT NULL DEFAULT '1900-01-01',
UncommitOp BIGINT NULL,
Userid VARCHAR ( 128 ) NULL,
previous_ApproximateCPUTime DECIMAL ( 30, 6 ) NOT NULL DEFAULT 0.0,
interval_ApproximateCPUTime AS ( COALESCE ( "ApproximateCPUTime", 0 ) - previous_ApproximateCPUTime ),
previous_Commit BIGINT NOT NULL DEFAULT 0,
interval_Commit AS ( COALESCE ( "Commit", 0 ) - previous_Commit ),
previous_Rlbk BIGINT NOT NULL DEFAULT 0,
interval_Rlbk AS ( COALESCE ( Rlbk, 0 ) - previous_Rlbk ) )
Hier ist die Ziel-Tabelle in SQL Anywhere 11:
CREATE TABLE sa_t2 (
sampling_id BIGINT NOT NULL,
sample_set_number BIGINT NOT NULL,
connection_number BIGINT NOT NULL,
blocker_owner_table_name VARCHAR ( 257 ) NULL,
blocker_lock_type VARCHAR ( 32 ) NULL,
blocker_owner_name VARCHAR ( 128 ) NULL,
blocker_table_name VARCHAR ( 128 ) NULL,
blocker_reason TEXT NULL,
blocker_row_identifier VARCHAR ( 32 ) NULL,
current_engine_version TEXT NOT NULL,
page_size INTEGER NOT NULL,
ApproximateCPUTime DECIMAL ( 30, 6 ) NULL,
BlockedOn BIGINT NULL,
BytesReceived BIGINT NULL,
BytesSent BIGINT NULL,
CacheHits BIGINT NULL,
CacheRead BIGINT NULL,
"Commit" BIGINT NULL,
DiskRead BIGINT NULL,
DiskWrite BIGINT NULL,
FullCompare BIGINT NULL,
IndAdd BIGINT NULL,
IndLookup BIGINT NULL,
Isolation_level BIGINT NULL,
LastReqTime TEXT NOT NULL DEFAULT '1900-01-01',
LastStatement TEXT NULL,
LockCount BIGINT NULL,
LockName BIGINT NULL,
LockTableOID BIGINT NULL,
LoginTime TEXT NOT NULL DEFAULT '1900-01-01',
LogWrite BIGINT NULL,
Name VARCHAR ( 128 ) NULL,
NodeAddress TEXT NULL,
Prepares BIGINT NULL,
PrepStmt BIGINT NULL,
QueryLowMemoryStrategy BIGINT NULL,
QueryOptimized BIGINT NULL,
QueryReused BIGINT NULL,
ReqCountActive BIGINT NULL,
ReqCountBlockContention BIGINT NULL,
ReqCountBlockIO BIGINT NULL,
ReqCountBlockLock BIGINT NULL,
ReqCountUnscheduled BIGINT NULL,
ReqStatus TEXT NULL,
ReqTimeActive DECIMAL ( 30, 6 ) NULL,
ReqTimeBlockContention DECIMAL ( 30, 6 ) NULL,
ReqTimeBlockIO DECIMAL ( 30, 6 ) NULL,
ReqTimeBlockLock DECIMAL ( 30, 6 ) NULL,
ReqTimeUnscheduled DECIMAL ( 30, 6 ) NULL,
ReqType TEXT NULL,
RequestsReceived BIGINT NULL,
Rlbk BIGINT NULL,
RollbackLogPages BIGINT NULL,
TempFilePages BIGINT NULL,
TransactionStartTime TEXT NOT NULL DEFAULT '1900-01-01',
UncommitOp BIGINT NULL,
Userid VARCHAR ( 128 ) NULL,
previous_ApproximateCPUTime DECIMAL ( 30, 6 ) NOT NULL DEFAULT 0.0,
interval_ApproximateCPUTime DECIMAL ( 30, 6 ) NOT NULL COMPUTE ( COALESCE ( "ApproximateCPUTime", 0 ) - previous_ApproximateCPUTime ),
previous_Commit BIGINT NOT NULL DEFAULT 0,
interval_Commit BIGINT NOT NULL COMPUTE ( COALESCE ( "Commit", 0 ) - previous_Commit ),
previous_Rlbk BIGINT NOT NULL DEFAULT 0,
interval_Rlbk BIGINT NOT NULL COMPUTE ( COALESCE ( Rlbk, 0 ) - previous_Rlbk ),
PRIMARY KEY ( sample_set_number, connection_number ) );
Vorläufige Angaben sind, dass Sie mehrere TEXT-Spalten in der Originaltabelle bewirkt, dass der SQL Server-Speicher-Leck. Ändern sich aber eine TEXT-Spalte in VARCHAR scheint, den trick zu tun. Ein vollständiger test ist bis zu 250.000 Zeilen mit null-RAM erhöhen; ich werde warten, bis es fertig ist, dann stellen Sie sich eine kleine reproduzierbar.
InformationsquelleAutor |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht, Sie müssen zum leeren des temp-Tabelle
#t
nach jeder iteration? also fügen Sie einTRUNCATE TABLE #t
am Ende der Prozedur? Ich denke, dass der temp-Tabelle#t
existiert, bis Ihre Sitzung beendet ist, nicht, bis die gespeicherte Prozedur beendet wird.SELECT INTO
nur an die bestehenden#t
, aber nicht ersetzen.Eine andere Sache wäre, verwenden Sie eine permanente Tabelle nicht etwas in tempdb gespeichert
#tables
.Von all den Antworten, einschließlich der, die gelöscht wurde, ich mag deins ist das beste, ich gebe Ihnen die bonus.
Natürlich, es ist nicht das ist Antwort (siehe meine Antwort unten), aber es ist irgendwie albern, bieten einen bonus, bekommen alle die interessiert mein problem, und dann reißen Sie den bonus Weg!
Wenn jemand will, um upvote die Frage, wäre dankbar... es ist eine echte Fehler in SQL Server 2008, erfordert harte Neustart. Ich denke, die downvote war kindisch, aber das ist nur meine Meinung 🙂
Genial, vielen Dank. Ich Wünsche Ihnen viel Glück in ein work-around!
InformationsquelleAutor
Das problem ist mit einem verknüpften server über die SQL Anywhere 11.0.1 Anbieter SAOLEDB.11 einfügen von Daten in eine Spalte Ziel erklärt, die größer als VARCHAR ( 8000 ). Hier ist eine vereinfachte reproduzierbar:
InformationsquelleAutor
Könnte man versuchen, das einfügen in den Reihen, anstatt den ganzen Datensatz auf einmal an.
Versuchen Sie, ein kleiner Stapel, nicht alle den Weg zu einem. Halten Sie eine Senkung der batch-Größe, bis es funktioniert. Oder alternativ versuchen, die Datensätze über ein SSIS-Paket statt einen verknüpften server.
Experimente zeigen, das memory leak ist nicht im Zusammenhang mit dem batch-Größe, insbesondere der memory leak ist um Größenordnungen größer als die Menge der übertragenen Daten. Auch der Sinn und Zweck dieses Codes ist die Nutzung miteinander verbundener server-Funktionalität, für die Zwecke eines Artikels über das Thema. Danke für den Vorschlag über SSIS, ich gebe es zu gehen (aber, leider, "In der SQL Server Express, die Möglichkeit, das Paket zu speichern, erstellt der Assistent ist nicht verfügbar.")
Ich würde das nicht stören: die Antworten werden markiert, wenn Sie nicht das Problem lösen, auch wenn Sie nicht falsch
SSIS fehlgeschlagen ist viel schneller, nach weniger als 3000 Zeilen es über. Eine Google-Suche zeigt, dass 0x8007000E bedeutet wahrscheinlich, dass Speicher erschöpft, und Task-Manager unterstützt, die (von 1G bis 4G RAM verwendet, in ein paar Sekunden). Ich vermute, SSIS ist mit der gleichen Logik, die als Verknüpfte Server. Fehler 0xc0202009: Datenfluss-Aufgabe 1: SSIS-Fehlercode DTS_E_OLEDBERROR. Ein OLE DB-Fehler aufgetreten. Fehler-code: 0x8007000E.
InformationsquelleAutor HLGEM
Anstelle der Verwendung von Temp-Tabellen, können Sie versuchen, mit Variable Tabellen?
zB.
InformationsquelleAutor
Ich hatte ein ähnliches problem, mein code enthält Verwendung eines einfachen #temp-Tabelle in einer Schleife, die dies verursacht, und ich ersetzt durch eine permanente Tabelle.
Scheint zu funktionieren.
Dank
Naveen
InformationsquelleAutor