15 טיפים וטריקים לעבודה מול SQL Server
ציון שם בעל האובייקט
Stored Procedures, כידוע הן בלוקי קוד מקומפלים, ולכן יעילים יותר. אם ציון שם בעל (Owner) האובייקט, אם זו טבלה, view או SP אחרת, מייעל אותן בהרבה.
כשאר משתמש בשם moshe מריץ את השאילתה
SELECT fld1 FROM tbl
מנוע ה-SQL חייב להדר מחדש את השאילתה כדי להחליט אם להחזיר תוצאות מהטבלה moshe.tbl או את אלו מהטבלה dbo.tbl.
לכן רצוי תמיד לציין את שם הבעלים:
SELECT fld1 FROM [moshe].tbl
כדי למנוע הידור מחדש ולשפר את היעילות.
מיון תוצאות שאילתה באופן אקראי
כדי למיין תוצאות שאילתה באופן אקראי, או להחזיר מספר מסויים של רשומות אקראיות, ניתן להשתמש בפונקציה RAND בתוך משפט ה-SELECT. אבל פונקציה זו תחזיר לנו תמיד את אותן רשומות.
הפתרון השני הוא להשתמש בפונקציה NEWID כדי למיין את התוצאות, לדוגמא:
SELECT * FROM Northwind..Orders ORDER BY NEWID()
ולהחזרת 10 רשומות אקראיות, נכתוב:
SELECT TOP 10 * FROM Northwind..Orders ORDER BY NEWID()
קבלת פרטים על קובץ
כדי לקבל את פרטיו של קובץ פיזי הנמצא על הדיסק, נשתמש ב-xp_getfiledetails הנמצאת ב-Master:
Master..xp_getfiledetails "C:Program FilesMicrosoft SQL ServerMSSQLBinnsqlservr.exe"
בדיקת מקום פנוי על הדיסק
EXEC xp_fixeddrives
תחזיר לנו רשימה של כל הכוננים על המחשב, והפקום הפנוי בכל אחד מהם
ריקון טבלה
אם ברצונינו לרוקן טבלה מסויימת מכל הרשומות, כרגיל היינו כותבים:
DELETE FROM tbl
אך פעולה זו אינה יעילה, מכיוון שעל כל מחיקה של רשומה בודדת מהטבלה, היא מבצעת רישום בקובץ ה-LOG.
דרך הרבה יותר מהירה היא ע"י שימוש ב-TRUNCATE
TRUNCATE TABLE tbl
ימחוק את כל הרשומות בטבלה, אך יכתוב ללוג רק פעם אחת עבור כולן.
תיעוד
תיעוד קוד T-SQL אינו פוגע בביצועים!
ניתן לתעד שורה אחת ע"י הסימון '–'
-- This is a comment
או ניתן לתעד בתוך בלוק, תחום ב- '/* … */'
/* This is a comment block */
לחסוך ב-DISTINCT ו-ORDER BY
שימוש ב-DISTINCT ו-ORDER BY פוגעים בביצועים ומאטים את ביצוע הקוד. יש להשתמש בהם רק כאשר באמת צריך.
אין להחזיר נתונים שלא צריכים
כל שדה נוסף אותו אנו מחזירים מהשאילתה, דורש יותר זמן ביצוע. אין להשתמש בביטוי
SELECT * FROM tbl
אם אין אנו זקוקים באמת לכל השדות שהוא מחזיר.
IN vs BETWEEN
אם בידך הבחירה להשתמש בשאילתה באופרטור IN או ב-BETWEEN, תמיד עדיף לבחור ב-BETWEEN.
השאילתה הזו:
SELECT customer_number, customer_name FROM customer WHERE customer_number in (1000, 1001, 1002, 1003, 1004)
תרוץ הרבה פחות מהר מזו:
SELECT customer_number, customer_name FROM customer WHERE customer_number BETWEEN 1000 and 1004
משפטי UPDATE
תמיד רצוי להשתמש במשפט UPDATE אחד, גם כאשר רוצים לבצע כמה פעולות.
כלומר, במקום:
UPDATE Products SET UnitPrice = UnitPrice * 1.06 WHERE UnitPrice > 5 GO UPDATE Products SET UnitPrice = ROUND(UnitPrice, 2) WHERE UnitPrice > 5 GO
רצוי תמיד לכתוב:
UPDATE Products SET UnitPrice = ROUND(UnitPrice * 1.06, 2) WHERE UnitPrice > 5
קריאה לפונקציות
אל תקרא כרמה פעמים לאותה פונקציה עם אותם ערכים, בתוך קוד T-SQL. תמיד רצוי לקרוא פעם אחת, להכניס את התוצאה לתוך משתנה, ולהשתמש בו.
לדוגמא אם בתוך הקוד אנחנו צריכים להשתמש כמה פעמים בארוך של מחרוזת, נקרא רק פעם אחת לפונקציה LEN, ונציב את התוצאה במשתנה:
DECLARE @StrLen INT SET @StrLen = LEN(str)
מציאת רשומות תואמות
הרבה פעמים אנו נתקלים בצורך להשוות שתי טבלאות עם קשר בינהן, ולשלוף את כל הרשומות מטבלת האב שאין להן רשומות תואמות בטבלת הבן.
ישנן שלוש דרכים לעשות זאת:
--Using a NOT EXISTS SELECT a.IDfld FROM ParentTbl a WHERE NOT EXISTS (SELECT * FROM ChildTbl b WHERE a.IDfld = b.ParentIDfld) --Using a Left Join SELECT a.IDfld FROM ParentTbl a LEFT JOIN ChildTbl b ON a.IDfld = b.ParentIDfld WHERE b.ParentIDfld IS NULL --Using a NOT IN SELECT a.IDfld FROM ParentTbl a WHERE IDfld NOT IN (SELECT ParentIDfld FROM ChildTbl)
סדר יעילות הביצועים הוא מהעליון לתחתון, כלומר, שימוש ב-NOT EXISTS הוא היעלית יותר, ושימוש ב-IN – היעיל פחות.
ביצועים אלו יכולים להשתנות מעט בשל הגדרות אינדקסים ומספר הרשומות בטבלה. לכן, אם אתה לא בטוח, רצוי לבדוק את שלושת השיטות ולמצוא את היעילה ביותר למקרה הספציפי.
בדיקת קיום רשומה בטבלה
אם עלינו לוודא את קיום רשומה בטבלה, אין להשתמש במשפט
SELECT COUNT(*) FROM tbl WHERE...
אשר גוזל הרבה משאבים, אלא ב- EXISTS
החזרת ערכים מ-Stored Procedure
אם אנו רוצים לקבל מה-SP ערך אחד, ולא סט רשומות, רצוי להשתמש במשתני OUTPUT, ולא להחזיר את הערך באמצעות SELECT.
בהצלחה!
תגובות בפייסבוק