MSSQL performance Tuning in VBS

isaias_b

Grünschnabel
Hi Leute,

ich habe ein hoffentlich kleineres Problem mit einem Codefragment.
Es sollen 10.000 Datensätze in einer entfernten MS DB eingefügt werden.
Zum Testen kann aber von einer lokalen DB ausgegangen werden.

Ich habe zum Vergleich eine Lösung in Java geschrieben die 10.000 Datensätze in 260ms einfügt.
Gegenüber steht die Lösung in VBS mit 510ms, welche ich schon um einige Größenordnungen optimieren konnte.
Vielleicht hat einer von euch noch eine Idee wie man dort noch etwas rauskitzeln kann.

Also Ziel ist es in VBS noch schneller zu werden, Anmerkungen zum Java Code sind aber auch immer willkommen, haben aber keine Priorität!!

Vielen Dank schon mal
Viele Grüße
Isaias

PS: kann mir irgendwer sagen was ich für einen Code-Block Tag für VBS code angeben muss****

Zu verbessernde Lösung in VBS:
Visual Basic:
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4
Const adUseClient = 3

Dim db
Set db = CreateObject ("ADODB.connection")
db.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=user;Initial Catalog=db;Data Source=srv;Pwd=pw"
db.Open
db.Execute "IF EXISTS(SELECT 1 FROM sys.objects WHERE OBJECT_ID = OBJECT_ID(N'test_table') AND type = (N'U')) DROP TABLE test_table"
db.Execute "create table test_table (id integer,str varchar(12))"

Dim rs
Set rs = CreateObject("ADODB.Recordset")
rs.CursorLocation = adUseClient
rs.Open "select * from test_table where 1=0;", db, adOpenStatic, adLockBatchOptimistic

Dim i
Dim t
Dim n
Dim delta
n = 10000

db.BeginTrans
t = timer ' start measuring
For i = 1 To n
	rs.AddNew
	rs.Fields("id") = i
	rs.Fields("str") = "test"
Next
rs.UpdateBatch
db.CommitTrans
delta = timer - t ' end measuring

Dim ratio
ratio = (delta) / i

msgbox 	"entries    = " & n & vbCrLf & _
		"time/entry = " & ratio & vbCrLf & _
		"time       = " & delta & vbCrLf

rs.close
Set rs = Nothing
db.close
Set db = Nothing

Lösung in Java:
Java:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

import net.sourceforge.jtds.jdbcx.JtdsDataSource;

public class SSCCE {

	public static void main(String[] args) {
		try {
			JtdsDataSource datasource = new JtdsDataSource();

			datasource.setDatabaseName("db");
			datasource.setServerName("srv");
			datasource.setUser("user");
			datasource.setPassword("pw");
			datasource.setPortNumber(1433);

			Connection connection = datasource.getConnection();

			Statement stmt = connection.createStatement();
			// mssql spezifisch, aber auch nicht mit anderen dbms getestet
			stmt.execute("IF EXISTS(SELECT 1 FROM sys.objects WHERE OBJECT_ID = OBJECT_ID(N'test_table') AND type = (N'U')) DROP TABLE test_table");
			stmt.execute("create table test_table (id integer,str varchar(12))");
			stmt.close();

			connection.setAutoCommit(false);
			PreparedStatement pstmt = connection
					.prepareStatement("insert into test_table(id, str) values(?,?)");

			int n = 10000;
			double t0 = System.currentTimeMillis();
			for (int i = 0; i < n; i++) {
				pstmt.setInt(1, i);
				pstmt.setString(2, "test");
				pstmt.addBatch();
			}
			pstmt.executeBatch();
			connection.commit();
			double delta = System.currentTimeMillis() - t0;

			System.out.println("entries    = " + n);
			System.out.println("time/entry = " + (delta / n) + " ms");
			System.out.println("time       = " + delta + " ms");
			
			pstmt.close();
			connection.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}
}
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück