קליטת קבצי טקסט לטבלה

29/06/2010

נתחיל מהמקרה הפשוט ביותר: נתון קובץ טקסט עם שמות עובדים אותם יש לקלוט, ונשמור אותו בתור C:\Tmp\TxtFile1.txt: Avi Batya Carmel Dana ניצור טבלה מתאימה: Use tempdb; Go If Object_Id('T_Tmp1') Is Not Null Drop Table T_Tmp1; Go Create Table T_Tmp1(Txt Varchar(Max)); Go ונייבא את הנתונים מהקובץ לתוכה: Bulk Insert T_Tmp1 From 'C:\Tmp\TxtFile1.txt'; Go מה קורה אם בטבלה יש עוד עמודות מלבד זו שלתוכה יש לייבא את הנתונים? ניצור טבלה שכוללת מלבד עמודה Txt כנ"ל גם עמודת מספור אוטומטי ועמודת תאריך (עם תאריך שוטף כברירת מחדל) שמתמלאות מאליהן: If Object_Id('T_Tmp2') Is Not Null Drop Table T_Tmp2; Go Create Table T_Tmp2(Mone Int Identity, Txt Varchar(Max), ...

Execution Plan: שליפה, פילטר ומיון בעזרת אינדקס

23/06/2010

נפתח בדוגמה- נציג את ה-Actual Execution Plan יל ידי Ctrl M ונריץ את הקוד הבא: Use AdventureWorks; Go Set Statistics IO On; Select ProductID From Production.TransactionHistoryArchive; Go בלשונית Messages נקבל את הפלט הבא פחות או יותר- (89253 row(s) affected) Table 'TransactionHistoryArchive'. Scan count 1, logical reads 124, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. בהרצה הראשונה יתכן ויהיו physical reads מכיוון שיש לקרוא את ה-Pages הרלוונטיים ל-Buffer, אך לאחר מכן הם יעלמו והקריאה תהיה רק מה-Buffer (מתבטא ב-Logical Reads). Scan count שווה 1 מכיוון שהתבצע Scan אחד של כל האינדקס, כפי שניתן לראות...

Execution Plan: ביצוע Join בין שתי טבלאות

21/06/2010

הבנת Execution Plans (להלן EP) זו משימה די בסיסית של כל מפתח או DBA. אישית- עד היום אני די מתקשה עם הנושא, ובדיונים בהם מוצגים EP אני מתרשם שאינני היחיד שידיעותיו לוקות בחסר. אנסה כתרגול לבחון EP במצבים שונים ולרדת לעומקם. ניצור שתי טבלאות נטולות אינדקסים – T1 עם 1000 המספרים השלמים 1..1000 (ועוד שדה טקסטואלי), ו-T2 עם 500 המספרים הזוגיים 2..1000 (ועוד שדה מספרי ושדה טקסטואלי) – פעם עם I=1 ופעם עם I=2 (כלומר- בכל טבלה יש 1000 שורות): If Object_Id('T2') Is Not Null Drop Table T2; Go If Object_Id('T1') Is Not Null Drop Table T1; Go With T As (Select 1 N, ...

ערכים ברשימה שאינם מופיעים בטבלה

20/06/2010

במקום העבודה שלי משתמשים באוראקל.. חז"ל כבר פסקו שמוטב לפשוט נבלה בשוק מלהזדקק למתנת בשר ודם, אז קל וחומר שמותר בשעת הדחק לעבוד עם אוראקל.. (זה נאמר כמובן בחיוך – אינני מזלזל חלילה במתחרים!). פנה אלי חבר מצוות הפיתוח בשאלה כיצד ניתן למצוא אילו ערכים ברשימה שבידו (רשימת ערכים מופרדים על ידי פסיקים) אינם מופיעים בטבלה; כלומר- לא המקרה הרגיל של Select * From .. Where .. Not In אלא המקרה ההפוך בו מחפשים מה נמצא ברשימה שבסוגריים אך לא בטבלה. הרהרתי ארוכות ואמרתי לו שלדעתי אין לזה פתרון, זולת להכניס את הרשימה לעורך טקסטואלי, להפוך אותה לסט תוך שימוש ב-Select וב-Union בין...
אין תגובות

בעיית הפּרש (שחמט)

אבי אבי רכב ישראל ופרשיו: לפרש עצמו אין בעייה, אלא לנו- כיצד ניתן לעבור עם הפרש על כל משבצות לוח השחמט ב-63 מהלכים חוקיים. בעייה זו בדומה לבעיית שמונה המלכות (לאיציק בן-גן יש פתרון פשוט ויעיל)– מהווה אתגר תכנותי מעניין מתחום השחמט. ניצור טבלת לוח שחמט בת 64 משבצות, ונציין ליד כל אחת את העמודה והשורה שלה: With Luah As (Select 1 Mishbezet, '01' MishbezetS, ...
אין תגובות

האופרטורים All, Any

17/06/2010

שני האופרטורים הנ"ל הם בבחינת Nice to have: ניתן להסתדר בלעדיהם, אבל תמיד טוב להכיר אופציות נוספות, מה גם שלרוב הם מבטיחים ביצועים לא פחות טובים מהחלופות, ובסוף אף אציג דוגמה לכך. האופרטורים הנ"ל בדומה לאופרטורים כמו Exists ו-In משווים סט אחד לשני ומציגים מהראשון רק את מה שעומד בתנאי, כאשר All מחייב שהתנאי יהיה נכון לכל המקרים בסט השני, ו-Any מחייב שהתנאי יהיה נכון לפחות למקרה אחד (הערה- האופרטור Any זהה ל-Some). למשל- להלן טבלת תלמידים וטבלת ציונים: Create Table T_Talmidim(Shem Varchar(Max)); ...
אין תגובות

חיפוש מילים שלמות בתוך מחרוזת

16/06/2010

לכאורה לא מסובך במיוחד- ניצור טבלה עם נתונים ונחפש באילו שורות מופיע גד: Use tempdb; Go   If Object_Id('T_Hipus') Is Not Null Drop Table T_Hipus Go Create Table T_Hipus(Mone Int, Mishpat Varchar(Max)); Go   Insert Into T_Hipus Select 1,'פגשתי את גד ברחוב' Union All Select 2,'פגשתי את גדי ברחוב' ...
אין תגובות

השוואה לשורה הקודמת

15/06/2010

ב-SQL Server בניגוד ל-Oracle לא קיימות הפונקציות Lag ו-Lead שמאפשרות להשוות שורה לקודמת לה, ולכן מי שמעוניין בהשוואה שכזו נאלץ ללכלך את ידיו ולכתוב SQL-ים מסובכים. האתגר אופייני בעיקר לניתוח של נתונים לאורך זמן, למשל- השוואה בין שער המניה היום לשער המניה ביום המסחר הקודם, השוואה בין המכירות החודש למכירות בחודש הקודם (או בחודש המקביל אשתקד) וכו'. פניתי ל-AdventureWorks לטבלה HumanResources.EmployeePayHistory ובדקתי ארבע שליפות שונות: 1. מספור השורות בעזרת CTE, ושליפת Left Join בין הטבלה לעצמה כך שלכל שורה תותאם הקודמת. 2. CTE רקורסיבי: מספור השורות, ולאחר מכן שליפה רקורסיבית בסדר...
אין תגובות

Identifying Related Tables

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

האח הגדול עינו פקוחה (7) – השימוש ב-Profiler

14/06/2010

הפרופיילר הוא כלי ותיק ומוכר, ולכן אינני מחדש כאן הרבה: מבוא כללי למי שכבר שכח או טרם התנסה, צילומי מסך, ולבסוף- הפעלה יזומה דרך ג'וב (קצת פחות מוכר). נפעיל את הפרופיילר: ניצור Trace חדש, נתחבר לשרת, ונבחר לאיזה קובץ להפנות את הפלט: ניתן (ורצוי) להגביל את גודל הקובץ, וניתן גם להגדיר שעת סיום. בלשונית Events Selection שב-Trace Properties ניתן להגדיר את אפשרויות ה-Trace, כאשר מה שמוצג כאן זו ברירת המחדל של המערכת שנועדה לסייע למתחילים: לסיום לוחצים על Run במסך Trace Properties. יש לעקוב אחר מה שמופיע על המסך, וכך ללמוד מה חשוב ומה מיותר, ולשנות את ההגדרות כדי להתאימן לצרכינו. כדי לתזמן את הריצה באמצעות...
אין תגובות