كيفية الاستعلام مجموعة من البيانات في DB2 مع أعلى مستوى من الأداء؟
-
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