Как можно оптимизировать это заявление VIEW? - PullRequest
1 голос
/ 28 июля 2011

У меня есть две таблицы table1 и table2.Table1 генерируется парсером и автоматически обновляется каждые несколько дней.Table2 - отредактированная пользователем версия table1.Если запись существует в таблице 2, это должно перекрывать запись в таблице 1 в представлении.

Любая отредактированная версия в таблице 2 имеет исходное содержимое из таблицы table для Column2 и Column3 в OldColumn2 и OldColumn3 соответственно.Когда пользователь удаляет запись, удаляемый столбец имеет значение 1, а если пользователь хочет снова добавить запись, он имеет значение 0 для отображения в представлении.По умолчанию значение равно NULL, если оно никогда не удалялось.

Если новая запись вставлена ​​в table2, OldColumn2 и OldColumn3 имеют значение new string, чтобы отличить ее в таблице table1..

Вот дизайн моей таблицы.

Table1
+------+------+------+-------------+
| Col1 | Col2 | Col3 | OtherColumns|
+------+------+------+-------------+
|   a1 |   b1 |   c1 |    Data     |
+------+------+------+-------------+
|   a2 |   b2 |   c2 |    Data     |
+------+------+------+-------------+
|   a3 |   b3 |   c3 |    Data     |
+------+------+------+-------------+
|   a4 |   b4 |   c4 |    Data     |
+------+------+------+-------------+


Table2
+------+------+------+-------------+----------+----------+---------+
| Col1 | Col2 | Col3 | OtherColumns| OldCol2  |  OldCol3 | Deleted |
+------+------+------+-------------+----------+----------+---------+
|  a1  |   e1 |  f1  |   Data      |    b1    |     c1   |   NULL  |
+------+------+------+-------------+----------+----------+---------+
|  a2  |   k2 |  m2  |   Data      |    b2    |     c2   |   0     |
+------+------+------+-------------+----------+----------+---------+
|  a3  |   k3 |  m3  |   Data      |    b3    |     c3   |   1     |
+------+------+------+-------------+----------+----------+---------+
|  z1  |   kk |  jj  |   Data      |   new    |   new    |   1     |
+------+------+------+-------------+----------+----------+---------+
|  z2  |   kj |  uu  |   Data      |   new    |   new    |   0     |
+------+------+------+-------------+----------+----------+---------+

    View
+------+------+------+-------------+----------+----------+---------+
| Col1 | Col2 | Col3 | OtherColumns| OldCol2  |  OldCol3 | Deleted |
+------+------+------+-------------+----------+----------+---------+
|  a1  |   e1 |  f1  |   Data      |    b1    |     c1   |   NULL  |
+------+------+------+-------------+----------+----------+---------+
|  a2  |   k2 |  m2  |   Data      |    b2    |     c2   |   0     |//Deleted then added
+------+------+------+-------------+----------+----------+---------+
|  a4  |   k4 |  j4  |   Data      |    NULL  |     NULL |   0     |
+------+------+------+-------------+----------+----------+---------+
|  z2  |   kj |  uu  |   Data      |   new    |   new    |   0     |
+------+------+------+-------------+----------+----------+---------+

Вот мой оператор представления.

CREATE VIEW NEWVIEW
AS
SELECT t2.* FROM table1 t1
LEFT JOIN table2 t2
ON t1.column1 = t2.column1 AND t1.column2 = t2.oldColumn2 AND t1.column3 = t2.oldColumn3
WHERE t2.column1 IS NOT NULL AND t2.Deleted = 0

UNION

SELECT t1.*, null, null, null FROM table1 t1
LEFT JOIN table2 t2
ON t1.column1 = t2.column1 AND t1.column2 = t2.oldColumn2 AND t1.column3 = t2.oldColumn3
WHERE t2.column1 IS NULL

UNION

SELECT * FROM table2 WHERE oldColumn2 = 'new' AND oldColumn3 = 'new' AND Deleted = 0

Вид сейчас немного медленный.Как я могу оптимизировать это представление?

1 Ответ

0 голосов
/ 28 июля 2011

Попробуйте изменить первые два оператора SELECT на ваш взгляд с помощью этого -

SELECT
  t1.column1,
  t1.column2,
  t1.column3,
  IF(t2.column1 IS NULL, t1.OtherColumns, t2.OtherColumns) OtherColumns,
  IF(t2.column1 IS NULL, NULL, t2.OldCol2) OldCol2,
  IF(t2.column1 IS NULL, NULL, t2.OldCol3) OldCol3,
  IF(t2.column1 IS NULL, NULL, t2.Deleted) Deleted
FROM
  table1 t1
LEFT JOIN table2 t2
  ON t1.column1 = t2.column1 AND t1.column2 = t2.oldColumn2 AND t1.column3 = t2.oldColumn3
WHERE 
  t2.column1 IS NULL OR t2.column1 IS NOT NULL AND t2.Deleted = 0

Обратите внимание, что представления могут иметь плохую производительность.

...