none
הכנסה בbulk באמצעות פייתון RRS feed

  • שאלה

  • אהלן.יש לנו לקוח שמכניס לdb מאות רשומות בשנייה.הוא חייב כמובן להכניס אותן בbulk כדי לא לטחון את השרת.הבעיה היא שהוא מבצע את ההכנסה מפייתון.חיפשנו מספר ימים כיצד לבצע הכנסה מפייתון בבאלק ללא הצלחה. גם הספריות שלכאורה כן מכניסות בבאלק - מאחורי הקלעים מכניסות רשומות בודדות.

    כרגע אנחנו חושבים על שתי שיטות. אשמח לשמוע ייתרונות/חסרונות של כל אחת ואם יש לכם- רעיונות יותר מוצלחים

    הראשונה - שהם יכתבו את המידע לקובץ csv ואנחנו נקרא אותו כל מספר דקות באמצעות bulk insert

    השנייה - לשלוח string ארוך של insert עם הרבה רשומות באותו הstatment

    תודה

    יום שני 31 אוגוסט 2015 07:20

תשובות

  • אהלן קדאפי

    שים לב לשעה :-)
    04:30

    אני אנסה לקצר...

    אני לא מכיר את פייתון אבל יודע בוודאות שהיא עובדת עם bulk insert.
    יש לי הרגשה לא מבוססת (ז"א אני לא יכול להיות בטוח) לפי המידע כאן שיש לכם מעט בילבול לגבי הייתרונות של bukl insert לעומת ייבוא ב BULKS ברמת האפליקציה. אני מציע לחפש חומר על:

    sql server minimal logging

    וכן על 

    sql server bulk insert

    בנפרד ולקבבל מסקנות משותפות :-)

    * בכל מקרה נשמע על פני השטח שהאפשרות הראשונה הרבה יותר נכונה לכם.
    כאמור לאחר לימוד הנושאים שהזכרתי, תבין שגם אם אתם שולחים את המידע בשרשרת אחת ממיקום מרוחק לשרת נוכחי ואז מפרקים לפני שמכניסים לטבלה המתאימה, אז הרי שאתם צריכים לעבוד עם bulk insert בשלב הייבוא. אלא אם אתה מתכוון לשמור את השרשרת במסד הנתונים כפי שהיא, במקום לעבוד עם הנתונים עצמם, במקרה זה ייתכן שאתם בכלל לא עובדים עם סוג של מסד נתונים שלא מתאים לכם, וצריך לחשוב על מסדי נתונים של מסמכים.

    ברמת האפליקציה כדאי לבצע את הייבוא בכל מקרה בחלוקה כלשהיא ל BULKS. אם עובדים עם טכנולוגיה/שפה שהדרייבר שלה מתאים לכך אז ניתן לבצע את ישירות בהגדרות ה CONNECTION STRING ואם לא אז כדאי לפעמים לנהל חלוקה ברמת האפליקציה. עבודה עם קבצי ביניים יכולה לחסוך הרבה מהמורכבות ומאוד יעילה בדרך כלל.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    יום שלישי 01 ספטמבר 2015 01:42
    מנחה דיון
  • לפי מה שאני מבין ממך כרגע ההתמקדות היא הבעיה של ה BULK INSERT. אם כן ישנם כמה כיוונים שאתה יכול לבדוק:

    1. אם היית מגיע להרצאה שלי במייקרוסופט בקבוצת ה SQL, אז היית לומד כיצד אפשר לעבוד עם INSTEAD OF TRIGGER, על מנת לנטר בעיות של BULK INSERT שהשרת לא מאפשר לדלג עליהם :-)

    לא ניתן להעביר במסכגרת הפורום הרצאה שלמה שגם כך מקוצרת מאוד, אבל אני יכול להפנות אותך לאפשרות של שימוש ב INSTEAD OF TRIGGER על מנת לבדוק את המידע שאתה מכניס ולהכניס רק מידע תקין, בזמן שמידע לא תקין יועבר לקובץ לוג. צריך כמובן ללמוד קצת את הנושא של קצת משלבים BULK INSERT עם טריגרים שבברירת המחדל אינם מופעלים בפעולת BULK.

    2. להתמקד בביצוע BULK INSERT בצורה מיטבית תוך הבנת התהליך והאפשרויות השונות המובנות.

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

    דרך אגב, הלקוח שלך משלם לך עבור פתרון ולא הוא צריך למצוא את הפתרון עבורך :-)

    אם הצלחת לכתוב קובץ דטא בפורמט CSV, אז אתה צריך לשלוט בפורמט שלו. מילת המפתח היא מה פורמט! מה הפורמט של הקובץ שאתה ייצרת. הבעיה היחידה שיכולה להיות היא בפורמט הקובץ בהתאמה ל DDL (מבנה מסד הנתונים). אין בעיה לקרוא אותו בדיוק כמו שכתבת אותו, תיאורטית. אני ממליץ לחפש חומר על שימוש בקובץ פורמט XML בו תוכל להגדיר מה הפורמט של קובץ הנתונים שלך.

    3. ישנם מצבים בהם פעולה ישירה של BULK INSERT לא מתאפשרת מפני שהקובץ אינו בפורט קבוע. במצבים אלו צריך עבודה עקיפה. אבל אם הקובץ הוכן בפייטון אז כניראה שהוא ניתן ליבוא ללא בעיה בצורה ישירה. בכל מקרה תעבור על המאמר הבא שכתבתי בנושא עבור מצבים בהם לא ניתן לקבוע פורמט מסויים. הפתרון שלך יכול להיות דומה במקרים קיצוניים:

    Using Bulk Insert to Import Inconsistent Data Format (Using Pure T-SQL)

    ** אני יודע שזה נשמע כמו פרסום אבל אני באמת ממליץ לעבור על הבלוגים באתר שלי ועל המאמרים ולעקוב אחרי ההודעות שלי בפייסבוק (אני מודיע כאשר אני מעלה בלוג או מאמר חדש). אני חושב שכל שאלה כבר נשאלה וכתבתי עליה משהו בזמן כזה או אחר. אין (כמעט) שאלות חדשות :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]




    יום שני 14 ספטמבר 2015 18:27
    מנחה דיון
  • הי קדאפי,

    אתה אמור להיות מסוגל להכניס רשומות מ-Python באמצעות Bulk Copy.
    הנה דוגמא: http://stackoverflow.com/questions/14054411/python-and-sql-bulk-insert.
    אם אתם עדיים לא מצליחים, אז הרבה יותר יעיל לכתוב לקובץ ולטעון באמצעות Bulk Insert מאשר לשרשר רשומות לפקודת Insert אחת.
    לגבי הבאג שהזכרת שקשור ל-Bulk Insert, אני לא מכיר את זה. לא הצלחתי להבין מה-Connect אם זה באמת באג או שזה בגלל ההגדרה של Max Errors.
    ניסיתם לשחק עם Max Errors ולראות איך זה משפיע?

    -----------------------------
    גיא גלנצר
    יועץ והוגה דעות
    http://www.madeiradata.com
    יום שני 09 נובמבר 2015 06:49
    מנחה דיון

כל התגובות

  • אהלן קדאפי

    שים לב לשעה :-)
    04:30

    אני אנסה לקצר...

    אני לא מכיר את פייתון אבל יודע בוודאות שהיא עובדת עם bulk insert.
    יש לי הרגשה לא מבוססת (ז"א אני לא יכול להיות בטוח) לפי המידע כאן שיש לכם מעט בילבול לגבי הייתרונות של bukl insert לעומת ייבוא ב BULKS ברמת האפליקציה. אני מציע לחפש חומר על:

    sql server minimal logging

    וכן על 

    sql server bulk insert

    בנפרד ולקבבל מסקנות משותפות :-)

    * בכל מקרה נשמע על פני השטח שהאפשרות הראשונה הרבה יותר נכונה לכם.
    כאמור לאחר לימוד הנושאים שהזכרתי, תבין שגם אם אתם שולחים את המידע בשרשרת אחת ממיקום מרוחק לשרת נוכחי ואז מפרקים לפני שמכניסים לטבלה המתאימה, אז הרי שאתם צריכים לעבוד עם bulk insert בשלב הייבוא. אלא אם אתה מתכוון לשמור את השרשרת במסד הנתונים כפי שהיא, במקום לעבוד עם הנתונים עצמם, במקרה זה ייתכן שאתם בכלל לא עובדים עם סוג של מסד נתונים שלא מתאים לכם, וצריך לחשוב על מסדי נתונים של מסמכים.

    ברמת האפליקציה כדאי לבצע את הייבוא בכל מקרה בחלוקה כלשהיא ל BULKS. אם עובדים עם טכנולוגיה/שפה שהדרייבר שלה מתאים לכך אז ניתן לבצע את ישירות בהגדרות ה CONNECTION STRING ואם לא אז כדאי לפעמים לנהל חלוקה ברמת האפליקציה. עבודה עם קבצי ביניים יכולה לחסוך הרבה מהמורכבות ומאוד יעילה בדרך כלל.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    יום שלישי 01 ספטמבר 2015 01:42
    מנחה דיון
  • תודה.

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

    הפתרון שאנחנו מבצעים כרגע הוא כתיבה לקובץ (ע"י האפליקציה) וקריאת הקובץ ישירות ל-DB באמצעות BULK INSERT.

    אבל

    באג ב-SQL מונע ממני לזהות שגיאות במנגנון הטעינה.
    את מנגנון הטעינה בניתי בTSQL - קוד שרץ פעם בשלוש דקות וטוען את כל קבצי הCSV מהתיקייה אל הטבלאות הרלוונטיות.

    לצערי - כאשר קוד bulk insert נכשל - לא ניתן לתפוס אותו באמצעות TRY...CATCH!!!

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

    https://connect.microsoft.com/SQLServer/feedback/details/592960/bulk-insert-error-with-severity-level-16-were-not-caught-by-try-catch-blocks

    הפתרון שלי כרגע הוא לבדוק את מספר הרשומות בטבלה לפני הטעינה ואת מספר הרשומות לאחר הטעינה - אם המספר שונה - אז אני מקפיץ שגיאה.

    אני יודע שניתן לפתור את זה באמצעות SSIS - אבל זה לא פתרון כי זה אמור לעבוד ב-TSQL
    (האג'נדה שלי היא שכל מה שניתן לעשות באמצעות TSQL - תעשו באמצעות TSQL)

    יום שני 14 ספטמבר 2015 16:22
  • לפי מה שאני מבין ממך כרגע ההתמקדות היא הבעיה של ה BULK INSERT. אם כן ישנם כמה כיוונים שאתה יכול לבדוק:

    1. אם היית מגיע להרצאה שלי במייקרוסופט בקבוצת ה SQL, אז היית לומד כיצד אפשר לעבוד עם INSTEAD OF TRIGGER, על מנת לנטר בעיות של BULK INSERT שהשרת לא מאפשר לדלג עליהם :-)

    לא ניתן להעביר במסכגרת הפורום הרצאה שלמה שגם כך מקוצרת מאוד, אבל אני יכול להפנות אותך לאפשרות של שימוש ב INSTEAD OF TRIGGER על מנת לבדוק את המידע שאתה מכניס ולהכניס רק מידע תקין, בזמן שמידע לא תקין יועבר לקובץ לוג. צריך כמובן ללמוד קצת את הנושא של קצת משלבים BULK INSERT עם טריגרים שבברירת המחדל אינם מופעלים בפעולת BULK.

    2. להתמקד בביצוע BULK INSERT בצורה מיטבית תוך הבנת התהליך והאפשרויות השונות המובנות.

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

    דרך אגב, הלקוח שלך משלם לך עבור פתרון ולא הוא צריך למצוא את הפתרון עבורך :-)

    אם הצלחת לכתוב קובץ דטא בפורמט CSV, אז אתה צריך לשלוט בפורמט שלו. מילת המפתח היא מה פורמט! מה הפורמט של הקובץ שאתה ייצרת. הבעיה היחידה שיכולה להיות היא בפורמט הקובץ בהתאמה ל DDL (מבנה מסד הנתונים). אין בעיה לקרוא אותו בדיוק כמו שכתבת אותו, תיאורטית. אני ממליץ לחפש חומר על שימוש בקובץ פורמט XML בו תוכל להגדיר מה הפורמט של קובץ הנתונים שלך.

    3. ישנם מצבים בהם פעולה ישירה של BULK INSERT לא מתאפשרת מפני שהקובץ אינו בפורט קבוע. במצבים אלו צריך עבודה עקיפה. אבל אם הקובץ הוכן בפייטון אז כניראה שהוא ניתן ליבוא ללא בעיה בצורה ישירה. בכל מקרה תעבור על המאמר הבא שכתבתי בנושא עבור מצבים בהם לא ניתן לקבוע פורמט מסויים. הפתרון שלך יכול להיות דומה במקרים קיצוניים:

    Using Bulk Insert to Import Inconsistent Data Format (Using Pure T-SQL)

    ** אני יודע שזה נשמע כמו פרסום אבל אני באמת ממליץ לעבור על הבלוגים באתר שלי ועל המאמרים ולעקוב אחרי ההודעות שלי בפייסבוק (אני מודיע כאשר אני מעלה בלוג או מאמר חדש). אני חושב שכל שאלה כבר נשאלה וכתבתי עליה משהו בזמן כזה או אחר. אין (כמעט) שאלות חדשות :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]




    יום שני 14 ספטמבר 2015 18:27
    מנחה דיון
  • הי קדאפי,

    אתה אמור להיות מסוגל להכניס רשומות מ-Python באמצעות Bulk Copy.
    הנה דוגמא: http://stackoverflow.com/questions/14054411/python-and-sql-bulk-insert.
    אם אתם עדיים לא מצליחים, אז הרבה יותר יעיל לכתוב לקובץ ולטעון באמצעות Bulk Insert מאשר לשרשר רשומות לפקודת Insert אחת.
    לגבי הבאג שהזכרת שקשור ל-Bulk Insert, אני לא מכיר את זה. לא הצלחתי להבין מה-Connect אם זה באמת באג או שזה בגלל ההגדרה של Max Errors.
    ניסיתם לשחק עם Max Errors ולראות איך זה משפיע?

    -----------------------------
    גיא גלנצר
    יועץ והוגה דעות
    http://www.madeiradata.com
    יום שני 09 נובמבר 2015 06:49
    מנחה דיון
  • קדאפי?

    למה שלא תעדכן אותנו אם ואיך פתרתם את הבעיה?

    ועל הדרך, למה שלא תסגור את השרשור?

    תודה!

    -----------------------------
    גיא גלנצר
    יועץ והוגה דעות
    http://www.madeiradata.com

    יום שני 15 פברואר 2016 17:18
    מנחה דיון