Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Поиск оптимального решения для следующего запроса / 12 сообщений из 12, страница 1 из 1
13.12.2013, 22:40:28
    #38500644
kinglion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
Какие существуют наиболее оптимальные решения с точки зрения производительности/скорости для следующего запроса?
Прошу предлагать Ваши любые замечания и предложения, как его можно оптимизировать.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT t1.field1,
	t1.field2,
	(SELECT t2.field3 FROM t2 WHERE t2.fk = t1.pk ORDER BY t2.date DESC, t2.pk DESC LIMIT 1) AS MostRecentField3,
	(SELECT t2.field4 FROM t2 WHERE t2.fk = t1.pk ORDER BY t2.date DESC, t2.pk DESC LIMIT 1) AS MostRecentField4
FROM t1
	INNER JOIN t3 ON t3.fk = t1.pk
WHERE ...



На данный момент есть следующие варианты:
- Каждый раз пересчитывать MostRecentField3 и MostRecentField4 при вставке и обновлении выбранной строки в таблице на основе данных из другой таблицы.
- Использовать запрос как есть.
- Возможно удастся применить OVER(). Нужно проанализировать данные в таблицах и попробовать построить такой запрос.
- Варианты предложенные сообществом.

Данный код должен работать в MySQL v.5.1.50.
Переход на другую версия БД планируется, но задачу необходимо реализовать минимальными усилиями для указанной версии MySQL.
...
Рейтинг: 0 / 0
13.12.2013, 22:58:56
    #38500649
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
kinglionВозможно удастся применить OVER()Вы с ораклом не попутали?

Сколько всего записей в таблице t2 и в ней сколько уникальных значений поля fk ?
К скольки из них происходит "обращение" в целом запросе в среднем?
...
Рейтинг: 0 / 0
13.12.2013, 23:30:14
    #38500668
kinglion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
Связи таблиц:
t1 и t2 - один ко многим
t1 и t3 - один к одному

В данной версии MySQL нет возможности использовать OVER(), но есть библиотека, которая подключается дополнительно и делает что-то похожее на OVER() из MSSQL (Oracle). Но производительность этой библиотеки очень низкая. :)

Принимаю любые предложения и замечания.
Надеюсь на помощь сообщества в оптимизации этого запроса.
...
Рейтинг: 0 / 0
13.12.2013, 23:45:48
    #38500677
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
kinglionПринимаю любые предложения и замечания.
Надеюсь на помощь сообщества в оптимизации этого запроса.Тогда ответьте, пожалуйста, на вопросы.
...
Рейтинг: 0 / 0
14.12.2013, 05:38:41
    #38500738
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
kinglion Какие существуют наиболее оптимальные решения с точки зрения производительности/скорости для следующего запроса?
Прошу предлагать Ваши любые замечания и предложения, как его можно оптимизировать.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT t1.field1,
	t1.field2,
	(SELECT t2.field3 FROM t2 WHERE t2.fk = t1.pk ORDER BY t2.date DESC, t2.pk DESC LIMIT 1) AS MostRecentField3,
	(SELECT t2.field4 FROM t2 WHERE t2.fk = t1.pk ORDER BY t2.date DESC, t2.pk DESC LIMIT 1) AS MostRecentField4
FROM t1
	INNER JOIN t3 ON t3.fk = t1.pk
WHERE ...



На данный момент есть следующие варианты:
- Каждый раз пересчитывать MostRecentField3 и MostRecentField4 при вставке и обновлении выбранной строки в таблице на основе данных из другой таблицы.
- Использовать запрос как есть.
- Возможно удастся применить OVER(). Нужно проанализировать данные в таблицах и попробовать построить такой запрос.
- Варианты предложенные сообществом.

Данный код должен работать в MySQL v.5.1.50.
Переход на другую версия БД планируется, но задачу необходимо реализовать минимальными усилиями для указанной версии MySQL.
нормальный запрос, если индексы работают
...
Рейтинг: 0 / 0
14.12.2013, 11:12:49
    #38500770
Диклевич Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
можно еще так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t1.field1,
	t1.field2,
	t2.field3 AS MostRecentField3,
	t2.field4 AS MostRecentField4
FROM t1
JOIN t3 ON t3.fk = t1.pk
JOIN t2 ON t2.fk = t1.pk
WHERE ...
        AND NOT EXISTS(SELECT t22.* FROM t2 t22 WHERE t22.date > t2.date AND NOT EXISTS(SELECT t23.* FROM t2 t23 WHERE t23.pk > t22.pk))
...
Рейтинг: 0 / 0
14.12.2013, 19:44:20
    #38500949
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT t1.field1,
  t1.field2,
  t2.MostRecentField3,
  t2.MostRecentField4
FROM t1
JOIN(
  SELECT 
    t2.field3 AS MostRecentField3,
    t2.field4 AS MostRecentField4
  FROM t2 WHERE t2.fk = t1.pk 
  ORDER BY t2.date DESC, t2.pk DESC 
  LIMIT 1
  )t2
JOIN t3 ON t3.fk = t1.pk
WHERE ...
...
Рейтинг: 0 / 0
14.12.2013, 19:44:54
    #38500950
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
ой сорь, наврал))
...
Рейтинг: 0 / 0
14.12.2013, 19:48:05
    #38500954
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
в MS SQL придумали CROSS APPLY для таких целей, а в MySQL, наверное, только как в старттопике...
...
Рейтинг: 0 / 0
16.12.2013, 13:36:09
    #38502088
kinglion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
miksoftВы с ораклом не попутали?
нет
miksoftСколько всего записей в таблице t2 и в ней сколько уникальных значений поля fk ?
t2 может содержать одну или несколько записей связанных с одной записью из t1.
miksoftК скольки из них происходит "обращение" в целом запросе в среднем?
Выбирается примерно к 0.1-0.5% записей при указании различных фильтров в WHERE.
Фильтр применяется к таблице t1.
...
Рейтинг: 0 / 0
16.12.2013, 13:41:36
    #38502095
kinglion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
Диклевич Александрможно еще так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t1.field1,
	t1.field2,
	t2.field3 AS MostRecentField3,
	t2.field4 AS MostRecentField4
FROM t1
JOIN t3 ON t3.fk = t1.pk
JOIN t2 ON t2.fk = t1.pk
WHERE ...
        AND NOT EXISTS(SELECT t22.* FROM t2 t22 WHERE t22.date > t2.date AND NOT EXISTS(SELECT t23.* FROM t2 t23 WHERE t23.pk > t22.pk))



Поля MostRecentField3 и MostRecentField4 могут выбираться из одной строки в таблице или из разных, поэтому этот вариант запроса не обеспечивет нужной функциональности.
...
Рейтинг: 0 / 0
16.12.2013, 14:18:34
    #38502165
kinglion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск оптимального решения для следующего запроса
kinglionДиклевич Александрможно еще так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t1.field1,
	t1.field2,
	t2.field3 AS MostRecentField3,
	t2.field4 AS MostRecentField4
FROM t1
JOIN t3 ON t3.fk = t1.pk
JOIN t2 ON t2.fk = t1.pk
WHERE ...
        AND NOT EXISTS(SELECT t22.* FROM t2 t22 WHERE t22.date > t2.date AND NOT EXISTS(SELECT t23.* FROM t2 t23 WHERE t23.pk > t22.pk))



Поля MostRecentField3 и MostRecentField4 могут выбираться из одной строки в таблице или из разных, поэтому этот вариант запроса не обеспечивет нужной функциональности.
Предыдущее сообщение прошу игнорировать.
Запрос правильный для этой задачи, но в ответе описывалась другая задача.
Еще раз извиняюсь.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Поиск оптимального решения для следующего запроса / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]