كيفية الاستعلام مجموعة من البيانات في DB2 مع أعلى مستوى من الأداء؟

StackOverflow https://stackoverflow.com/questions/265850

  •  06-07-2019
  •  | 
  •  

سؤال

وعادة، وأنا بحاجة إلى استرداد البيانات من جدول في بعض النطاق؛ على سبيل المثال، صفحة منفصلة لكل نتيجة البحث. في الخلية يمكنني استخدام LIMIT الكلمة ولكن في DB2 أنا لا أعرف. الآن أنا استخدم هذا الاستعلام لاسترداد مجموعة من البيانات.

SELECT * 
FROM(
   SELECT  
      SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO
      , DATA_KEY_VALUE
      , SHOW_PRIORITY
   FROM 
      EMPLOYEE
   WHERE 
      NAME LIKE 'DEL%'
   ORDER BY
      NAME DESC
   FETCH FIRST 20 ROWS ONLY
) AS TMP
ORDER BY 
  TMP.RUNNING_NO ASC
FETCH FIRST 10 ROWS ONLY

ولكن أنا أعلم أنه أسلوب سيئة. لذا، وكيفية الاستعلام عن أعلى مستوى من الأداء؟

هل كانت مفيدة؟

المحلول

تم إضافة

وبلدي شرط في DB2 9.7.2 بالفعل.

وDB2 9.7.2 يضيف جملة جديد لنتيجة الحد الاستعلام كما يوضح أدناه:

SELECT * FROM TABLE LIMIT 5 OFFSET 20

وقاعدة بيانات سيتم استرداد نتيجة من الصف لا. 21-25

نصائح أخرى

ولا يدري لماذا كنت تقوم بإنشاء الجدول TMP. لا RUNNING_NO aready في تسلسل تصاعدي؟ أعتقد أن:

SELECT SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO,
       DATA_KEY_VALUE,
       SHOW_PRIORITY
  FROM EMPLOYEE
 WHERE NAME LIKE 'DEL%'
 ORDER BY NAME DESC
 FETCH FIRST 10 ROWS ONLY

ومن شأنه أن يعطي نفس النتائج.

وبعد ان INDEX على اسم على الطاولة موظف سيعزز أداء هذا الاستعلام.

ومن الصعب جدا، هو يعتمد قاعدة البيانات التي لديك.

وعلى سبيل المثال:

SELECT * FROM ( 
    SELECT 
      ROW_NUMBER() OVER (ORDER BY ID_USER ASC) AS ROWNUM,  
      ID_EMPLOYEE, FIRSTNAME, LASTNAME 
    FROM EMPLOYEE 
    WHERE FIRSTNAME LIKE 'DEL%' 
  )  AS A WHERE A.rownum
BETWEEN 1 AND 25
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top