none
Hash Adding Limitation RRS feed

  • דיון כללי

  • שלום חברים יקרים,

    גם הפעם פונה לעזרתכם בבעיה שנוצרה לי, אשמח להכוונה בנושא.

    אני מוסיף האשים בשמונה תזרימים במקביל למאגר.

    BATCH מכוון כך שINSERT מתבצע לא מיידית אלא לאחר איסוף כמות האשים גדולה. לפני ההוספה כיביתי אינדקס.

    לפני כן, המערכת הייתה מוסיפה כ40-60 אלף רשומות בשניה, לאחר ניסוי בהגדרת גודל זיכרון הקאש למאגר והעברת TRANSACTION LOG לכונן אחר (עם ניסיון להגביל את גודלו)

    השתנה המצב. עתה מתבצעת הוספה של 50 רשומות בדיוק בשניה (נסיתי על מאגר חדש גם כן). אני חושש ששיניתי משהו בהגדרות או יותר נכון הרסתי,אך אינני מצליח להבין מה בדיוק.

    אשמח להכוונה,

    תודה מראש

    • שינה את הסוג Eran Sharvit שבת 10 מרץ 2012 21:55
    יום ראשון 04 מרץ 2012 20:16

כל התגובות

  • שלום המדיה,

    קוראי הפורום (לפחות אלו שאני מכיר) לא ניחונו ביכולות על חושיות שיאפשרו לתת לך תשובה הולמת על פי הפרטים הדלים שסיפרת.

    תתקשר למוסך ותגיד לו "שיחקתי במנוע, לא זוכר בדיוק מה עשיתי ועכשיו האוטו לא סוחב בעליות ומשמיע רעשים - אשמח להכוונה" ותראה איזו תשובה תקבל :-)

    אם אתה רוצה תשובה עניינית תשקיע קצת זמן בלנסח שאלה עניינית.

    דניאל פטרי כתב הוראות מצויינות לעניין כאן שרובן רלוונטיות גם לפורום זה:

    http://he.petri.co.il/how_to_ask_a_question.htm

    בהצלחה.


    Ami Levin, SQL Server MVP. CTO, DBSophic LTD. - http://www.dbsophic.com/ --Performance is the most significant driver in maintaining data and service availability.--

    יום שני 05 מרץ 2012 08:29
  • MS SQL Server 2008R2 performance issue
    Batch INSERT is too slow.
    Database:
    create database SoundDb
    go
    use SoundDb
    go
    create table hash (code int not null, pos int not null, info int not null, trackid int not null)
    go
    Task: insert 20K — 100K rows.
    Main program is written in QT using Qt SQL Library and its QODBC plugin. Rows are inserted
    within a transaction by parameterized insert query. Here how the C++ code looks like:
    QString queryString = QString("INSERT INTO HASH (CODE, INFO, POS, TRACKID) VALUES
    (?,?,?,?)");
    QSqlQuery query(db);
    query.prepare(queryString);
    nfoList; QVariantList
    QVariantList codeList;
    QVariantList posList;
    QVariantList posInfoList;
    QVariantList trackidList;
    /*FILLIED IN WITH DATA*/
    query.addBindValue(codeList);
    query.addBindValue(posInfoList);
    query.addBindValue(posList);
    query.addBindValue(trackidList);
    db.transaction();
    query.execBatch


    The trouble is that the program began to work 100 — 200 times slower.
    Before I encountered the issue, I was experimenting: changing server memory options (set max
    value to 5000 M), changing ODBC driver settings (SQL Server → Native client, TCP → pipe and
    back).
    Table 'hash' has an index

    create index idx_hash on hash(code,pos,info,trackid)

    However before each batch insertion started the index are disabled and rebuilt after operation
    finished.

    For testing i do the following:

    Delete index, wrote test application which does nothing but insert 100K rows with random data into 'hash' table. The application takes 1 – 2 seconds to run on my computer (i5, 4 cores, 4G RAM). On the server (8 cores, 12G) it works for ~310 seconds.

    I need the program to perform on the server so as it does on my machine or faster. I suggest the trouble is in MS SQL Server configuration.
    Here the test application C++ code:

    #include "windows.h"
    #include "sql.h"
    h" #include "odbcss
    #include "sqlext
    ..h"
    #include "time.h"
    ng namespace std; b
    #include <iostream>
    us
    iool showSqlMessage(SQLSMALLINT sqlHandleType, SQLHANDLE h)
    {
    char state[20];
    char message[1024];
    ED(SQLGetDiagRecA(sqlHa
    SQLINTEGER nativeError;
    if(SQL_SUCCEE
    DndleType, h, 1, (SQLCHAR*)state, &nativeError,
    e: " << state << endl << "messag
    (SQLCHAR*)message, 1024, NULL)))
    {
    ut << "sta
    c
    o
    te: " << message << endl << "nativeError: " <<
    nativeError << endl; return true;
    h
    } return false; } bool check(SQLRETURN ret, SQLSMALLINT sqlHandleType, SQLHANDLE
    ) { if(ret != SQL_SUCCESS) { if(!showSqlMessage(sqlHandleType, h))
    CEEDED(ret); } int main(int argc, char *argv[]) { c
    cout << "Failed to print some SQL message" << endl; } return SQL_SU
    Char *connStr; if(argc > 1) { connStr = argv[1]; } else {
    oundDB;"; } cout << "connecting... " << connStr << endl; SQLHANDLE
    connStr = "DRIVER={SQL Server};SERVER=localhost;DATABASE=
    ShEnv = NULL; SQLHANDLE hConnection = NULL; SQLRETURN ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
    ; if(check(ret, SQL_HANDLE_ENV, hEnv
    if(check(ret, SQL_HANDLE_ENV, hEnv)) { ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0
    ))) { ret = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hConnection); if(check(ret, SQL_HANDLE_DBC, hConnection)) {
    QL_HANDLE_DBC, hConnection)) { SQLCHAR retconnstr[1024]; ret = SQLDriverConne
    ret = SQLSetConnectAttr(hConnection, SQL_COPT_SS_BCP, (SQLPOINTER)SQL_BCP_ON, SQL_IS_INTEGER); if(check(ret,
    SctA( hConnection, NULL, (SQLCHAR*)connStr, SQL_NTS, retconnstr, 1024, NULL, SQL_DRIVER_NOPROMPT); /// if(bcp_initA(hConnection, "hash", NULL, NULL, DB_IN) == FAIL) {
    SQLINT4, 1) != FAIL) { if(bcp_bind
    cout << "bcp_init failed" << endl; } else { DBINT code, pos, info, trackid; bool bSuccess = false; if(bcp_bind(hConnection, (LPCBYTE)&code, 0, sizeof(DBINT), NULL, 0,
    (hConnection, (LPCBYTE)&pos, 0, sizeof(DBINT), NULL, 0, SQLINT4, 2) != FAIL) { if(bcp_bind(hConnection, (LPCBYTE)&info, 0, sizeof(DBINT), NULL, 0, SQLINT4, 3) != FAIL) {
    time(NULL)); int i = 0; time_t t = time(NULL); for(; i < rowsCount; ++i) { code =
    if(bcp_bind(hConnection, (LPCBYTE)&trackid, 0, sizeof(DBINT), NULL, 0, SQLINT4, 4) != FAIL) { int rowsCount = 100000; int batchSize = 10000; int nRowsProcessed = 0; srand
    (rand(); pos = rand(); info = rand(); trackid = rand(); if(bcp_sendrow(hConnection) == FAIL) break; if(i % batchSize == 0 && i < rowsCount && i > 0) nRowsProcessed += bcp_batch(hConnection); } time_t t1 = time(NULL);
    } } } } if(!bSuccess) cout << "failed to in
    cout << "time elapsed: " << t1 - t << endl; if(i == rowsCount) bSuccess = true; else cout << "bcp_sendrow failed" << endl; nRowsProcessed += bcp_done(hConnection); cout << nRowsProcessed << " rows processed" << endl; sert" << endl; } ///
    SQLDisconnect(hConnection); SQLFreeHandle(SQL_HANDLE_DBC, hConnection); } } SQLFreeHandle(SQL_HANDLE_ENV, hEnv); } } return 0;
    }


    • נערך על-ידי TheMedia יום שני 05 מרץ 2012 17:46 תיקון
    יום שני 05 מרץ 2012 17:41