Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DROP TABLE child purge
  2. ;
  3. DROP TABLE mother purge
  4. ;
  5. DROP SEQUENCE sqMother
  6. ;
  7. DROP SEQUENCE sqChild
  8. ;
  9.  
  10. CREATE TABLE mother
  11. (
  12.    ID    NUMBER(10,0)
  13.          NOT NULL
  14.          CONSTRAINT coPKMother
  15.          PRIMARY KEY
  16.          
  17.  , name  VARCHAR2(2000)
  18.          NOT NULL
  19.          
  20.  , gender CHAR(01)
  21.           NOT NULL
  22.           CONSTRAINT coCHMotherGender
  23.           CHECK (gender IN ('F'))
  24.          
  25.  , dateOfBirth  DATE
  26.                 NOT NULL
  27.                
  28.  , meaninglessData CHAR(100)
  29. )
  30. ;
  31. CREATE TABLE child
  32. (
  33.    ID    NUMBER(10,0)
  34.          NOT NULL
  35.          CONSTRAINT coPKChild
  36.            PRIMARY KEY
  37.            
  38.  , motherID NUMBER(10,0)
  39.             NOT NULL
  40.             CONSTRAINT coFKChildMother
  41.               references mother
  42.              
  43.  , name     VARCHAR(2000)
  44.             NOT NULL
  45.            
  46.  , gender   CHAR(01)
  47.             NOT NULL
  48.             CONSTRAINT coCHChildGender
  49.               CHECK  (gender IN ('M','F'))
  50.              
  51.  , dateOfBirth DATE
  52.                NOT NULL
  53.                
  54.  , meaninglessData CHAR(100)
  55.                    NOT NULL
  56. )
  57. ;
  58. CREATE SEQUENCE sqMother
  59.   START WITH 1
  60.   INCREMENT BY 1
  61.   noMaxValue
  62.   cache 100
  63.   ;
  64.   CREATE SEQUENCE sqChild
  65.   START WITH 1
  66.   INCREMENT BY 1
  67.   noMaxValue
  68.   cache 100
  69.  
  70. /
  71. DECLARE
  72.  
  73.   noOfMothers  CONSTANT int := 5000;
  74.   noChildrenPerMother CONSTANT int := 5;
  75.  
  76. BEGIN
  77.  
  78.   EXECUTE IMMEDIATE 'truncate table child';
  79.   EXECUTE IMMEDIATE 'truncate table mother';
  80.   FOR m IN 1..noOfMothers LOOP
  81.  
  82.      INSERT INTO mother (id,name,gender,dateOfBirth,meaninglessData)
  83.      VALUES (    sqMother.NEXTVAL
  84.               , 'Mother ' || TO_CHAR(sqMother.CURRVAL)
  85.               , 'F'
  86.               , SYSDATE
  87.               , 'x'
  88.               );
  89.  
  90.      FOR c IN 1..noChildrenPerMother LOOP
  91.        INSERT INTO child (id, motherID, name, gender, dateOfBirth, meaninglessData)
  92.         VALUES (
  93.                    sqChild.NEXTVAL
  94.                 ,  sqMother.CURRVAL
  95.                 ,  'Child number ' || TO_CHAR(c) || ' of mother ' || TO_CHAR(sqMother.CURRVAL)
  96.                 ,  'F'
  97.                 ,  SYSDATE
  98.                 , 'x'
  99.                );
  100.      END LOOP;
  101.    
  102.   END LOOP;
  103.   COMMIT;
  104. END;
  105.  
  106. ----------------------
  107.  
  108. SELECT TABLE_NAME, COLUMN_NAME
  109. FROM DBA_TAB_COLS
  110. WHERE OWNER = 'SYS'
  111. AND TABLE_NAME LIKE 'DBA%'
  112. AND COLUMN_NAME LIKE '%BLOCKS%';
  113.  
  114. -----------------------
  115.  
  116. -- 1.1
  117. SELECT TABLESPACE_NAME FROM ALL_ALL_TABLES WHERE TABLE_NAME = 'MOTHER';
  118.  
  119. -- 1.2 65536, 1048576
  120. SELECT INITIAL_EXTENT, NEXT_EXTENT FROM ALL_TABLES WHERE TABLE_NAME = 'MOTHER';
  121.  
  122. -- 1.3 - 10
  123. SELECT PCT_FREE FROM ALL_TABLES WHERE TABLE_NAME = 'MOTHER';
  124.  
  125. -- 1.4 - USERS01.DBF
  126. SELECT DBA_DATA_FILES.FILE_NAME FROM DBA_DATA_FILES
  127. INNER JOIN ALL_TABLES ON (DBA_DATA_FILES.TABLESPACE_NAME = ALL_TABLES.TABLESPACE_NAME)
  128. WHERE ALL_TABLES.TABLE_NAME = 'MOTHER';
  129.  
  130. -- 1.5 - 8192
  131. SELECT DBA_TABLESPACES.BLOCK_SIZE FROM ALL_TABLES
  132. INNER JOIN DBA_TABLESPACES ON (ALL_TABLES.TABLESPACE_NAME = DBA_TABLESPACES.TABLESPACE_NAME)
  133. WHERE ALL_TABLES.TABLE_NAME = 'MOTHER';
  134.  
  135. -- 2 ---- 95 blocks
  136. EXECUTE DBMS_STATS.GATHER_TABLE_STATS ('mircea','MOTHER');
  137. ALTER SYSTEM FLUSH SHARED_POOL;
  138.  
  139. SELECT BLOCKS FROM ALL_TABLES WHERE TABLE_NAME = 'MOTHER';
  140.  
  141. -- 3.1 95
  142. SELECT COUNT(DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)) FROM MOTHER;
  143.  
  144. -- 3.2 91
  145. SELECT AVG(COUNT(DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))) FROM MOTHER
  146. GROUP BY DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID);
  147.  
  148. -- 3.3 empty blocks between 135 and 192
  149. SELECT DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
  150. FROM MOTHER
  151. ORDER BY DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID);
  152.  
  153. -- 4
  154. EXPLAIN PLAN FOR SELECT * FROM MOTHER;
  155.  
  156. SELECT * FROM TABLE(dbms_xplan.display(NULL,NULL,'basic'));
  157.  
  158. SELECT SUM(V$SESSTAT.VALUE) AS "Total value"
  159. FROM V$STATNAME INNER JOIN V$SESSTAT
  160. ON (V$STATNAME.STATISTIC# = V$SESSTAT.STATISTIC#)
  161. WHERE V$SESSTAT.SID = SYS_CONTEXT('userenv', 'sid')
  162. AND V$STATNAME.NAME = 'consistent gets';
  163.  
  164. -- 12877, 12898, 12919 => 21
  165.  
  166. -- 5
  167. SELECT ID, NAME, GENDER, DATEOFBIRTH, MEANINGLESSDATA
  168. FROM MOTHER WHERE ID = '1' OR ID = '1250' OR ID = '2500' OR ID = '3750' OR ID = '5000';
  169.  
  170. EXPLAIN PLAN FOR SELECT ID, NAME, GENDER, DATEOFBIRTH, MEANINGLESSDATA
  171. FROM MOTHER WHERE ID = '1' OR ID = '1250' OR ID = '2500' OR ID = '3750' OR ID = '5000';
  172.  
  173. SELECT * FROM TABLE(dbms_xplan.display(NULL,NULL,'basic'));
  174.  
  175. -- 6
  176. DROP TABLE child purge
  177. ;
  178. DROP TABLE mother purge
  179. ;
  180. DROP SEQUENCE sqMother
  181. ;
  182. DROP SEQUENCE sqChild
  183. ;
  184.  
  185. CREATE TABLE mother
  186. (
  187.    ID    NUMBER(10,0)
  188.          NOT NULL
  189.          CONSTRAINT coPKMother
  190.          PRIMARY KEY
  191.          
  192.  , name  VARCHAR2(2000)
  193.          NOT NULL
  194.          
  195.  , gender CHAR(01)
  196.           NOT NULL
  197.           CONSTRAINT coCHMotherGender
  198.           CHECK (gender IN ('F'))
  199.          
  200.  , dateOfBirth  DATE
  201.                 NOT NULL
  202.                
  203.  , meaninglessData CHAR(100)
  204. )
  205. PCTFREE 0
  206. ;
  207.  
  208. CREATE SEQUENCE sqMother
  209.   START WITH 1
  210.   INCREMENT BY 1
  211.   noMaxValue
  212.   cache 100
  213.   ;
  214.  
  215. /
  216. DECLARE
  217.  
  218.   noOfMothers  CONSTANT int := 5000;
  219.  
  220. BEGIN
  221.  
  222.   EXECUTE IMMEDIATE 'truncate table mother';
  223.   FOR m IN 1..noOfMothers LOOP
  224.  
  225.      INSERT INTO mother (id,name,gender,dateOfBirth,meaninglessData)
  226.      VALUES (    sqMother.NEXTVAL
  227.               , 'Mother ' || TO_CHAR(sqMother.CURRVAL)
  228.               , 'F'
  229.               , SYSDATE
  230.               , 'x'
  231.               );
  232.    
  233.   END LOOP;
  234.   COMMIT;
  235. END;
  236.  
  237. -- 7.1 ---- 88 blocks, previous: 95
  238.  
  239. EXECUTE DBMS_STATS.GATHER_TABLE_STATS ('mircea','MOTHER');
  240. ALTER SYSTEM FLUSH SHARED_POOL;
  241.  
  242. SELECT BLOCKS FROM ALL_TABLES WHERE TABLE_NAME = 'MOTHER';
  243.  
  244. -- 7.2 ---- 82 blocks, previous: 95
  245. SELECT COUNT(DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)) FROM MOTHER;
  246.  
  247. -- 7.3 ---- 60.9756098 rows / block, previous: 91
  248. SELECT AVG(COUNT(DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))) FROM MOTHER
  249. GROUP BY DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID);
  250.  
  251. -- 8
  252. -- a) 95 - 82 = 13 blocks
  253. -- b) 91 - 61 = ~30 rows / block
  254.  
  255. -- 9
  256. EXPLAIN PLAN FOR SELECT * FROM MOTHER;
  257.  
  258. SELECT * FROM TABLE(dbms_xplan.display(NULL,NULL,'basic'));
  259.  
  260. SELECT SUM(V$SESSTAT.VALUE) AS "Total value"
  261. FROM V$STATNAME INNER JOIN V$SESSTAT
  262. ON (V$STATNAME.STATISTIC# = V$SESSTAT.STATISTIC#)
  263. WHERE V$SESSTAT.SID = SYS_CONTEXT('userenv', 'sid')
  264. AND V$STATNAME.NAME = 'consistent gets';
  265.  
  266. -- before: 12877, 12898, 12919 => 21
  267. -- now: 136454, 136578, 136602 => 24
  268.  
  269. -- 10
  270. SELECT ID, NAME, GENDER, DATEOFBIRTH, MEANINGLESSDATA
  271. FROM MOTHER WHERE ID = '1' OR ID = '1250' OR ID = '2500' OR ID = '3750' OR ID = '5000';
  272.  
  273. EXPLAIN PLAN FOR SELECT ID, NAME, GENDER, DATEOFBIRTH, MEANINGLESSDATA
  274. FROM MOTHER WHERE ID = '1' OR ID = '1250' OR ID = '2500' OR ID = '3750' OR ID = '5000';
  275.  
  276. SELECT * FROM TABLE(dbms_xplan.display(NULL,NULL,'basic'));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement