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 inzwische

AKTUALISIERE Ich habe überprüft und festgestellt, dass der Wechsel vonPreparedStatement zuStatementverbessert 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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage