Warum dauert die Abfrage von Microsoft SQL Server 2012 über JDBC 4.0, aber Sekunde (n) in Management Studio Minuten?
Ich beschäftige mich mit scheinbar einem Leistungsproblem, während ich ein relativ großes @ abruf<a href="http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html" rel="nofollow">ResultSet</a>
von einem Microsoft SQL Server 2012-Remoteclient zu einem Java-Client, der den Microsoft JDBC-Treiber 4.0 verwendet.
Wenn ich die entsprechende Abfrage auf dem Microsoft SQL Server Management Studio des Remoteservers ausführe, werden ca. 220k Zeilen fast augenblicklich. Wenn ich die gleiche Anfrage vom Client stelle, bleibt sie stehen. Der gleiche Test hat auch auf dem Client mit einer früheren Version der Datenbank funktioniert, bei der nur ca. 400 Zeilen qualifiziert.
Ich habe versucht, dies durch Anhängen von @ anzugeh;responseBuffering=adaptive"
an die URL übergeben anDriverManager.getConnection()
. Nachdem die Verbindung hergestellt ist, sehe ich diese Eigenschaft (unter anderem) im Ergebnis vonconnection.getMetaData().getURL()
, aber[connection.getClientInfo(responseBuffering)
kehrt zurücknull
, und außerdem blockiert der Client immer noch.
Was könnte hier schief gehen und wie kann ich einen Microsoft SQL-Server anweisen (nicht nur vorschlagen - programmgesteuert in Java), dass er Zeilen in kleineren Blöcken zurückgeben muss, anstatt alle auf einmal oder die JDBC-Abfragezeiten durch andere verbessern muss Maße
Zwei weitere Beobachtungen, die etwas seltsam erscheinen und möglicherweise auf eine völlig andere Ursache hinweisen:
Wenn der Client blockiert, zeigt er immer noch nur eine relativ geringe CPU-Auslastung, anders als ich es von einer Sammlung schwerer Speicherbereinigungen erwarten würde. "responseBuffering = adaptive" sollte das normale @ seStandar inzwischeAKTUALISIERE Ich habe überprüft und festgestellt, dass der Wechsel vonPreparedStatement
zuStatement
verbessert in meinem Fall nichts (es kann anscheinend bei @ helfander Fälle)
AKTUALISIERE Hier ist meine aktuelle Frage:
select
PARENT.IDENTIFIER as PARENT_IDENTIFIER,
PARENT.CLASS as PARENT_CLASS,
CHILD.TYPE as CHILD_TYPE,
CHILD.IDENTIFIER as CHILD_IDENTIFIER,
PROPERTY.IDENTIFIER as PROPERTY_IDENTIFIER,
PROPERTY.DESCRIPTION as PROPERTY_DESCRIPTION,
PROPERTY.TYPE as PROPERTY_TYPE,
PROPERTY.PP as PROPERTY_PP,
PROPERTY.STATUS as PROPERTY_STATUS,
PROPERTY.TARGET as PROPERTY_TARGET -- a date
from
OBJECTS as CHILD
left outer join RELATIONS on RELATIONS.CHILD = CHILD.IDENTIFIER
left outer join OBJECTS as PARENT on RELATIONS.PARENT = PARENT.IDENTIFIER
inner join PROPERTIES as PROPERTY on PROPERTY.OBJECT = CHILD.IDENTIFIER
where
PROPERTY.TARGET is not null
order by
case when PARENT.IDENTIFIER is null then 1 else 0 end,
PARENT.IDENTIFIER,
CHILD.IDENTIFIER,
PROPERTY.TARGET,
PROPERTY.IDENTIFIER