סקריפט לשדרוג טבלאות ל-Clusterd ColumnStore Index

יום רביעי, פברואר 1, 2017

תחום ה-ColumnStore עבר כמה וכמה שינויים מאז שהוצג לראשונה בגרסת 2012.כיום, בגרסת 2016, ניתן ליצור כבר Clusterd ColumnStore Index שזו טבלה הבנוייה כ-ColumnStore, ולא רק טבלה סטנדארטית שיש לה בנוסף אינדקס ColumnStore; והרבה מהמגבלות שצויינו בפוסט שלי מאז – הוסרו.כדאי לציין שהמונח Clusterd ColumnStore Index קצת מטעה, כי בניגוד ל-Clustered Index “רגיל” (RowStore) – הוא אינו ממויין פיזית; ולכן ראוי היה לקרוא לו ColumnStore Heap, אלא ששם זה לא נשמע כל כך טוב.. אני מצרף בזאת סקריפט לשדרוג טבלאות ל-Clustered ColumnStore Index (מחולל את פקודות ה-TSQL הרלוונטיות): טבלאות שיש להן כבר Clustered Index “רגיל” (RowStore) יכולות להשתדרג בשלב...

Linked Servers – מקרים מיוחדים

יום שלישי, ינואר 31, 2017

ברוב במקרים, כשיוצרים Linked Server הולכים בדרך הישר: קישור לשרת ב-Dommain שלנו אליו אנחנו פונים ב-Linked Server ששמו כשם השרת, ויוצרים אותו בקלילות בעזרת ה-Wizard ב-SSMS.לעיתים יש מקרים מיוחדים, ואז צריך להתחיל לעבוד עם פרוצדורות המערכת ולהסתבך קצת (אני מדבר רק על עצמי..). לפני כשנה וחצי הצגתי את הקוד ליצירת Linked Server ל-SQL Azure, אך אחזור על כך לידיעת המאזינים שהצטרפו זה עתה: Exec master.dbo.sp_addlinkedserver @server=N'MyLinkedServer', ...
אין תגובות

הוספת שורות לשתי טבלאות בו זמנית

יום חמישי, דצמבר 1, 2016

פעם כתבתי פוסט על הנושא, בעיקר בתור אתגר; בשם חסכו ואמצו (2).באופן כללי, ניתן לשלוף את השורות שהשתנו (במקרה זה – התווספו) על ידי האופרטור Output,ואם קצת מתחכמים – להפנות את הפלט של ה-Output לטבלה שניה.בערך כך: If Object_ID('B') Is Not Null Drop Table B; If Object_ID('A') Is Not Null Drop Table A; Create Table A(ID Int Identity Primary Key, ...
אין תגובות

סטטיסטיקה: עדכון וקבלת החלטות

יום רביעי, אפריל 13, 2016

הפוסט שלהלן ממחיש את השימוש בסטטיסטיקה על ידי המערכת לבחירת ה-Execution Plan, ואת השפעתה של סטטיסטיקה לא מעודכנת על שימוש זה ואיכות הבחירה. בעזרת טבלת sys.messages (טבלת מערכת בת כ-250,000 שורות) אבנה טבלה עם נתונים היסטוריים, כלומר- אכניס את תוכן טבלת המערכת לטבלה שאבנה, בתוספת תאריך: If Object_ID('T_Messages','U') Is Not Null Drop Table T_Messages; Create Table T_Messages ( DateTime Not Null, message_id Int Not Null, language_id Int Not Null, ...

היכן הפסיק ה-n-י? (מציאת מופע של תת מחרוזת): גרסת ה-String_Split

יום חמישי, אפריל 7, 2016

לפני למעלה מ-6 שנים, בראשית דרכי כבלוגר, פרסמתי את הפוסט היכן הפסיק ה-n-י? (מציאת מופע של תת מחרוזת):נתונה טבלה ובה עמודת Subjects עם מקצועות שונים שכל סטודנט לומד - Create Table T_Students (Name VarChar(50), Subjects VarChar(Max));GoInsert Into T_StudentsValues ('Ana','Geography,Literature'), ('Beni','Chemistry,Economics,History,Sociology'), ('Carmel',''), ('Dana','Literature,Economics,Philosophy,Sociology'), ('Eli','Zoology,Economics,Geography,History,Science'), ('Felicia','Medicine');Go ויש לשלוף את המקצוע הרביעי (אם יש..) של כל סטודנט.הפתרון שאז מצאתי, בלוגר צעיר ונרגש שחרד...

Create & Drop Index

יום רביעי, אפריל 6, 2016

מה, זה לא צריך להיות Drop & Create? מוחקים אינדקס קיים, ויוצרים מחדש גרסה משופרת שלו, בדרך כלל עם תוספת של עמודה לאינדקס עצמו או לרשימת ה-Include..אז זהו שלא, וזה שייך לפינת ה”וואלה?” של השבוע, ובעברית - “איך לא חשבתי על זה קודם?”..פיני קרישר, ראש הצוות הבלתי נלאה, סיפר לי שקודם הוא עשה Drop לאינדקס, ואז תוך כדי כך שהאינדקס החדש נבנה – משימה כבדה בפני עצמה,  השרת התחיל לטחון Table Scans כי האינדקס לא היה קיים וה-Execution Plan השתנה לרעה, ה-CPU נסק אל על, ה-IO חגג, והשמחה הייתה רבה..בפעם הבאה ניצור קודם כל את האינדקס החדש עם שם...
תגיות: , ,
אין תגובות

חיתוך בין רשימות בעזרת הפונקצייה String_Split

יום שלישי, מרץ 29, 2016

הפונקצייה החדשה בגרסת 2016 יכולה להוות מקור לשימושים מעניינים. נכון שגם בעבר יכולנו ליצור user defined function בעזרת TSQL או בעזרת CLR, אלא שהחוכמה אינה לומר “מצאתי פתרון בעזרת פונקציית CLR שעושה את העבודה” אלא “מצאתי פתרון בעזרת מה שיש”. כעת “מה שיש” כולל גם את String_Split. אלו החוקים! (שלי לפחות..) הדוגמה שלהלן מעט מלאכותית, אבל יכולה להיות שימושית בנסיבות מסויימות, וזה תנאי מספיק לכתיבת פוסט.נתונה טבלת עובדים/תלמידים ולכל אחד מצויינות השפות בהן הוא שולט: If Object_ID('tempdb..#T','U') Is Not Null Drop Table #T; Create Table #T(Name NVarchar(10), ...
אין תגובות

פונקצייה חדשה: String_Split

יום שני, מרץ 28, 2016

פונקצייה חדשה שהתווספה לגרסה האחרונה של 2016, וכפי ששמה מעיד עליה – היא מבצעת Split והופכת מחרוזת לסט.בערך כך: Select *From String_Split('1,2,3,4,5,6,7,8,9,10',','); צריך להעביר שני פרמטרים: המחרוזת שצריך לפצספלט (שילוב של פיצול וספליט) והתו המפריד בין ערך לערך (תו אחד בלבד!).עד כה היינו צריכים להתלבט בין שימוש ב-CTE רקורסיבי או XML (מוסרבל ולא יעיל), דרך פונקציית משתמש (יותר יעיל אך מחייב יצירת אובייקט), וכלה בפונקציית CLR (הכי יעיל אבל צריך “ללכלך” את הידיים ולתחזק את הקוד). כעת יש כלי מובנה והחיים נראים יפים מתמיד! טוב. אז מה עושים עם זה: אמרנו כבר Split?...
אין תגובות

פנייה בין דטבייסים שונים ב-Azure

יום חמישי, מרץ 24, 2016

כדי לגשת משרת On Premise ל-Azure, ניתן להשתמש ב-Linked Server, אך כיצד לגשת מ-Azure ל-Azure? הרי גם פנייה מדטבייס אחד לאחר בתוך אותו שרת אינה אפשרית ב-Azure, אז לא כל שכן בין שרתים שונים.. בדטבייסים מגרסת V12 יש כעת פתרון יחודי, השונה מה-Linked Server המוכר בכך שלא יוצרים איזה אובייקט או קישור דרכו ניגשים לכל האובייקטים בדטבייס האחר, אלא לכל אובייקט יוצרים קישור נפרד המבוסס על תשתית משותפת.. הבנתם משהו?.. לא הרבה, והאשם ביכולת הניסוח הלקוייה שלי, ולכן טוב מראה עיניים: דוגמה! ניגש קודם כל לדטבייס Azure ממנו נרצה לקרוא נתונים, וניצור שם טבלה עם מעט נתונים ו-View: If Object_ID('T_Try','U') Is Not...
אין תגובות

יצירת כל תתי הקבוצות לקבוצה נתונה

יום שלישי, פברואר 16, 2016

הפוסט הזה נכתב בעקבות בעייה אמיתית, אבל כדי לפשט ולהקל אתמקד בעניין העקרוני ולא המעשי.נתונה קבוצת המספרים 1..N, ואנחנו מעוניינים לקבל את כל תתי הקבוצות שלה.ל-N מספרים יש (2 בחזקת N) תתי קבוצות. למשל: לקבוצה {1,2} יש 2^2=4 תתי קבוצות: {},{1},{2},{1,2}, והן כוללות גם את הקבוצה הריקה {} וגם את הקבוצה המקורית כולה – הקבוצה האוניברסלית - {1,2}.למה (2 בחזקת N) תתי קבוצות? כי כל איבר יכול להיות בקבוצה ויכול לא להיות (=2 אפשרויות), ולכן יש לכפול את 2 בעצמו כמספר האיברים הקבוצה.אציג להלן 2 דרכים שונות להתמודד עם המשימה.הדרך הראשונה מחוללת את (2 בחזקת N) המספרים, וליצוג הבינארי...
אין תגובות