1. Background In some RDBMS such as MySQL, to select a limited number of 'records', you can use an internal function' LIMIT () ', but this function is a kind of internal Trigger the RDBMS. The Trigger adds a column to each table that you create, this column will be numbered in order to be able to make some sort. This solution is a choice that very few RDBMS put in place. 1.1. Working Environment For examples of this article, we will use the table 'EMPLOYEE', provided with the basis SAMPLE DB2. See code 2. First Fetch n Rows Only 2.1. Query base Typically in DB2, to make a 'SELECT', we would like this SELECT * FROM GG.EMPLOYEE Or SELECT EMPL.FIRSTNME, EMPL.LASTNAME AS FROM GG.EMPLOYEE EMPL This will return the whole of the table. 2.2. Select 10 lines To recover the first 10 lines of your application, you must use the SQL Fetch First n Rows Only SELECT EMPL.EMPNO, EMPL.FIRSTNME, EMPL.LASTNAME AS FROM GG.EMPLOYEE EMPL BY ORDER EMPL.EMPNO FETCH FIRST 10 ROWS ONLY To recover the last 10 lines, we must add an ORDER BY DESC SELECT EMPL.EMPNO, EMPL.FIRSTNME, EMPL.LASTNAME AS FROM GG.EMPLOYEE EMPL BY ORDER EMPL.EMPNO DESC FETCH FIRST 10 ROWS ONLY 3. Select a beach lines Here, in order to select a range of lines, for example between 12 and 18 frontlines, it is necessary to call a SQL command, which will add a column to your query. 3.1. OVER ROW_NUMBER () The function OVER ROW_NUMBER (), will allow us to make this work. SELECT ROW_NUMBER () OVER (ORDER BY EMPL.EMPNO) AS NUM, EMPL.EMPNO, EMPL.FIRSTNME, EMPL.LASTNAME AS FROM GG.EMPLOYEE EMPL Specifically here, we added a column NUM, which is a 'integer', starting from 1 to N. To use this column, we need to encapsulate this request, in order to make treatment. WITH TABLETMP (NUM, EMPNO, FIRST, NOM) AS ( SELECT ROW_NUMBER () OVER (ORDER BY EMPL.EMPNO) AS NUM, EMPL.EMPNO, EMPL.FIRSTNME, EMPL.LASTNAME AS FROM GG.EMPLOYEE EMPL ) SELECT * FROM TABLETMP WHERE NUM BETWEEN 12 AND 18 We have just returned from 7 lines of the line 12 to line 18. The clause in OVER BY ORDER (), we guarantee the order of information. To get the lines from the end, it launches a ORDER BY ........ DESC. WITH TABLETMP (NUM, EMPNO, FIRST, NOM) AS ( SELECT ROW_NUMBER () OVER (ORDER BY EMPL.EMPNO DESC) AS NUM, EMPL.EMPNO, EMPL.FIRSTNME, EMPL.LASTNAME AS FROM GG.EMPLOYEE EMPL ) SELECT * FROM TABLETMP WHERE NUM BETWEEN 12 AND 18 4. Let us go further ........ We might need to repeat this kind of select in a draft could then make a stored procedure, instead of your programming language. CREATE PROCEDURE "GG". "PROCEDURE1" (IN VMIN INT, IN VMAX INTEGER) DYNAMIC RESULT SETS 1 LANGUAGE SQL BEGIN Rs DECLARE CURSOR WITH RETURN FOR AS WITH TABLETMP ( SELECT ROW_NUMBER () OVER (ORDER BY EMPL.EMPNO) AS NUM, EMPL.FIRSTNME, EMPL.LASTNAME AS FROM GG.EMPLOYEE EMPL ) SELECT * FROM TABLETMP WHERE AND NUM BETWEEN VMIN VMAX OPEN rs; END @ Then we call the procedure in passing two parameters, leaving the beach and the end. CALL GG.PROCEDURE1 (10.12) 4.1. The total And here is a stored procedure, which takes over as setting the table for research and the field that make the ORDER BY. CREATE PROCEDURE "GG". "Procedural" (IN VTABLE VARCHAR (255), IN VORDERBY VARCHAR (255), IN VMIN INT, IN VMAX INTEGER ) DYNAMIC RESULT SETS 1 LANGUAGE SQL BEGIN DECLARE STMT_STRING VARCHAR (500); RC DECLARE CURSOR WITH RETURN FOR STMT_NAME; SET STMT_STRING = ' AS WITH TABLETMP ( SELECT '| | VTABLE ||'.*, ROW_NUMBER () OVER (ORDER BY' | | VORDERBY | | ') AS NUM FROM '| | VTABLE | |' ) SELECT * FROM TABLETMP WHERE NUM BETWEEN '| | CHAR (VMIN) | |' AND '| | CHAR (VMAX) | |''; PREPARE STMT_NAME FROM STMT_STRING; OPEN RC; END @
In this procedure, we go 4 arguments in the CALL. String: The name of the table String: The name of the field Integer: The departure of research Integer: The End of research CALL GG.PROCEDURE ( 'GG.EMPLOYEE', 'EMPNO', 15.24) 4.2. Let's be crazy It could further support this procedure and add an array of 'CHAMP' to select, but I think we would have so easy in this case, write the request for SQL. 5. Perfomances In this type of complaint, the problem arises in performance as a 'Limit', is relatively heavy in terms of resources. Obviously, if we have 150 records, it will go very quickly, if we 1,500,000, is something else. 5.1. Cause In seeking to improve the speed and following a few Explain, one of the reasons is the Order By ROW_NUMBER () OVER (ORDER BY EMPL.EMPNO DESC) We could not save Order By clause, but then in this case, we can not guarantee order data between two applications. One solution that I advocate, and that when analysing the needs of the db, it identifies the tables that we will need to make a 'Limit', and to add a numeric field auto incremented. In order by the effect will be much faster on a numeric field on a field containing characters for example. 5.2. Other tracks Another solution is to have a system of persistence, as java for example, and therefore use Cursor Scrollable, you find a pdf you explain very clearly the process Conclusion The objective of this article was to answer a question that comes up at my workplace is the result of some of the research that I conducted on the Net. There may be other ways of doing things, including measures to improve the speed of execution (via the index for example). This requires deepening since there is a request, in my all-around event. :) 6. Acknowledgments Thanks to Jab, for his advice and tracks:). Grand thank you also to Emmanuelle, and she knows why:) Annex Table 'EMPLOYEE' CREATE TABLE GG.EMPLOYEE ( EMPNO CHARACTER (6) NOT NULL, FIRSTNME VARCHAR (12) NOT NULL, MIDINIT CHARACTER (1) NOT NULL, LASTNAME VARCHAR (15) NOT NULL, WORKDEPT CHARACTER (3), PHONENO CHARACTER (4), HIREDATE DATE JOB CHARACTER (8), EDLEVEL SMALLINT NOT NULL, SEX CHARACTER (1), BIRTHDATE DATE SALARY DECIMAL (9.2), BONUS DECIMAL (9.2), COMM DECIMAL (9.2) ) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000010 ',' CHRISTINE ',' I ',' HAAS ',' A00 ','3978','1965-01-01 ',' PRES ', 18,' F ','1933-08-24 ', 52750.00, 1000.00, 4220.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000020 ',' MICHAEL ',' L ',' THOMPSON ',' B01 ','3476','1973-10-10 ',' MANAGER ', 18,' M ','1948-02-02 ', 41250.00, 800.00, 3300.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000030 ',' SALLY ',' A ',' KWAN ',' C01 ','4738','1975-04-05 ',' MANAGER ', 20,' F ','1941-05-11 ', 38250.00, 800.00, 3060.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000050 ',' JOHN ',' B ',' GEYER ',' E01 ','6789','1949-08-17 ',' MANAGER ', 16,' M ','1925-09-15 ', 40175.00, 800.00, 3214.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000060 ',' IRVING ',' F ',' STERN ',' D11 ','6423','1973-09-14 ',' MANAGER ', 16,' M ','1945-07-07 ', 32250.00, 500.00, 2580.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000070 ',' EVA ',' D ',' PULASKI ',' D21 ','7831','1980-09-30 ',' MANAGER ', 16,' F ','1953-05-26 ', 36170.00, 700.00, 2893.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000090 ',' EILEEN ',' W ',' HENDERSON ',' E11 ','5498','1970-08-15 ',' MANAGER ', 16,' F ','1941-05-15 ', 29750.00, 600.00, 2380.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000100 ',' THEODORE ',' Q ',' SPENSER ',' E21 ','0972','1980-06-19 ',' MANAGER ', 14,' M ','1956-12-18 ', 26150.00, 500.00, 2092.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000110 ',' VINCENZO ',' G ',' LUCCHESSI ',' A00 ','3490','1958-05-16 ',' SALESREP ', 19,' M ','1929-11-05 ', 46500.00, 900.00, 3720.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000120 ',' SEAN ',' ',' O''CONNELL ',' A00 ','2167','1963-12-05 ',' CLERK ', 14,' M ','1942-10 -18 ', 29250.00, 600.00, 2340.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000130 ',' DOLORES ',' M ',' QUINTANA ',' C01 ','4578','1971-07-28 ',' ANALYST ', 16,' F ','1925-09-15 ', 23800.00, 500.00, 1904.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000140 ',' HEATHER ',' A ',' NICHOLLS ',' C01 ','1793','1976-12-15 ',' ANALYST ', 18,' F ','1946-01-19 ', 28420.00, 600.00, 2274.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000150 ',' BRUCE ',' ',' ADAMSON ',' D11 ','4510','1972-02-12 ',' DESIGNER ', 16,' M ','1947-05-17' , 25280.00, 500.00, 2022.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000160 ',' ELIZABETH ',' R ',' PIANKA ',' D11 ','3782','1977-10-11 ',' DESIGNER ', 17,' F ','1955-04-12 ', 22250.00, 400.00, 1780.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000170 ',' MASATOSHI ',' J ',' YOSHIMURA ',' D11 ','2890','1978-09-15 ',' DESIGNER ', 16,' M ','1951-01-05 ', 24680.00, 500.00, 1974.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000180 ',' MARILYN ',' S ',' SCOUTTEN ',' D11 ','1682','1973-07-07 ',' DESIGNER ', 17,' F ','1949-02-21 ', 21340.00, 500.00, 1707.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000190 ',' JAMES ',' H ',' WALKER ',' D11 ','2986','1974-07-26 ',' DESIGNER ', 16,' M ','1952-06-25 ', 20450.00, 400.00, 1636.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000200 ',' DAVID ',' ',' BROWN ',' D11 ','4501','1966-03-03 ',' DESIGNER ', 16,' M ','1941-05-29' , 27740.00, 600.00, 2217.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000210 ',' William ',' T ',' JONES ',' D11 ','0942','1979-04-11 ',' DESIGNER ', 17,' M ','1953-02-23 ', 18270.00, 400.00, 1462.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000220 ',' JENNIFER ',' K ',' LUTZ ',' D11 ','0672','1968-08-29 ',' DESIGNER ', 18,' F ','1948-03-19 ', 29840.00, 600.00, 2387.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000230 ',' JAMES ',' J ',' JEFFERSON ',' D21 ','2094','1966-11-21 ',' CLERK ', 14,' M ','1935-05-30 ', 22180.00, 400.00, 1774.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000240 ',' SALVATORE ',' M ',' MARINO ',' D21 ','3780','1979-12-05 ',' CLERK ', 17,' M ','1954-03-31 ', 28760.00, 600.00, 2301.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000250 ',' DANIEL ',' S ',' SMITH ',' D21 ','0961','1969-10-30 ',' CLERK ', 15,' M ','1939-11-12 ', 19180.00, 400.00, 1534.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000260 ',' SYBIL ',' P ',' JOHNSON ',' D21 ','8953','1975-09-11 ',' CLERK ', 16,' F ','1936-10-05 ', 17250.00, 300.00, 1380.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000270 ',' MARIA ',' L ',' PEREZ ',' D21 ','9001','1980-09-30 ',' CLERK ', 15,' F ','1953-05-26 ', 27380.00, 500.00, 2190.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000280 ',' ETHEL ',' R ',' SCHNEIDER ',' E11 ','8997','1967-03-24 ',' OPERATOR ', 17,' F ','1936-03-28 ', 26250.00, 500.00, 2100.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000290 ',' JOHN ',' R ',' PARKER ',' E11 ','4502','1980-05-30 ',' OPERATOR ', 12,' M ','1946-07-09 ', 15340.00, 300.00, 1227.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000300 ',' PHILIP ',' X ',' SMITH ',' E11 ','2095','1972-06-19 ',' OPERATOR ', 14,' M ','1936-10-27 ', 17750.00, 400.00, 1420.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000310 ',' MAUDE ',' F ',' SETRIGHT ',' E11 ','3332','1964-09-12 ',' OPERATOR ', 12,' F ','1931-04-21 ', 15900.00, 300.00, 1272.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000320 ',' RAMLAL ',' V ',' MEHTA ',' E21 ','9990','1965-07-07 ',' FIELDREP ', 16,' M ','1932-08-11 ', 19950.00, 400.00, 1596.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000330 ',' WING ',' ',' LEE ',' E21 ','2103','1976-02-23 ',' FIELDREP ', 14,' M ','1941-07-18' , 25370.00, 500.00, 2030.00) / INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) VALUES ('000340 ',' JASON ',' R ',' GOUNOT ',' E21 ','5698','1947-05-05 ',' FIELDREP ', 16,' M ','1926-05-17 ', 23840.00, 500.00, 1907.00) /
|