PostgreSQL: как оптимизировать этот запрос - PullRequest
0 голосов
/ 29 сентября 2011

Я занимаюсь разработкой небольшого приложения на C ++ и использую PostgreSQL в качестве внутренней базы данных.Наряду с другими таблицами в моей базе данных есть таблица "projects".На основе каждого первичного ключа этой таблицы новая таблица динамически добавляется в мою базу данных.

Пример:

Предположим, что таблица проектов содержит следующие 3 строки:

--------------------------------
| Id |Other Columns Goes here   |
--------------------------------
| 1  |                          |
--------------------------------
| 2  |                          |
-------------------------------- 
| 3  |                          |
--------------------------------

Так что в этом случае у меня также есть следующие три таблицы Table1, Table2, Table3

Теперь вы можете заметить, что имена таблиц генерируются добавлением проектов.конец фиксированной строки, т. е. «Table».Также возможно, что для некоторых проектов таблица не создается.

Пример:

Предположим, что таблица проектов содержит следующие 3 строки:

--------------------------------
| Id |Other Columns Goes here   |
--------------------------------
| 1  |                          |
--------------------------------
| 2  |                          |
-------------------------------- 
| 3  |                          | 
--------------------------------

Так что в этом я мог бы найти только следующие две таблицы в моембаза данных: Table1, Table3

Теперь мне просто нужно получить все действующие проекты.Для этого в настоящее время я использую следующий алгоритм:

//part1
SELECT * FROM Projects Table
get the projects info one by one from the results of above query and store them in new instance of my Custom Class Project
Store the above instance in some contianer e.g Vector say vProjects
//part 2
For each Project p in vProject
if (TableExist(p.Id))
Store p in a new container say vValidatedProjects
Note: The TableExist() method execute the following query:
SELECT COUNT(*) FROM pg_tables WHERE tablename = 'Table"+ p.Id + "'"

Теперь все работает нормально, как и ожидалось, но !!!программа выполняется очень медленно только из-за второй части вышеупомянутого алгоритма, если у нас есть тысяча проектов, метод TableExist () также вызывается тысячу раз, и каждый раз, когда этот метод вызывается, выполняется новый запрос, который замедляет программу :(

На мой взгляд, решение состоит в следующем:

//part1
SELECT * FROM Projects Table
WHERE a table exist angainst projets.Id
get only those projects info for whom a dynamic table exist. From the results of above query and store them in new instance of my Custom Class Project
Store the above instance in some contianer e.g Vector say vProjects.

Теперь таким образом только один запрос выполнил задание для нас, а не N + 1 Запросы (где N - это не количество строк вТаблица проектов) Но я не знаю, как мне написать такой запрос, который возвращает вышеуказанные результаты. Пожалуйста, помогите мне в достижении этого.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Изменение дизайна будет лучшим решением.

Если это не вариант, вы можете изменить вторую часть:

//part 2
For each Project p in vProject
if (TableExist(p.Id))
Store p in a new container say vValidatedProjects

Note: The TableExist() method execute the following query:
SELECT COUNT(*) FROM pg_tables WHERE tablename = 'Table"+ p.Id + "'"

, сначала добавив новый логический столбец в таблицу projects (назовем его projects.TableExists)

Затем запустите текущую функцию TableExist() и заполните этот столбец. Кроме того, измените код, который создает таблицу для проекта, чтобы также обновить этот столбец, и код, который удаляет таблицу, чтобы также соответствующим образом обновить столбец.

Тогда ваша вторая часть будет:

//part 2
For each Project p in vProject
if (p.TableExists)
Store p in a new container say vValidatedProjects

Note: The TableExist() method will not be used any more
1 голос
/ 29 сентября 2011

Я бы предпочел иметь одну таблицу с project_id и делать все выборки с помощью where project_id = .... Это приведет к лучшей статистике таблиц, и оптимизатор таблиц сделает лучшую работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...