SQL Server למפתחים: Unique Index ו- IGNORE_DUP_KEY

Wednesday, October 26, 2016

אחד הפיצ’רים הבסיסיים לסכימה של מסדי נתונים, היא היכולת להגדיר unique constraint. מאחורי הקלעים, Unique Constraints מתבססים על Unique Indexes שנוצרים כדי לשרת את ה- constraint, כלומר – כדי לאפשר ל- SQL Server לבדוק בזמן ביצוע פעולות הוספה ועדכון שה- constraint לא מופר. את הפוסט הזה אני רוצה להקדיש לפיצ’ר שימושי שמפתחים צריכים גם כן להכיר – שימוש ב- unique index על טבלה לסינון כפילויות בזמן ההכנסה. צריך להבדיל גם בין שני תתי-תרחישים אפשריים: לפעמים, נכונות המידע דורשת מאיתנו שלא יהיו שורות כפולות. למשל, אם אנחנו מנהלים טבלה של אזרחי ישראל – לא יכולים להיות שני אזרחים עם אותו...
תגיות: , ,
אין תגובות

SQL Server למפתחים: Transaction Isolation Level

Monday, October 24, 2016

הקדמה SQL Server, כמו כל דטאבייס רלציוני טוב, עונה על סט של עקרונות שנקראים ACID: ר”ת של Atomicity, Consistency, Isolation, Durability שמטרתם להבטיח את שלמות הנתונים במסד הנתונים. ממש ממש בגדול – העקרונות הללו אומרים שכשאתם מכניסים מידע לדטאבייס הוא נשאר שם, כשאתם שולפים נתונים אתם מקבלים נתונים אמיתיים ונכונים . בפוסט הזה אני רוצה להתמקד רק באחת מהמילים הללו: Isolation. מדובר למעשה בהגדרה (לכאורה) פשוטה: ההבטחה שגם אם שתי טרנזקציות רצות במקביל, תוצאת הביצוע שלהן בפועל תהיה כאילו הן רצו אחת אחרי השנייה.כמובן, שבפועל אנחנו כן נרצה שדברים יעבדו במקביל. ולכן, נרצה...
תגיות: , ,
3 תגובות

SQL Server למפתחים: Indexed Views לטיפול בנתונים סיכומיים

Saturday, October 22, 2016

הקדמה Indexed view הוא פיצ’ר מאד שימושי, אבל גם באופן יחסי פחות מוכר – לפחות לאוכלוסיית המפתחים. מדובר למעשה בשילוב בין Views לבין אינדקסים “רגילים” (non-clustered indexes) שקיימים על טבלאות. לפני שנבין מה הבעייה, ואיך אפשר להשתמש ב- Indexed Views כדי לפתור אותה, ניישר קו לגבי מס’ מונחים. View – אפשר לחשוב על view בתור שאילתת SELECT ששמורה בתור אובייקט ב-DB שלנו. אם, למשל, יש לנו view בשם MyView הוא יכול לייצג שאילתה כלשהי (למשל, SELECT ColumnA, Column B FROM MyTable WHERE ColymnC=5) וכל שאילתה שנריץ על ה- view תהיה בפועל כאילו הרצנו אותה על ה- result set שחוזר...
תגיות: , ,
תגובה אחת

SQL Server למפתחים: Bulk Insert ו- SqlBulkCopy

Saturday, October 15, 2016

הקדמה כל מפתח שעובד/עבד מול דטאבייס באשר הוא יודע איך מכניסים שורות לטבלה. מדובר באחת מהפעולות הבסיסיות, INSERT,. למשל, אם יש לי טבלה שמכילה 3 עמודות: עמודת ID עולה (IDENTITY), עמודה שמכילה ערך מספרי ועמודה של טקסט: CREATE TABLE .( IDENTITY(1,1) NOT NULL, NOT NULL, (2000) NOT NULL, CONSTRAINT PRIMARY KEY CLUSTERED ( ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ) ON אזי ה- SQL Statement שבו נשתמש כדי...
תגיות: , ,
2 תגובות

ייצור אוטומטי של סקריפטי התקנה והסרה של SQL CLR Functions / Stored Procedures

Tuesday, November 17, 2015

לפני כמה ימים פרסמתי פוסט על משהו קטן שעבדתי עליו בין תרגיל אינפי לתרגיל לינארית, שכולל למעשה אוסף של functions ו- stored procedures המאפשרים עבודה מול Redis מ- SQL Server, כאשר מרבית הפרוייקט זה סה”כ תפירה בין קוד C# קיים לעבודה מול Redis ל- SQL Server – שמתבצעת באמצעות SQL CLR, פיצ’ר חביב (למרות שהיה יכול להיות טוב משמעותית) שמאפשר לשלב ולכתוב רכיבים שונים בדטאבייס (functions, stored procedures וכו’) ב- C#. הדרישה שהייתה לי לצרכי פיתוח הייתה פשוטה – שבסוף כל build יהיה לי קובץ install.sql שכשאני מריץ אותו הוא מכיל את כל ה- CREATE statements של ה- CLR...
תגיות: , ,
אין תגובות

SQL: להפוך XML במבנה לא ידוע (חלקית) לתצוגה טבלאית

Saturday, November 14, 2015

היכולת לעבוד עם XML-ים ב- SQL Server לא חדשה בכלל וקיימת מזה גרסאות. בין הדברים שמתאפשרים בעבודה עם XML-ים זה אכסון XML-ים בטבלאות באמצעות datatype מותאם לכך, פונקציות לפירסור XML, ויכולת לייצא תוצאות של שאילתות לפורמט XML במקום לפורמט טבלאי. למשל, אם אנחנו רוצים לשלוף מ- sys.tables ולהציג את התוצאות כ-XML בפורמט טבלאי, כל שצריך לעשות זה להוסיף FOR XML statement בסוף. ניתן בצורה הזאת גם להשיג שליטה מוגבלת על מבנה ה-XML שמתקבל. למשל, בדוגמא הבאה, אני מגדיר שיהיה root element בשם items ושכל שורה תהיה עטופה בתור item: SELECT *FROM sys.tablesFOR XML PATH('item'), ROOT('items') ככה ייראה ה-XML שיתקבל: אבל,...
תגיות: , ,
אין תגובות

RediSql–קליינט לעבודה מול Redis מ- SQL Server

Thursday, November 12, 2015

אמ’לק: RediSql הוא קליינט אופן-סורסי חדש שזמין כעת, המאפשר עבודה מול דטאבייס Redis מ- T-SQL (כלומר, מ-SQL Server). להורדה והוראות התקנה. מה זה Redis? Redis הוא שרת in-memory database, המאפשר לאכסן מידע בתצורה של key-value pairs. מדובר בשרת מאד פופולרי, בעל ביצועים גבוהים, פשוט להתקנה ולשימוש. השימושים של Redis מגוונים, ויכולים לנוע בתרחישי שימוש רבים הנעים מ-caching (שימוש מאד פופולרי ב- Redis) ועד למנגנוני pub/sub פשוטים שדורשים ביצועים גבוהים. ההתקנה של Redis פשוטה מאד (הגרסא הרשמית היא רק למערכות *nix, אבל יש גם גרסא ל-Windows). ל- Redis יש מגוון קליינטים אבל עד עתה לא היה ל- SQL Server (שמאפשר לעבוד עם Redis...
תגיות: , , ,
2 תגובות

לייצא טבלאות מה DB, כולל סכמה ונתונים מהאפליקציה באמצעות SMO

Tuesday, March 2, 2010

מה זה SMO? SMO, ר”ת של SQL Server Management Object, זה אוסך של אובייקטים החושפים פונקציונאליות של ניהול שרת SQL Server על רכיביו השונים ובכל הרמות (ניהול שרת, ניהול דטאבייסים, ניהול הרכיבים בדטאבייס מסויים וכו’). מדובר, למעשה, במקבילה דוט.נט-ית לרכיב שידוע בשם SQL-DMO (עוד ד”ת - SQL Distributed Management Objects). האסמבליס (קבצי הDLL) של SMO נמצאים בנתיב C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Smo.dll (מדובר בקבצים של SQL SERVER 2008, כאשר c:\Program Files זה כמובן תיקיית האפליקציות שלכם). המטרה המטרה בפוסט זה...
תגיות: , , , ,
אין תגובות

טיפ קצר: ייצוא מלא של הנתונים ב DB כולל סכמה ונתונים

Thursday, September 17, 2009

אפשרות חמודה שקיימת ב SQL Manegment Studio 2008 היא להגדיר לאופציית ה” GEnerate Scripts” של הדטאבייס גם לייצא את הנתונים (כלומר, לייצר משפטי INSERT לטבלאות). האפשרות הזאת לא קיימת בגרסא 2005 (יש Generate Scripts – אין Data – כלומר שלמדתי על בשרי כשלא הבנתי לאן נעלמה האפשרות), אבל אין שום מגבלה על התקנה ושימוש ב Management Studio 2008 גם מול instance של SQL Server 2005. השימוש העיקרי של האפשרות הזאת, הוא העברת מידע משרתי הפיתוח לפרודקשן כאשר רוצים להעביר טבלאות חדשות מסויימות או אובייקטים חדשים מסויימים בקלות. אפשר גם להעביר...
תגיות: , , ,
אין תגובות

עבודה עם קובץ trc

Sunday, July 12, 2009

כאשר עובדים עם profiler ניתן לייצא את הנתונים (וכך בד”כ עושים) לקובץ trc. במידה ורוצים לעבוד מול קבצי trc בקלות (בלי צורך בכל ה performance tools), ניתן לעבוד מולם באמצעות שאילתות TSQLפשוטות, בדיוק כמו טבלה. לצורך העניין, ניתן להשתמש ב fn_trace_gettable שמקבלת את שם הקובץ ומספר המסמן את כמות הקבצים שצריך לקרוא. לצורך הדוגמא, השאילתה הבאה תחזיר לנו את השאילתה עצמה, שם האפליקציה שהריצה את השאילתה, זמן הפעולה שלה והCPU שצרכה ותמיין לפי הזמן שלקח להריץ כל שאילתה: SELECT textdata,applicationname,duration,CPU FROM ::fn_trace_gettable(('c:\startup.trc'),default) WHERE duration is not null and textdata is not null ORDER BY duration DESC ...
תגיות: ,
אין תגובות