עבור לתוכן
Magic DevHub
yftach_carmi

הבאת רשומה אחת בלבד ב SQL

Recommended Posts

שלום רב,
יש לי תוכנית שעובדת על טבלה (נניח 10,000 רשומות) שכל רשומה בטבלה מייצגת סטודנט.
בתוכנית זו ישנו קישור עבור כל סטודנט לטבלת הציונים, כאשר אני מבצע את הקישור כדי לדעת האם יש לסטודנט איזה רישום עם ציונים או אין, כמובן הקישור עם שדה לוגי המחזיר אם יש קישור או אין קישור, ממש לא מעניין אותי לדעת כמה רשומות יש וכדומה, זהו קישור קריאה פשוט.

סה"כ תוכנית מאוד פשוטה.

אבל : לסטודנט שיש רשומות של קורסים ישנן הרבה רשומות (לפעמים מאות) וכמובן בגלל שהקישור עם מפתח אז המגי'ק מבקש (ומקבל) מה SQL עבור כל סטודנט טבלה גדולה. בגלל זה המערכת עובדת מאוד לאט יחסית לאותה תוכנית בביטריב.

שיפורים אפשריים בתוכנית שחשבתי עליהם :
א. לבטל את המפתח בקישור - אבל אז אני בבעיה עם לקוחות ביטריב (כן אני עובד עם CTL גם וגם)
ב. לבקש מה SQL שיחזיר TOP1 , כלומר רשומה אחת בלבד, כפי שקישור קריאה אמור לבצע - אבל אני לא יודע איך, ועוד יותר גרוע אני לא מבין למה המג'יק מלכתחילה לא מבקש רשומה אחת בלבד בקישור קריאה.
ג. ליצור VIEW ובעצם לא לבצע את הקישורים במג'יק, שוב אותה בעיה כמו א' - מאבד את תמיכת גם וגם. ויותר גרוע, אני מתחיל להתפזר במערכת.

האם ישנו פתרון מהיר ופשוט ?


בברכת שבוע טוב
יפתח

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים

  • <li>ב SQL ישנה פקודה Select Distinct המאפשרת להביא רק רשומה אחת. <li>בהתאם להמלצה ביום עיון האחרון כדאי ליצור View. <li>נראה לי שאם אתה רוצה שיפור ביצועים לא תהייה לך ברירה אלה להפריד בן משתמשי SQL ו Btrieve.

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים

בני שלום :

1. בשביל SELECT DISTINCT אני בעצם צריך לוותר על קישור קריאה ובמקומו לרשום שאילתת SQL

2. בשביל VIEW אני כמובן צריך לבטל על כל הקישורים ולכתוב VIEW וליצור טבלה בהתאמה במג'יק.

3. הפרדת משתמשים זה כאב ראש לא פשוט.

קיוותי שמישהו יאמר לי שאפשר לשנות משהו בקישור קריאה כך שיביא רשומה ראשונה בלבד (כגון TOP1 או distinct ) וכמו שיש קישור left outer join שלא מזיק לביטריב אבל משפר ביצועים משמעותית ב SQL ...

בברכת יום נפלא

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים
:'( צר לי אבל כמאמר הפיתגם "אפילו הצרפתיה היפה ביותר אינה יכולה לתת יותר מאשר יש לה...".
השיקול שלך בן כאב ראש לא פשוט לך כמפתח לשיפור ביצועים למשתמשים.
דרך אגב אני משתמש לבדיקות בשיטה של הוספת שדה לוגי לפני סיים קישור הצבת בחיפוש מ ועד TRUE'LOG' ובהצב נוסחה הבודקת מציאת רשומה בקישור (כמובן מול הרשומה הראשית). לדעתי זה עובד די מהר ואצלי לא ראיתי פגיעה בביצועים.

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים

תודה רבה,

מקווה שאנשי מג'יק קראו והם ישפרו את המושג "קישור קריאה" כך שבעצם זה יעבוד מהר ונכון - כלומר יחזיר רשומה אחת ממסד הנתונים.

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים
  1. <li>לא הגבת על שיטת הבדיקה שלי.<li>למען האמת לא ידעתי שכאשר ה DataBase הוא SQL הקישור מביא יותר מרשומה אחת. האם זה רק ב MS-SQL או גם באורקל בו יש לי יותר ניסיון.

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים

יפתח שלום

ראשית לא אמרת איזו גרסה זו

אתה יכול להגדיר במילון טבלאות בתכונות הטבלה מספר רשומות לשליפה (שחק אם זה תראה אם זה משפר לך ביצועים)
כ"כ אתה יכול להגדיר במידע לבסיס הנתונים או בHint שיחזיר לך את הרשומה הראשונה בלבד.

אם זה 9 ומעלה אתה יכול לעשות תנאי על הקישור אחד לקובץ בביטריב ואחד ב VIEW ב SQL ועדיין יש לך גרסה אחת.

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים

שלום רב,

א. לצערי לא הבנתי את הפתרון המוצע שלך

ב. אני לא יודע מה הוא עושה באורקל, הבדיקות שלי הינן מול MSSQL 2005 כמובן מג'יק 9.4 SP7C

ג. פקודת distinct ממש לא מתאימה, אומנם מסד הנתונים יחזיר רשומה אחת, אך לפני כן יחפש הכל וימיין הכל !

ד. פקודת TOP עושה את העבודה

הכנתי שני צילומי מסכים, הראשון מה המג'יק מבצע

השני הינו מה הבדיקות הנוספות שניסיתי (השני הינו בהודעה הבאה).

מכאן המצב הדרדר :

א. יצרתי VIEW לטבלא.

ב. הגדרתי ב VIEW TOP כמו שהחלטתי

ג. הגדרתי את ה VIEW במג'יק.

ד. ביצעתי את הקישור קריאה ל VIEW - לא החזיר ערך :(

בדקתי את פקודת ה SQL שמג'יק העביר ל VIEW, הפקודה  נכונה, כנראה פספסתי משהו ואני כבר די מיואש.

untitled.JPG.36252f6c08e69d760fd7cd1ac81

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים

והתמונה הנוספת איזה פקודות בדקתי

אם תסתכלו מקרוב כתוב שם מה "עלות הפעולה" במסד הנתונים, עלות של TOP הינה אלפית במקרה שלי.

untitled3.JPG.7871a1ac39e85bc8dd9eea077c

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים

יפתח שלום,

קודם כל בעייה מעניינת..

יכול להיות שהבעיה שלך עם ה TOP היא כתוצאה מזה שמגיק מבצע קודם את ה VIEW ואז התוצאה היא רשומה אחת, ואח"כ מבצע WHERE מהתוכנית שלך ולא מוצא את הרשומה (כי היא ירדה ב TOP ).

עם זאת זה הכוון הנכון או לחלופין הפתרון יכול להיות ב LEFT OUTER JOIN , ואז זה יבוצע בבסיס הנתונים, אך תצטרך להגדיר ערכי חיפוש לכל שדות המפתח (תוכל לשים ערכי מקס ומיני ).

רק רעיון, תצטרך לבדוק..

בהצלחה

חיים

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים

לגבי ה VIEW - ייתכן שאתה צודק, אני פשוט לא מספיק חזק ב SQL להבין מה שלבי ההתרחשות ב VIEW.

לגבי שימוש ב Left Outer Join - ניסיתי, אני פשוט לא מצליח לשכנע את המג'יק לתחם:

כאשר מגדים תכונה זו חובה לשים אותה נוסחה ב - "מ" וב "עד" וכמובן לפי מפתח חד-ערכי.

הואיל ואני לא יודע איזו רשומה אני רוצה ניסיתי לרמות את המג'יק ולשים cndrange - זה לא עזר.

אני כל הזמן מקבל את ההודעה :

"משתני חיפוש בשדות קישור איחוד, חייבים להיות קבועים או שדות"

וכמובן ההודעה החביבה :

"לכל מקטעי מפתח של קישור איחוד חייב להיות ערך בנוסחאות חיפוש"

בקיצור, ביצועים ירודים בקישור שבפרביסיב הוא בסיסי ביותר, להלן קישור קריאה הזכור לטוב.

וזה עוד בלי להזכיר צרה אחרת שיש לי - מכירים קישור בסדר יורד למצוא רשומה אחרונה בשביל מונים ?, בפרביסיב זה היה הולך לפי מפתח ומביא באמת רשומה אחרונה באלפית שניה, ב SQL זה לכל התחום ועוד ממיין... בקיצור זוועת עולם.

בשלב זה החלטתי לבדוק את מג'יק 10 SP2 (אולי זה יהיה הגורם לעבור) - תוצאות הבדיקה :

א. המג'יק עדיין מבקש ומקבל המון רשומות מה SQL.

ב. המצב רק התדרדר, מג'יק "עטפו" כל שאילתא בפקודה : exec sp_executesql , אולי זה משפר אבטחת מידע או משהו, אבל זה גורם ל execut plen לא להציג שלבים :(

בברכת יום נפלא וחג שמח

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים

יפתח שלום.

נראה לי כי הפתרון האופטימלי במקרה דנן הוא שימוש ב- User Defined Function ברמת ה- SQL.

1.   ב-DB ב-SQL עליך להוסיף UDF חדש, אשר מקבל כפרמטר את מזהה התלמיד, ומחזיר ערך מסוג BIT בהתאם. כמובן שב- UDF עליך לבצע שאילתא אופטימלית (כדוגמת SELECT TOP 1 שהזכרת).

2.   בטבלת תלמידים עצמה ב-SQL עליך להוסיף עמודה חדשה מסוג BIT, אשר תהווה מה שקרוי Computed Column, ובהגדרת ה-Formula שלה עליך להגדיר קריאה ל- UDF שהגדרת בסעיף 1.

באופן זה כבר ברמת ה- SQL, ובמקביל במג'יק, בעת עיון פשוט בטבלה אתה מקבל אינדיקציה מיידית על קיום/אי קיום ציונים.

3. ברמת המג'יק השדה מוגדר באופן רגיל, אולם בעבודה עם BTRIEVE אין מנוס מלדאוג אפליקטיבית לעדכון השדה החדש בערך הנכון מבעוד מועד. כמובן שבמוד SQL יש <U>להימנע אפליקטיבית מעדכון השדה, כדי לא לקבל הודעת שגיאה על נסיון לעדכן שדה מחושב.

לאחרונה מימשתי פתרון לבעיה דומה וזה עובד מצויין ומהר מאד, אם כי במקרה שלי נמנע ממני הצורך לטפל באפיק הBTRIEVE במקביל.

צירפתי דוגמה היפוטתית ל-UDF שכזה.
לאחר יצירתו,ב-SQL יש להגדיר בטבלת תלמידים , בתכונות העמודה החדשה (שתיקרא לדוגמא: YESH_TSIUN) ובתכונה FORMULA
את המלל הבא:
((dbo.FN_CHECK_TSIUN.(ID_TALMID)
ה- SQL מפעיל עבור כל רשומה ב-DATASET את הפונקציה וממלא את העמודה בערך מחושב מתאים.

למקרה של שיבוש במיקום הסימנים בהודעה - תסתכל בתיעוד SQL לגבי הפורמט המדויק לקריאה ל-UDF.

ברמה ה"פילוסופית" - הבעיה היחידה שמצאתי בפתרון היא בכך שבהדרגה יש "זליגה" של לוגיקה וקוד מתוך ה- מג'יק ל-DB, על כל המשתמע מכך, אבל נראה כי אין מכך מנוס גם בתחומים אחרים בהם מג'יק מתממשק מול כלים אחרים.

אשמח לקבל תגובה אם הצלחת לממש ומה דעתך על הפתרון, מאחר וגם אצלי מדובר בפתרון שרק לאחרונה מימשתי, ואני עדיין מתלבט אם זהו פתרון ראוי.

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים

:o אולי את חלק מההצעות כבר ביצעת אז אני מתנצל מראש.

  1. <li>ליצור את ה View עם Select Distinct ואז מקבלים מראש טבלה עם רשומה אחת לכל סטודנט. אינני בטוח אבל נדמה לי שה View אינו נוצר בכל ריצה מחדש אלה בבסיס הנתונים ולכן הוא טבלה לכל דבר.<li>אולי כדאי לשנות גישה בכלל ולהחזיק טבלה ובה רשומה לכל סטודנט שמציינת אך ורק האם משתתף בקורס  ואז הבדיקה תהייה מול הטבלה הנ"ל ותהייה פשוטה ומהירה. שתי שדות סה"כ מס. סטודנט ומס. קורס שמהויים גם את המפתח.<li>לגבי שיטת החיפוש שלי היא עובדת מצויין ולמדתי אותה מגורו'ס של מג'יק ברשימת המשתמשים העולמית של מג'יק אבל לא ניסיתי אותה על טבלאות גדולות באמת. אני משתמש בה הרבה לביצוע חיתוכים לא רציפים בדו"חות. במידה ותרצה אשמח להבסבירה בפרוט שנית.

שתף אשכול


קישור ישיר להודעה
שתף באתרים אחרים

התחבר או הרשם על מנת להגיב.

עליך להיות משתמש רשום על מנת להגיב

צור חשבון

צור חשבון חדש בקהילה בקלי קלות.

רישום חשבון חדש

התחבר

משתמש קיים? התחבר.

התחבר עכשיו

×