|
select (distinct). Оптимизация в древнем Sybase
|
|||
---|---|---|---|
#18+
Есть таблица, в год возрастает на 1млн записей. По ней нужно сделать select count ( distinct..) с group by Sybase 12.5 По всей таблице данный селект делается очень медленно (от 30 сек до 2 минут). Как можно ускорить работу count ( distinct..) ..? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2010, 15:51 |
|
select (distinct). Оптимизация в древнем Sybase
|
|||
---|---|---|---|
#18+
ASE 12.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2010, 15:56 |
|
select (distinct). Оптимизация в древнем Sybase
|
|||
---|---|---|---|
#18+
Запрос, описание таблицы давай. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2010, 16:17 |
|
select (distinct). Оптимизация в древнем Sybase
|
|||
---|---|---|---|
#18+
с запросом, описанием и планом каждый сможет, а вы попробуйте телепатией! ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2010, 16:22 |
|
select (distinct). Оптимизация в древнем Sybase
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Индексы всяки выдумывал, не помогало. Сейчас на таблице вот такие: Код: plaintext 1. 2. 3. 4.
Конечно я с самим primary key накосячил, при расширении добавилось e, которое записывается в group by. А также Time нужно на 1е место, тк оно изменяется с шагом в 1 день a = {1..00} от 1 до бесконечности) до numeric(19), b = {1,2} c={1,2,3}, e={1,2,3,4,5}. теоретически может дойти до 100, практически до 10. Пример строки: a b c Time e 1 ,2, 3, '2010-12-03', 1 За день появляется около 6 тыс записей. Инфа возрастает по времени и a,b,c --с утра незакешированный запрос выполнялся 3.30 минут Код: plaintext 1. 2. 3. 4. 5. 6.
План запроса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52.
Код: plaintext 1. 2. 3. 4. 5.
План запроса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
Пробовал ставить mru, lru. Приоритет у mru, но лучше вообще не указывать. Думал насчет параллелизма. Только реализовать пока что невозможно. Требование: чтобы запрос выполнялся за 5 сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2010, 07:45 |
|
select (distinct). Оптимизация в древнем Sybase
|
|||
---|---|---|---|
#18+
За день появляется около 6 тыс записей. Инфа возрастает по времени и a,b,c --с утра незакешированный запрос выполнялся 3.30 минут Пока суть да дело -- предварительный вопрос: вы что на ночь сервера выключаете что ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2010, 09:35 |
|
select (distinct). Оптимизация в древнем Sybase
|
|||
---|---|---|---|
#18+
Нет, не выключаем. Но я хотел этим сказать, что если одно и тоже часто выполнять, то оно практически за секунды выполняется. А если пройдет какое-то время, то сначала медленно, а потом снова ускоряется выполнение запроса на том же промежутке тех же данных. Поэтому и написал: незакэшированные данные). Сегодня еще погонял эти запросы. И они начали снова за 30 сек оба выполняться. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2010, 09:39 |
|
select (distinct). Оптимизация в древнем Sybase
|
|||
---|---|---|---|
#18+
Nieky, А проблема в чем? То что у вас происходит вымывание кэша, или то, что (в общем) медленно работают запросы такого рода? 30сек это хорошо или плохо??? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2010, 09:52 |
|
select (distinct). Оптимизация в древнем Sybase
|
|||
---|---|---|---|
#18+
On 03.12.2010 7:45, Nieky wrote: Вопрос номер 2: > select e, b, count(distinct a) > from myTable > where Time >'2006-01-01' and Time <'2010-10-01' > group by e, b > > go > --запрос выполнялся после предыдущего 30 сек. > select e, b,c, count(distinct a) from myTable > where Time >'2006-01-01' and Time <'2010-10-01' > group by e, b, c Какой из этих двух запросов вам нужно оптимизировать ? > select e, b, count(distinct a) > from myTable > where Time >'2006-01-01' and Time <'2010-10-01' > group by e, b Под этот хорошо бы индекс ( Time, e, b ) или просто Time (уже есть) > --запрос выполнялся после предыдущего 30 сек. > select e, b,c, count(distinct a) from myTable > where Time >'2006-01-01' and Time <'2010-10-01' > group by e, b, c Под этот хорошо бы индекс ( Time, e, b, c ) или просто Time (уже есть) Индекс IndexmyTable_ALL сразу же убирай на фиг. Не нужен индекс, содержащий все колонки. Только оптимизатор путать. Что возвращают эти запросы : select count(*) from myTable where Time >'2006-01-01' and Time <'2010-10-01' select count(*) from myTable Ну и два замечания: ASE 12.5 -- не древний вовсе. Древний -- это 11.0 Ну и в реляционных многопользовательских СУБД требования типа "чтобы запрос выполнялся за 5 сек." извини не катят. Можно только "чтобы запрос в среднем выполнялся за 5 сек.". Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2010, 09:55 |
|
|
start [/forum/topic.php?fid=55&msg=36992550&tid=2010457]: |
0ms |
get settings: |
13ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 320ms |
total: | 476ms |
0 / 0 |