וובמאסטר - תיכנות ובניית אתרים

15 טיפים וטריקים לעבודה מול SQL Server

entry/‏ 16 ספטמבר, 2002
F+
F-

ציון שם בעל האובייקט

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 Files\Microsoft SQL Server\MSSQL\Binn\sqlservr.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. בהצלחה!

entry

סטודיו לבניית אתרים שהוקם בינואר 2005
תגיות: SQL‏  /  שאילתה‏  /  יעילות‏  /  SQL Server‏  /  MSSQL‏  /  EXISTS‏  /  COUNT‏  /  SP‏  /  Stored Procedure‏  /  שאילתות‏  /  EXISTS‏  /  SELECT‏  /  שליפה‏  

תגובות בפייסבוק

תגובות למאמר



תגיות פופולאריות

X
הצטרף לעמוד שלנו בפייסבוק להישאר מעודכן!
וובמאסטר © כל הזכויות שמורות