Ich habe einen funktionalen Index für eine Sybase-Tabelle erstellt.Warum sollte Sybase keinen funktionalen Index verwenden?
create index acadress_codpost_lower on acadress(LOWER(l5_codpost))
Ich führe dann eine komplexe Abfrage, die den Index verwendet. Ohne den Index dauert es 17,086 Sekunden. Mit dem Index dauert es 0,076 Sekunden.
Ich habe es von zwei verschiedenen SQL-Clients und auf Sybase-Servern für Entwicklung und Pre-Prod ausgeführt. In allen Fällen sehe ich die Beschleunigung aus dem Index.
Wenn wir jedoch eine identische Abfrage von Java ausführen (und ich weiß, dass es identisch ist, da ich das generierte SQL protokolliert und direkt in den SQL-Clients verwendet habe), ist die Leistung genau so wie vor dem Hinzufügen der Indizes.
Welchen möglichen Grund könnte es geben, dass identische SQL-Abfragen den Index verwenden, wenn sie von ACE und SQuirreL ausgeführt werden, aber nicht von Java?
Mein erster Gedanke ist, dass Sybase möglicherweise Ausführungspläne für die vorbereiteten Anweisungen zwischenspeichert und den Index nicht verwendet. Wir haben versucht, den Java-Server mehrmals neu zu starten (andere Dienste verwenden den Sybase-Server, so dass es schwieriger ist, zu springen) und es hat keinen Unterschied gemacht.
Die andere Möglichkeit ist, dass wir eine sehr alte Version der Sybase-Treiber verwenden:
jConnect (TM) for JDBC(TM)/7.00(Build 26502)/P/EBF17993/JDK16/Thu Jun 3 3:09:09 2010
Ist es möglich, dass funktionelle Indizes werden nicht von dieser Version von JConnect unterstützt?
Weiß jemand, ob irgendeine dieser Theorien richtig ist, oder ob es etwas anderes gibt, das ich verpasst habe?
Vielleicht relevant: [Anweisung Cache] (http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc31644.1570/html/sag2/CHDHGEFE.htm) Was genau Version von Sybase hast du? Und sind die Anfragen identisch? (nur eine wilde Vermutung, die Anweisung cache kann Groß-und Kleinschreibung beachten) –
Siehe auch diese Tipps: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc00967.1550/html /MigrationGuide/MigrationGuide14.htm –
Wie identisch sind die Abfragen von den 'anderen' Systemen gegenüber der Java-basierten Abfrage? Die vorbereitete Aussage kann auch das Problem sein, sind irgendwelche der Werte parametrisiert? Ein guter Test wäre, die identische SQL, die von der Konsole läuft, zu ziehen und sie in eine reguläre JDBC-Anweisung von Java einzufügen und sie "wie sie ist" auszuführen. – rolfl