This Blog is all about ETL related Information.It gives information about Datastage ,Informatica,Oracle,SQL,PL/SQL ,Unix,Data warehousing ,Data Modeling and ER Model concepts and FAQ's
Monday
OCA/OCP Brain Dump Questions on SQL,PL/SQL
1. Examine this procedure:
CREATE OR REPLACE PROCEDURE DELETE_PLAYER (V_IDIN NUMBER) IS
BEGIN
DELETE FROM PLAYER WHERE ID = V_ID
EXCEPTION WHEN STATS_EXITS_EXCEPTION THEN
DBMS_OUTPUT.PUT_LINE (Cannot Delete this player, child records exist in PLAYER_BAT_STAT table);
END;
What prevents this procedure from being created successfully?
A. A comma has been left after the STATS_EXI ST_EXCEPTI ON exception.
B. The STATS_EXIST_EXCEPTI ON has not been declared as a number.
C. The STATS_EXIST_EXCEPTI ON has not been declared as an exception.
D. Only predefined exceptions are allowed in the EXCEPTI ON section.
Answer(s) C
2. Under which two circumstances do you design database triggers? (Choose two)
A. To duplicate the functionality of other triggers.
B. To replicate built-in constraints in the Oracle server such as primary key and foreign key.
C. To guarantee that when a specific operation is performed, related actions are performed.
D. For centralized, global operations that should be fired for the triggering statement, regardless of which user or application issues the statement.
Answer(s) C,D
3. Local procedure A calls remote procedure B. Procedure B was compiled at 8 A.M. Procedure A was modified and recompiled at 9 A.M. Remote procedure B was later modified and recompiled at 11 A.M. The dependency mode is set to TI MESTAMP. What happens when procedure A is invoked at 1 P.M?
A. There is no affect on procedure A and it runs successfully.
B. Procedure B is invalidated and recompiles when invoked.
C. Procedure A is invalidated and recompiles for the first time it is invoked.
D. Procedure A is invalidated and recompiles for the second time it is invoked.
Answer(s) D
4. What is a condition predicate in a DML trigger?
A. A conditional predicate allows you to specify a WHEN-LOGGING-ON condition in the trigger body.
B. A conditional predicate means you use the NEW and OLD qualifiers in the trigger body as a condition.
C. A conditional predicate allows you to combine several DBM triggering events into one in the trigger body.
D. A conditional predicate allows you to specify a SHUTDOWN or STARTUP condition in the trigger body.
Answer(s) C You choose correct
5. This statement fails when executed:
CREATE OR REPLACE TRIGGER CALC_TEAM_AVG AFTER INSERT ON PLAYER
BEGIN
INSERT INTO PLAYER_BATSTAT (PLAYER_ID, SEASON_YEAR, AT_BATS,
HITS) VALUES (:NEW.ID, 1997, 0, 0) ;
END;
To which type must you convert the trigger to correct the error?
A. Row
B. Statement
C. ORACLE FORM trigger
D. Be f o r e
Answer(s) A
6. An internal LOB is _____.
A. A table.
B. A column that is a primary key.
C. Stored in the database.
D. A file stored outside of the database, with an internal pointer to it from a database
column.
Answer(s) C
7. You need to disable all triggers on the EMPLOYEES table. Which command accomplishes this?
A. None of these commands; you cannot disable multiple triggers on a table in one command.
B. ALTER TRI GGERS ON TABLE e mp l o y e e s DI SABLE;
C. ALTER e mp l o y e e s DI SABLE ALL TRI GGERS;
D. ALTER TABLE employees DISABLE ALL TRIGGERS;
Answer(s) D
8. You have a row level BEFORE UPDATE trigger on the EMP table. This trigger contains a SELECT statement on the EMP table to ensure that the new salary value falls within the minimum and maximum salary for a given job title. What happens when you try to update a salary value in the EMP table?
A. The trigger fires successfully.
B. The trigger fails because it needs to be a row level AFTER UPDATE trigger.
C. The trigger fails because a SELECT statement on the table being updated is not allowed.
D. The trigger fails because you cannot use the minimum and maximum functions in a
BEFORE UPDATE trigger.
Answer(s) C
9. You need to implement a virtual private database (vpd). In order to have the vpd functionality, a trigger is required to fire when every user initiates a session in the database. What type of trigger needs to be created?
A. DML trigger
B. System event trigger
C. INSTEAD OF trigger
D. Application trigger
Answer(s) B
10. Which two program declarations are correct for a stored program unit? (Choose two)
A. CREATE OR REPLACE FUNCTION tax_amt (p_id NUMBER) RETURN NUMBER
B. CREATE OR REPLACE PROCEDURE tax_amt (p_id NUMBER) RETURN NUMBER
C. CREATE OR REPLACE PROCEDURE tax_amt (p_id NUMBER, p_amount OUT NUMBER)
D. CREATE OR REPLACE FUNCTION tax_amt (p_id NUMBER) RETURN NUMBER(10,2)
E. CREATE OR REPLACE PROCEDURE tax_amt (p_id NUMBER, p_amount OUT NUMBER(10, 2))
Answer(s) a,c
11. The creation of which four database objects will cause a DDL trigger to fire? (Choose four)
A. Index
B. Cluster
C. Package
D. Function
E. Synonyms
F. Dimensions
G. Database links
Answer(s) ABCD
12. Examine this code:
CREATE OR REPLACE PROCEDURE insert_dept (p_location_id NUMBER) IS
v_dept_id NUMBER(4);
BEGIN
INSERT INTO departments VALUES
(5, .Education., 150, p_location_id);
SELECT department_id INTO v_dept_id FROM employees
WHERE employee_id=99999;
END insert_dept;
/
CREATE OR REPLACE PROCEDURE insert_location ( p_location_id NUMBER, p_city VARCHAR2) IS
BEGIN
INSERT INTO locations(location_id, city) VALUES
(p_location_id, p_city);
insert_dept(p_location_id);
END insert_location;
/
You just created the departments, the locations, and the employees table. You did not insert any rows. Next you created both procedures. You new invoke the insert_location procedure using the following command:
EXECUTE insert_location (19, .San Francisco .) What is the result in this EXECUTE command?
A. The locations, departments, and employees tables are empty.
B. The departments table has one row. The locations and the employees tables are empty.
C. The location table has one row. The departments and the employees tables are empty.
D. The locations table and the departments table both have one row. The employees table is empty.
Answer(s) D
13. What is true about stored procedures?
A. A stored procedure uses the DELCLARE keyword in the procedure specification to declare formal parameters.
B. A stored procedure is named PL/SQL block with at least one parameter declaration in the procedure specification.
C. A stored procedure must have at least one executable statement in the procedure body.
D. A stored procedure uses the DECLARE keyword in the procedure body to declare formal parameters.
Answer(s) C
14. Examine the trigger:
CREATE OR REPLACE TRIGGER Emp_count AFTER DELETE ON Emp_tab
FOR EACH ROW
DELCARE n INTEGER;
BEGIN
SELECT COUNT(*) INTO n FROM Emp_tab;
DMBS_OUTPUT.PUT_LINE( ‘There are now’ || a || ‘employees’);
END;
This trigger results in an error after this SQL statement is entered: DELETE FROM Emp_tab WHERE Empno = 7499;
How do you correct the error?
A. Change the trigger type to a BEFORE DELETE.
B. Take out the COUNT function because it is not allowed in a trigger.
C. Remove the DBMS_OUTPUT statement because it is not allowed in a trigger.
D. Change the trigger to a statement-level trigger by removing FOR EACH ROW.
Answer(s) D
15. The OLD and NEW qualifiers can be used in which type of trigger?
A. Row level DML trigger
B. Row level system trigger
C. Statement level DML trigger
D. Row level application trigger
E. Statement level system trigger
F. Statement level application trigger
Answer(s) A
16. Which view displays indirect dependencies, indenting each dependency?
A. DEPTREE
B. IDEPTREE
C. INDENT_TREE
D. I_DEPT_TREE
Answer(s) B
17. Examine this code:
CREATE OR REPLACE PROCEDURE audit_action (p_who VARCHAR2)AS
BEGIN
INSERT INTO audit(schema_user) VALUES(p_who);
END audit_action;
/
CREATE OR REPLACE TRIGGER watch_it AFTER LOGON ON DATABASE
CALL audit_action(ora_login_user)
/
What does this trigger do?
A. The trigger records an audit trail when a user makes changes to the database.
B. The trigger marks the user as logged on to the database before an audit statement is issued.
C. The trigger invoked the procedure audit_action each time a user logs on to his/her schema and adds the username to the audit table.
D. The trigger invokes the procedure audit_action each time a user logs on to the database and adds the username to the audit table.
Answer(s) D
18. Examine this procedure:
CREATE OR REPLACE PROCEDURE UPD_BAT_STAT (V_ID IN NUMBER DEFAULT 10, V_AB IN NUMBER DEFAULT 4) IS
BEGIN
UPDATE PLAYER_BAT_STAT SET AT_BATS = AT_BATS + V_AB
WHERE PLAYER_ID = V_ID;
COMMIT;
END;
Which two statements will successfully invoke this procedure in
SQL *Plus? (Choose two)
A. EXECUTE UPD_BAT_STAT;
B. EXECUTE UPD_BAT_STAT(V_AB=>10, V_ID=>31);
C. EXECUTE UPD_BAT_STAT(31, .FOUR., .TWO.);
D. UPD_BAT_STAT(V_AB=>10, V_ID=>31);
E. RUN UPD_BAT_STAT;
Answer(s) A,B
19. Examine this code:
CREATE OR REPLACE FUNCTION gen_email_name (p_first_name VARCHAR2, p_last_name VARCHAR2, p_id NUMBER) RETURN VARCHAR2 IS
v_email_name VARCHAR2(19);
BEGIN
v_email_name := SUBSTR(p_first_name, 1, 1) ||
SUBSTR(p_last_name, 1, 7) || .@Oracle.com .;
UPDATE employees SET email = v_email_name
WHERE employee_id = p_id;
RETURN v_email_name;
END;
Which statement removes the function?
A. DROP gen_email_name;
B. REMOVE gen_email_name;
C. DELETE gen_email_name;
D. DROP FUNCTION gen_eamil_name;
Answer(s) D
20. Examine this code:
CREATE OR REPLACE PACKAGE comm_package IS
g_comm NUMBER := 10;
PROCEDURE reset_comm(p_comm IN NUMBER);
END comm_package;
/
User Jones executes the following code at 9:01am:
EXECUTE comm_package.g_comm := 15
User Smith executes the following code at 9:05am:
EXECUTE comm_paclage.g_comm := 20
which statement is true?
A. g_ comm has a value of 15 at 9:06am for Smith.
B. g_ comm has a value of 15 at 9:06am for Jones.
C. g_comm has a value of 20 at 9:06am for both Jones and Smith.
D. g_comm has a value of 15 at 9:03 am for both Jones and Smith.
E. g_comm has a value of 10 at 9:06am for both Jones and Smith.
F. g_comm has a value of 10 at 9:03am for both Jones and Smith
Answer(s) B
21. Examine this package:
CREATE OR REPLACE PACKAGE BB_PACK IS
V_MAX_TEAM_SALARY NUMBER(12,2);
PROCEDURE ADD_PLAYER(V_ID IN NUMBER, V_LAST_NAME VARCHAR2, V_SALARY NUMBER);
END BB_PACK;
/
CREATE OR REPLACE PACKAGE BODY BB_PACK IS
V_PLAYER_AVG NUMBER(4,3);
PROCEDURE UPD_PLAYER_STAT(V_ID IN NUMBER,
V_AB IN NUMBER DEFAULT 4, V_HITS IN NUMBER) IS
BEGIN
UPDATE PLAYER_BAT_STAT SET AT_BATS = AT_BATS + V_AB, HITS = HITS + V_HITS
WHERE PLAYER_ID = V_ID;
COMMIT;
VALIDATE_PLAYER_STAT(V_ID);
END UPD_PLAYER_STAT;
PROCEDURE ADD_PLAYER (V_ID IN NUMBER, V_LAST_NAME VARCHAR2, V_SALARY NUMBER)IS
BEGIN
INSERT INTO PLAYER(ID,LAST_NAME,SALARY) VALUES
(V_ID, V_LAST_NAME, V_SALARY);
UPD_PLAYER_STAT(V_ID,0,0);
END ADD_PLAYER;
END BB_PACK
/
Which statement will successfully assign .333 to the V_PLAYER_AVG variable from a procedure outside the package?
A. V_PLAYER_AVG := .333;
B. BB_PACK.UPD_PLAYER_STAT.V_PLAYER_AVG := .333;
C. BB_PACK.V_PLAYER_AVG := .333;
D. This variable cannot be assigned a value from outside of the package.
Answer(s) D
22. What can you do with the DBMS_LOB package?
A. Use the DBMS_LOB.WRITE procedure to write data to a BFILE.
B. Use the DBMS_LOB.BFILENAME function to locate an external BFILE.
C. Use the DBMS_LOB.FILEEXISTS function to find the location of a BFILE.
D. Use the DBMS_LOB.FILECLOSE procedure to close the file being accessed.
Answer(s) D
23. Examine this package:
CREATE OR REPLACE PACKAGE manage_emps IS
tax_rate CONSTANT NUMBER(5,2) := .28;
v_id NUMBER;
PROCEDURE insert_emp (p_deptno NUMBER, p_sal NUMBER);
PROCEDURE delete_emp;
PROCEDURE update_emp;
FUNCTION calc_tax (p_sal NUMBER) RETURN NUMBER;
END manage_emps;
/
CREATE OR REPLACE PACKAGE BODY manage_emps IS
PROCEDURE update_sal (p_raise_amt NUMBER) IS
BEGIN
UPDATE emp SET sal = (sal * p_raise_emt) + sal
WHERE empno = v_id;
END;
PROCEDURE insert_emp (p_deptno NUMBER, p_sal NUMBER) IS
BEGIN
INSERT INTO emp(empno, deptno, sal) VALYES
(v_id, p_depntno, p_sal);
END insert_emp;
PROCEDURE delete_emp IS
BEGIN
DELETE FROM emp WHERE empno = v_id;
END delete_emp;
PROCEDURE update_emp IS
v_sal NUMBER(10,2);
v_raise NUMBER(10, 2);
BEGIN
SELECT sal INTO v_sal FROM emp WHERE empno = v_id;
IF v_sal < 500 THEN v_raise := .05;
ELSIP v_sal < 1000 THEN v_raise := .07;
ELSE v_raise := .04;
END IF;
update_sal(v_raise);
END update_emp;
FUNCTION calc_tax (p_sal NUMBER)RETURN NUMBER IS
BEGIN
RETURN p_sal * tax_rate;
END calc_tax;
END manage_emps;
/
What is the name of the private procedure in this package?
A. CALC_TAX
B. INSERT_EMP
C. UPDATE_SAL
D. DELETE_EMP
E. UPDATE_EMP
F. MANAGE_EMPS
Answer(s) C
24. Which two dopes the INSTEAD OF clause in a trigger identify? (Choose two)
A. The view associated with the trigger.
B. The table associated with the trigger.
C. The event associated with the trigger.
D. The package associated with the trigger.
E. The statement level or for each row association to the trigger.
Answer(s) A,E
25. Which three are valid ways to minimize dependency failure? (Choose three)
A. Querying with the SELECT * notification.
B. Declaring variables with the %TYPE attribute.
C. Specifying schema names when referencing objects.
D. Declaring records by using the %ROWTYPE attribute.
E. Specifying package.procedure notation while executing procedures.
Answer(s) A,B,D
26. Examine this code:
CREATE OR REPLACE PROCEDURE
add_dept ( p_name departments.department_name%TYPE DEFAULT ‘unknown‘, p_loc departments.location_id%TYPE DEFAULT 1700) IS
BEGIN
INSERT INTO departments(department_id, department_name, loclation_id) VALUES (dept_seq.NEXTVAL,p_name, p_loc);
END add_dept;
/
You created the add_dept procedure above, and you now invoke the procedure in SQL *Plus. Which four are valid invocations? (Choose four)
A. EXECUTE add_dept(p_loc=>2500)
B. EXECUTE add_dept( ‘Education’, 2500)
C. EXECUTE add_dept( .2500 , p_loc =>2500)
D. EXECUTE add_dept(p_name=> ‘Education’, 2500)
E. EXECUTE add_dept(p_loc=>2500, p_name=> ‘Education’)
Answer(s) A, B, C,E
27. Which two describe a stored procedure? (Choose two)
A. A stored procedure is typically written in SQL.
B. A stored procedure is a named PL/SQL block that can accept parameters.
C. A stored procedure is a type of PL/SQL subprogram that performs an action.
D. A stored procedure has three parts: the specification, the body, and the exception handler part.
E. The executable section of a stored procedure contains statements that assigns values, control execution, and return values to the calling environment.
Answer(s) B,C
28. To be callable from a SQL expression, a user-defined function must do what?
A. Be stored only in the database.
B. Have both IN and OUT parameters.
C. Use the positional notation for parameters.
D. Return a BOOLEAN or VARCHAR2 data type.
Answer(s) A
29. Examine this procedure:
CREATE OR REPLACE PROCEDURE INSERT_TEAM (V_ID in NUMBER,
V_CITY in VARCHAR2 DEFAULT ‘AUSTIN’, V_NAME in VARCHAR2) IS
BEGIN
INSERT INTO TEAM (id, city, name) VALUES (v_id, v_city, v_name); COMMIT;
END
which two statements will successfully invoke this procedure in SQL *Plus? (Choose two)
A. EXECUTE INSERT_TEAM;
B. EXECUTE INSERT_TEAM(3, V_NAME=> ‘LONGHORNS’, V_CITY=> ‘AUSTIN’);
C. EXECUTE INSERT_TEAM(3, ‘AUSTIN’, ‘LONGHORNS’);
D. EXECUTE INSERT_TEAM (V_ID:= V_NAME:=‘LONGHORNS’, V_CITY := ‘AUSTIN’);
E. EXECUTE INSERT_TEAM (3, ‘LONGHORNS’);
Answer(s) B,C
30. How can you migrate from a LONG to a LOB data type for a column?
A. Use the DBMS_MANAGE_LOB.MIGRATE procedure.
B. Use the UTL_MANAGE_LOB.MIGRATE procedure.
C. Use the DBMS_LOB.MIGRATE procedure.
D. Use the ALTER TABLE command.
E. You cannot migrate from a LONG to a LOB date type for a column.
Answer(s) D
Wednesday
Informatica Mapping,Informatica Session Performance Tuning
When to optimize mappings
The best time in the development cycle is after system testing. Focus on mapping-level optimization only after optimizing the target and source databases.
Use Session Log to identify if the source, target or transformations are the performance bottleneck
The session log contains thread summary records:
MASTER> PETL_24018 Thread [READER_1_1_1] created for the read stage of
partition point [SQ_test_all_text_data] has completed: Total Run Time =
[11.703201] secs, Total Idle Time = [9.560945] secs, Busy Percentage =
[18.304876].
MASTER> PETL_24019 Thread [TRANSF_1_1_1_1] created for the transformation
stage of partition point [SQ_test_all_text_data] has completed: Total Run
Time = [11.764368] secs, Total Idle Time = [0.000000] secs, Busy Percentage
= [100.000000].
MASTER> PETL_24022 Thread [WRITER_1_1_1] created for the write stage of
partition point(s) [test_all_text_data1] has completed: Total Run Time =
[11.778229] secs, Total Idle Time = [8.889816] secs, Busy Percentage =
[24.523321].
If one thread has busy percentage close to 100% and the others have significantly lower value, the thread with the high busy percentage is the bottleneck. In the example above, the session is transformation bound
Identifying Target Bottlenecks
The most common performance bottleneck occurs when the Informatica Server writes to a target database. You can identify target bottlenecks by configuring the session to write to a flat file target. If the session performance increases significantly when you write to a flat file, you have
a target bottleneck.
Consider performing the following tasks to increase performance:
* Drop indexes and key constraints.
* Increase checkpoint intervals.
* Use bulk loading.
* Use external loading.
* Increase database network packet size.
* Optimize target databases.
Identifying Source Bottlenecks
If the session reads from relational source, you can use a filter transformation, a read test mapping, or a database query to identify source bottlenecks:
* Filter Transformation - measure the time taken to process a given amount of data, then add an always false filter transformation in the mapping after each source qualifier so that no data is processed past the filter transformation. You have a source bottleneck if the new session runs in about the same time.
* Read Test Session - compare the time taken to process a given set of data using the session with that for a session based on a copy of the mapping with all transformations after the source qualifier removed with the source qualifiers connected to file targets. You have a source bottleneck if the new session runs in about the same time.
* Extract the query from the session log and run it in a query tool. Measure the time taken to return the first row and the time to return all rows. If there is a significant difference in time, you can use an optimizer hint to eliminate the source bottleneck
Consider performing the following tasks to increase performance:
* Optimize the query.
* Use conditional filters.
* Increase database network packet size.
* Connect to Oracle databases using IPC protocol.
Identifying Mapping Bottlenecks
If you determine that you do not have a source bottleneck, add an Always False filter transformation in the mapping before each target definition so that no data is loaded into the target tables. If the time it takes to run the new session is the same as the original session, you have a mapping bottleneck.
You can also identify mapping bottlenecks by examining performance counters.
Readfromdisk and Writetodisk Counters: If a session contains Aggregator, Rank, or Joiner transformations, examine each Transformation_readfromdisk and Transformation_writetodisk counter. If these counters display any number other than zero, you can improve session performance by increasing the index and data cache sizes. Note that if the session uses Incremental Aggregation, the counters must be examined during the run, because the Informatica Server writes to disk when saving historical data at the end of the run.
Rowsinlookupcache Counter: A high value indicates a larger lookup, which is more likely to be a bottleneck
Errorrows Counters: If a session has large numbers in any of the Transformation_errorrows counters, you might improve performance by eliminating the errors.
BufferInput_efficiency and BufferOutput_efficiency counters: Any dramatic difference in a given set of BufferInput_efficiency and BufferOutput_efficiency counters indicates inefficiencies that may benefit from tuning.
To enable collection of performance data:
1. Set session property Collect Performance Data (on Performance tab)
2. Increase the size of the Load Manager Shared Memory by 200kb for each session in shared memory that you configure to create performance details. If you create performance details for all sessions, multiply the MaxSessions parameter by 200kb to calculate the additional shared memory requirements.
To view performance details in the Workflow Monitor:
1. While the session is running, right-click the session in the Workflow Monitor and choose Properties.
2. Click the Performance tab in the Properties dialog box.
To view the performance details file:
1. Locate the performance details file. The Informatica Server names the file session_name.perf, and stores it in the same directory as the session log.
2. Open the file in any text editor.
General Optimizations
Single-pass reading - instead of reading the same data several times, combine mappings that use the same set of source data and use a single source qualifier
Avoid unnecessary data conversions: For example, if your mapping moves data from an Integer column to a Decimal column, then back to an Integer column, the unnecessary data type conversion slows performance.
Factor out common expressions/transformations and perform them before data pipelines split
Optimize Char-Char and Char-Varchar Comparisons by using the Treat CHAR as CHAR On Read option in the Informatica Server setup so that the Informatica Server does not trim trailing spaces from the end of Char source fields.
Eliminate Transformation Errors (conversion errors, conflicting mapping logic, and any condition set up as an error, such as null input). In large numbers they restrict performance because for each one, the Informatica Server pauses to determine its cause, remove the row from the data flow and write it to the session log or bad file.
As a short term fix, reduce the tracing level on sessions that must generate large numbers of errors.
Optimize lookups
Cache lookups if
o the number of rows in the lookup table is significantly less than the typical number of source rows
o un-cached lookups perform poorly (e.g. they are based on a complex view or an unindexed table) Optimize Cached lookups
o Use a persistent cache if the lookup data is static
o Share caches if several lookups are based on the same data set
o Reduce the number of cached rows using a SQL override with a restriction
o Index the columns in the lookup ORDER BY
Courtesy : ItToolBox
Thursday
Increasing Informatica Server Performance
There are many factors that can affect session performance. Here are some of the reasons.
Before doing tuning that is specific to Informatica:
1. Slow disk access on source and target databases, source and target file systems, as well as the Informatica Server and repository machines can slow session performance.So check hard disks on related machines.
2. Slow network connections can slow session performance.Therefore Improve network speed.
3. Check the Informatica Server and related machines run on high performance CPUs.Check CPUs on related machines.
4. Configure physical memory for the Informatica Server to minimize disk I/O. (Configure the physical memory for the Informatica Server machine to minimize paging to disk.)
5. Optimize database configuration
6. Staging areas. If you use a staging area, you force the Informatica Server to perform multiple passes on your data. Where possible, remove staging areas to improve performance.
7. You can run multiple Informatica Servers on separate systems against the same repository. Distributing the session load to separate Informatica Server systems increases performance.
Informatica specific:
- Transformation tuning
- Using Caches
- Avoiding Lookups by using DECODE for smaller and frequently used tables
- Applying Filter at the earliest point in the data flow etc.
Subscribe to:
Posts (Atom)