|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Здравствуйте! Я новичок в Cache. Product: Cache 2008.2 Hardware: Microsoft Windows Server 2008. Мне нужно оптимизировать запрос, написанный раннее. Запрос сложный, я его упростила до минимума, пытаясь оптимизировать. Две таблицы, обе индексированы: Client.ResponseArchive (Primary Key: MobileNumber||ResponseID, 10000 записей), Client.MessageArchive (Primary Key: MessageID, 850000 записей). Сам запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Если запрос выполняется без последнего условия (ResponseArchive.MobileNumber Like '%')- за 2 секунды, с последним- за 1.5 минуты (посортироваы по MobileNumber). Возвращает 539 записей. Как его можно оптимизировать, чтобы он быстро работал и с последним условием? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 18:09 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichka , Как вариант: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Но лучше Like '%' заменить на is not null : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Надеюсь, индекс на MobileNumber есть, и в обеих таблицах? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 18:30 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Спасибо, сейчас попробую. Да, обе таблицы проиндексированы по MobileNumber. MobileNumber берется из textbox и может содержать часть номера только. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 19:03 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Запустила запрос. Выполнялся 1 мин. Все равно долго. A PrimaryKey может влиять? Если он в таблице как MobileNumber||ResponseID (плюс проиндексировано отдельно по полям MobileNumber, ResponseID - это я уже сама добавила, изначально индекс был толко по ResponseDate). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 19:34 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaMobileNumber берется из textbox и может содержать часть номера только.Тогда должно быть Like '%что-то%' ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 19:34 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaA PrimaryKey может влиять?Есть острая необходимость в отказе от стандартного (системного) первичного ключа? В этом случае Вы лишаетесь в будущем возможности использовать bitmap-индексы. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 19:41 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
А если textbox пустой и все номера должны быть выбраны, тогда как? - '%'? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 19:41 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaА если textbox пустой и все номера должны быть выбраны, тогда как? - '%'?is not null ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 19:44 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servitЕсть острая необходимость в отказе от стандартного (системного) первичного ключа? Это когда он не задается в классе явно? Все (классы) создано и работает несколько лет, только тормозить стало, жалуются клиенты. И я не сильна в Cache, поэтому про индексы не знаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 19:54 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaMobileNumber берется из textbox и может содержать часть номера только.Или использовать предикат "[": Substring Predicates ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 19:54 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaВсё создано и работает несколько летЯсно. vichkaИ я не сильна в Cache, поэтому про индексы не знаюПланы запросов смотрели? Попробуйте ещё подсказки SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 20:04 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servitПланы запросов смотрели? Да, смотрела. Только не знаю что делать (see .pdf file attached). Написала в INTERSYSTEMS. Они предлагат переписать в dynamic SQL. А там несколько сложных запросов. Это будет долго- переписывать + тестировать.... servitПопробуйте ещё подсказки SQL Подсказки эти тоже уже знаю- не помогли пока, пробовала с разными OPTIOMIZING WORDS. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 20:23 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaservitПланы запросов смотрели? Да, смотрела. Только не знаю что делать (see .pdf file attached). план запроса весь бы увидеть, в представленном варианте не все видно ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 21:27 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaДа, смотрела. Только не знаю что делать (see .pdf file attached).Я хотел бы увидеть планы и результаты моих трёх вариантов: подзапрос, is not null и [ ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 21:28 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
DAiMorплан запроса весь бы увидеть, в представленном варианте не все видноРазве? Во втором запросе нет модулей и, кстати, не используются индексы на даты. vichka , Статистику по таблицам собирали? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2013, 21:39 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
У вас проблема, что включается использование индекса по MobileNumber, каше считает его оптимальным, но ошибается. Какие могут быть варианты: 1. использовать подсказку %Ignoreindices. Не факт, что получится, так как это часть первичного ключа. 2. использовать конструкцию select from ( select ... ) where MobileNumber ... Тогда основной запрос не будет использовать индекс, а фильтрация будет уже в промежуточных результатах 3. Искорежить поле MobileNumber так, чтобы каше не поняла, что по нему можно использовать индекс Типа where string(MobileNumber) like '%..' Пожалуй, самое простое - третий вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 06:46 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Ранее как-то писалось, что такое vichka Код: sql 1. 2. 3.
оптимальнее написать так Код: sql 1. 2.
Причем даже местами поменять Код: sql 1. 2. 3. 4.
А вот это vichka Код: sql 1.
точно как Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 08:30 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaЕсли запрос выполняется без последнего условия Код: sql 1.
- за 2 секунды, с последним- за 1.5 минуты (посортироваы по MobileNumber). А сколько будет по времени работать Код: sql 1.
и Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 08:36 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Вопросы к автору : ResponseText берется из таблицы ResponseArchive? или MessageArchive? Если в селекте поля только из одной таблицы, то вот так можно поробовать: Код: sql 1. 2. 3. 4.
Like '%' - это использовать вообще не советую, жутко тормозная тема. посмотрите раздел Query Optimization Options , в частности %NOFLATTEN и использование этой опции в подзапросах http://docs.intersystems.com/cache20081/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_from#RSQL_C22222 но опять же, при оптимизации всегда смотрите план, так будет проще понять в каком месте оптимизировать и помогают ли дополнительные опции так же думаю что вам могут помочь в форуме по MS SQL Server ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 14:12 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servitЯ хотел бы увидеть планы и результаты моих трёх вариантов: подзапрос, is not null и тогда, автор, и мне мой покажите план, %NOFLATTEN в позапросе можно попробовать указать, а иногда наоборот он тормозит запрос и лучше без него ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 14:15 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Аленочкатак же думаю что вам могут помочь в форуме по MS SQL ServerТС разве где-то упомянул про MS SQL Server ? Выше речь шла про Microsoft Windows Server 2008 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 14:19 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servit, читать умею) а sql-запросы оптимизируют не только в Cache, элементарно в форуме MS SQL Server больше народу и спецов по этой части ИМХО, может кто-то что-то умное подскажет, или по вашему если основная среда разработки Cache, то и спрашивать следует только в форуме по Cache ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 16:01 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Аленочка , Если там знают нюансы Caché, умеют оптимизировать специально под Caché, разбираются в подсказках его SQL и умеют читать его планы запросов - пусть обращается. Но если там начнут предлагать фишки сугубо для MS SQL Server, то кого потом автору винить? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 16:19 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Извините за поздний ответ. Как мне показать вам планы запросов? Скопировать и вставить здесь как текст или как? Я прицепила ранее файл, кто-то сказал, что не все видно- это все что было, за исключением самих записей. Как мне тогда вам их предоставить? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 18:20 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Маленько уточню запрос, опущенное может повлиять на скорость: SELECT DISTINCT TOP 5000 ResponseArchive.ResponseID, ResponseArchive.MobileNumber AS MobileNo, ResponseArchive.ResponseText AS Message, ResponseArchive.ResponseDate FROM %NOTOPOPT Client.ResponseArchive INNER JOIN Client.MessageArchive ON ResponseArchive.MobileNumber = MessageArchive.MobileNumber WHERE ResponseArchive.ResponseDate >= '2013-03-01' AND MessageArchive.DateArchived BETWEEN '2013-03-01' AND '2013-03-31' AND ResponseArchive.MobileNumber Like '%' order by ResponseArchive.MobileNumber, ResponseArchive.ResponseDate desc %NOTOPOPT было рекомендовано раннее by Intersystems- Помогло, но в других запросах, где таблицы не JOIN по части от PrimaryKey, а по какому-нибудь ID. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 18:30 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
krvsaРанее как-то писалось, что такое оптимальнее написать так Код: sql 1. 2.
Причем даже местами поменять Код: sql 1. 2. 3. 4.
Дату меняла разным способом- не помогло. Остался изначальный вариант с >= и <= ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 18:34 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaДату меняла разным способом- не помоглоЕсли запрос работает правильно с between, лучше оставить его, чем с >=, <=vichkaКак мне показать вам планы запросов? Скопировать и вставить здесь как текст или как?Да, давайте сюда как текст. Но хотелось бы сперва узнать: Вы мои и других участников варианты пробовали? Потому что я до сих пор вижу у Вас like '%'. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 18:52 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaИзвините за поздний ответ. Как мне показать вам планы запросов? Скопировать и вставить здесь как текст или как? Я прицепила ранее файл, кто-то сказал, что не все видно- это все что было, за исключением самих записей. Как мне тогда вам их предоставить?это я просто, слишком быстро просмотрел не заметил что там все верно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 19:11 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
АленочкаВопросы к автору : ResponseText берется из таблицы ResponseArchive? или MessageArchive? ResponseText берется из таблицы ResponseArchive. Ниже привела пример с полным названием полей. Аленочкапосмотрите раздел Query Optimization Options , в частности %NOFLATTEN и использование этой опции в подзапросах http://docs.intersystems.com/cache20081/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_from#RSQL_C22222 Пробовала с %NOFLATTEN - не лучше. Аленочкатак же думаю что вам могут помочь в форуме по MS SQL Server Про это тоже думала. Но не уверена- нюансы ли это Cache или SQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 19:24 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servit vichka , Статистику по таблицам собирали? Да, TUNE TABLE все время делаю. Это называется СТАТИСТИКА по-русски? Я даже не знала. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 19:27 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Блок А.Н.У вас проблема, что включается использование индекса по MobileNumber, каше считает его оптимальным, но ошибается. Да, я это тоже поняла. Причем видно как выдаются записи по очереди группами сначала все номера 35383, потом 35385, потом 35386, потом 35387, потом 35389 (когда медленно). А в быстром варианте они посортированы другим образом (не знаю как), и все записи сразу высвечиваются, без группировок. Это когда запрс запускается из Management Portal. Блок А.Н.1. использовать подсказку %Ignoreindices. Не факт, что получится, так как это часть первичного ключа. Да, не факт. Пробовала отключить индекс, все равно делает то же самое, из-за первичного ключа, как я поняла Блок А.Н.2. использовать конструкцию select from ( select ... ) where MobileNumber ... Тогда основной запрос не будет использовать индекс, а фильтрация будет уже в промежуточных результатах Пробовала. Не помогло. Выполняется быстрее может на пару секунд. Блок А.Н.3. Искорежить поле MobileNumber так, чтобы каше не поняла, что по нему можно использовать индекс Типа where string(MobileNumber) like '%..' Корежила- string(MobileNumber), LOWER(MobileNumber)- То же самое. Пожалуй, самое простое - третий вариант.[/quot] ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 19:48 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Вот если бы вы выложили исходный код задействованных классов, без методов, только значимое (свойства, индексы) и и подправили так чтобы мы могли сгенерировать тестовые данные и тогда кто нибудь здесь бы смог бы подобрать наиболее оптимальный вариант запроса и схемы данных ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 19:56 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servitНо хотелось бы сперва узнать: Вы мои и других участников варианты пробовали? Потому что я до сих пор вижу у Вас like '%'. Да, пробовала. MobileNumber IS NOT NULL works like a charm- 2 seconds! Только я что-то туплю- где мне это условие ставить, что textbox поле если пустое, то все номера выбирать Код: sql 1.
, а есле что-то там ввели, то это и передавать- 3538 например Код: sql 1.
Тогда это уже два запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 20:04 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichka, попробуйте выполнить мои рекомендации. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 20:08 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servitЯ хотел бы увидеть планы и результаты моих трёх вариантов: подзапрос The results of executing the SQL query are shown below: Last update: 2013-06-06 17:05:14.473 SQLCODE: 100 Row count: 565 Performance: 61.659 seconds 48494 global references The execution plan is displayed below: Query Text Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Query Plan Relative cost = 17836 ◾Call module B, which populates temp-file A. ◾Read temp-file A, looping on MobileNumber, ResponseDate, and ID. ◾For each row: Read master map Client.ResponseArchive.Primary, using the given idkey value. Read index map Client.MessageArchive.MobileNumber, using the given MobileNumber, and looping on ID. For each row: Read master map Client.MessageArchive.Primary, using the given idkey value. Output the row. module B ◾Read index map Client.ResponseArchive.ResponseDate, looping on ResponseDate (with a range condition), MobileNumber (with a %STARTSWITH range condition), and ResponseID. ◾For each row: Add a row to temp-file A, subscripted by MobileNumber, ResponseDate, and ID, with no node data. servit is not null The results of executing the SQL query are shown below: Last update: 2013-06-06 17:10:08.511 SQLCODE: 100 Row count: 565 Performance: 2.059 seconds 265349 global references The execution plan is displayed below: Query Text Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Query Plan Relative cost = 2593337 ◾Call module C, which populates temp-file A. ◾Read temp-file A, looping on MobileNumber, ResponseDate, and a counter. ◾For each row: Output the row. module C ◾Call module B, which populates temp-file B. ◾Read temp-file B, looping on ID. ◾For each row: Read master map Client.MessageArchive.Primary, using the given idkey value. Call module D, which populates temp-file C. Read temp-file C, using the given MobileNumber, and looping on ID. For each row: Read master map Client.ResponseArchive.Primary, using the given idkey value. Check distinct values for MobileNumber and ResponseID using a temp-file. For each distinct row: Add a row to temp-file A, subscripted by MobileNumber, ResponseDate, and a counter, with node data of ResponseID, ResponseText, [value], and [value]. module B ◾Read index map Client.MessageArchive.DateArchived, looping on DateArchived (with a range condition) and ID. ◾For each row: Add a row to temp-file B, subscripted by ID, with no node data. module D ◾Read index map Client.ResponseArchive.ResponseDate, looping on ResponseDate (with a range condition), MobileNumber, and ResponseID. ◾For each row: Add a row to temp-file C, subscripted by MobileNumber and ID, with no node data. servit [ The results of executing the SQL query are shown below: Last update: 2013-06-06 17:12:57.039 SQLCODE: 100 Row count: 565 Performance: 63.781 seconds 48496 global references The execution plan is displayed below: Query Text Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Query Plan Relative cost = 19776 ◾Call module B, which populates temp-file A. ◾Read temp-file A, looping on MobileNumber, ResponseDate, and ID. ◾For each row: Read master map Client.ResponseArchive.Primary, using the given idkey value. Read index map Client.MessageArchive.MobileNumber, using the given MobileNumber, and looping on ID. For each row: Read master map Client.MessageArchive.Primary, using the given idkey value. Output the row. module B ◾Read index map Client.ResponseArchive.ResponseDate, looping on ResponseDate (with a range condition), MobileNumber, and ResponseID. ◾For each row: Add a row to temp-file A, subscripted by MobileNumber, ResponseDate, and ID, with no node data. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 20:17 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Блок А.Н.vichka, попробуйте выполнить мои рекомендации. Блок А.Н., Пробовала- смотрите выше, описала... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 20:26 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
DAiMorВот если бы вы выложили исходный код задействованных классов, без методов, только значимое (свойства, индексы) ... Код: sql 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.
Код: sql 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. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 20:28 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaДа, пробовала. MobileNumber IS NOT NULL works like a charm- 2 seconds!Спасибо. vichkaТолько я что-то туплю- где мне это условие ставить, что textbox поле если пустое, то все номера выбирать <...> , а есле что-то там ввели, то это и передавать- 3538 например <...> Тогда это уже два запроса?Нет, можно в одном запросе: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 20:37 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servitНет, можно в одном запросе <...> Должна сказать, что этих LIKE '%' очень много во всех запросах. Например, оригинальный запрос, над которым я бьюсь: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Как мне его заменить, используя IS NOT NULL? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 20:57 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Тут не сказали про хранение данных в индексе, что тоже очень хорошо влияет на скорость например Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 21:21 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaДа, TUNE TABLE все время делаю. Это называется СТАТИСТИКА по-русски? Я даже не знала.Да я тоже не местный, но судя по ... vichkaДолжна сказать, что этих LIKE '%' очень много во всех запросах. Не проблема заменить их все, там где это нужно. Например: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Хорошо бы, чтобы все поля, по которым ведётся поиск или соединение, были проиндексированы. Возможно, здесь на некоторые из них не помешали бы bitmap-индексы. Но пока попробуйте просто запрос поменять (и с/без %NOTOPOPT). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2013, 22:27 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servitА у Вас в Ирландии как это называют? А так и говорят- DO Tune the table. OR: DID you Tune the Table? servitХорошо бы, чтобы все поля, по которым ведётся поиск или соединение, были проиндексированы. Да, я их все проиндексировала (см. выше начало классов с полями и индексами) servitНо пока попробуйте просто запрос поменять (и с/без %NOTOPOPT). Попробовала. Все равно же приходится ставить '%': %NOTOPOPT: The results of executing the SQL query are shown below: Last update: 2013-06-07 09:50:57.582 SQLCODE: 100 Row count: 557 Performance: 11.608 seconds 267469 global references The execution plan is displayed below: Query Text: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Query Plan Relative cost = 16822 ◾Read index map Client.ResponseArchive.ResponseDate, looping on ResponseDate (with a range condition), MobileNumber (with a %STARTSWITH range condition), and ResponseID. ◾For each row: Read master map Client.ResponseArchive.Primary, using the given idkey value. Read index map Client.MessageArchive.MobileNumber, using the given MobileNumber, and looping on ID. For each row: Read master map Client.MessageArchive.Primary, using the given idkey value. Check distinct values for MobileNumber, %SQLUPPER(ResponseText), and ResponseDate using a temp-file. For each distinct row: Output the row. ------------------------------------- without %NOTOPOPT: The results of executing the SQL query are shown below: Last update: 2013-06-07 09:52:40.191 SQLCODE: 100 Row count: 557 Performance: 59.436 seconds 42768 global references The execution plan is displayed below: Query Text Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Query Plan Relative cost = 5816.2 ◾Read index map Client.ResponseArchive.ResponseDate, looping on ResponseDate (with a range condition), MobileNumber (with a %STARTSWITH range condition), and ResponseID. ◾For each row: Read master map Client.ResponseArchive.Primary, using the given idkey value. Read index map Client.MessageArchive.MobileNumber, using the given MobileNumber, and looping on ID. For each row: Read master map Client.MessageArchive.Primary, using the given idkey value. Check distinct values for MobileNumber, %SQLUPPER(ResponseText), and ResponseDate using a temp-file. For each distinct row: Output the row. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2013, 12:56 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaПопробовала. Все равно же приходится ставить '%':Передавайте null , если нужно выбрать всё, а не '%'. Если же '%' зашит в клиенте и это уже не изменить, то немного измените условие: вместо Код: sql 1.
поставьте Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2013, 13:20 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servitЕсли же '%' зашит в клиенте и это уже не изменить... Я тестирую эти запросы в WinSQL. Поэтому ставлю '%' , как вызывается из .NET. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2013, 13:53 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
[quot servit] Передавайте null , если нужно выбрать всё, а не '%'. [quot] Ура! Получилось! Никак не могла врубиться в этот NULL ! SHOW PLAN: The results of executing the SQL query are shown below: Last update: 2013-06-07 11:59:06.554 SQLCODE: 100 Row count: 557 Performance: 1.667 seconds 267469 global references Query Text Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Query Plan Relative cost = 2540116 ◾Call module C, which populates temp-file A. ◾Read temp-file A, looping on ResponseDate and a counter. ◾For each row: Output the row. module C ◾Call module B, which populates temp-file B. ◾Read temp-file B, looping on ID. ◾For each row: Read master map Client.MessageArchive.Primary, using the given idkey value. Call module D, which populates temp-file C. Call module E, which populates temp-file D. Read temp-file D, using the given MobileNumber, and looping on ID. For each row: Check distinct values for MobileNumber, %SQLUPPER(ResponseText), and ResponseDate using a temp-file. For each distinct row: Add a row to temp-file A, subscripted by ResponseDate and a counter, with node data of MobileNumber, %SQLUPPER(ResponseText), [value], and [value]. module B ◾Read index map Client.MessageArchive.DateArchived, looping on DateArchived (with a range condition) and ID. ◾For each row: Add a row to temp-file B, subscripted by ID, with no node data. module D ◾Read index map Client.ResponseArchive.ResponseDate, looping on ResponseDate (with a range condition), MobileNumber, and ResponseID. ◾For each row: Add a row to temp-file C, subscripted by ID, with no node data. module E ◾Read temp-file C, looping on ID. ◾For each row: Read master map Client.ResponseArchive.Primary, using the given idkey value. Add a row to temp-file D, subscripted by MobileNumber and ID, with node data of ResponseDate and %SQLUPPER(ResponseText). ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2013, 15:06 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
DAiMorТут не сказали про хранение данных в индексе, что тоже очень хорошо влияет на скорость например Код: sql 1.
Как это? Вместо: Код: sql 1.
вот это: Код: sql 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2013, 15:12 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaDAiMorТут не сказали про хранение данных в индексе, что тоже очень хорошо влияет на скорость например Код: sql 1.
Как это? Вместо: Код: sql 1.
вот это: Код: sql 1.
? Нет именно так как я и написал, это значит что если будут необходимы данные например для выборки или для выполнения дополнительных условий, то для того чтобы он их не искал в другом месте, данные будут сохранены в индекс, они будут не проиндексированы а сохранены вместе с индексом ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2013, 15:18 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
DAiMor...Нет именно так как я и написал, это значит что если будут необходимы данные например для выборки или для выполнения дополнительных условий, то для того чтобы он их не искал в другом месте, данные будут сохранены в индекс, они будут не проиндексированы а сохранены вместе с индексом Я попробовала запустить старый запрос с новым индексом- не помогло. Зато когда заменила MobileNumber с '%' на MobileNumber с NULL , быстродействие значительно возросло! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2013, 17:57 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Спасибо всем за подсказки и оеративную помощь! Отдельное огромное спасибо SERVIT ! WRC отдыхает! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2013, 17:59 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
И последний вопрос- как мне заменить остальные , если там значения или выбранные из dropdownlist, a не из textbox как MobileNumber, или же все существующие? Так, если все записи, то заменить условия типа: Код: sql 1.
на: Код: sql 1.
--------------------------------- а если что-то выбрано, то вместо: Код: sql 1.
будет: Код: sql 1.
Запустила- особой разницы не увидела. Стоит ли заменять? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2013, 18:37 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaкак мне заменить остальные , если там значения или выбранные из dropdownlist, a не из textbox1) если требуется проверка на полное соответствие, то лучше вовсе отказаться от Like в пользу = 2) если под всеми понимается Null , то да - можно заменитьvichkaЗапустила- особой разницы не увидела. Стоит ли заменять?Сейчас, наверное, не стоит, но имейте в виду на будущее. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2013, 19:04 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Thanks very much, SERVIT! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2013, 19:22 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Всем привет! Я опять застряла на одном из запросов. Все тот же продукт, на той же платформе. Упростила запрос до минимума: запрос 1: Код: sql 1. 2. 3. 4. 5. 6.
Возвращает 516 записей за 2.554 сек. Query Plan Relative cost = 723139 ◾Call module B. ◾Output the row. module B ◾Call module C, which populates temp-file A. ◾Call module D, which populates temp-file B. ◾Generate a stream of idkey values using the multi-index combination: ((temp-file A) INTERSECT (temp-file B)) ◾For each idkey value: Read master map Client.MessageArchive.Primary, using the given idkey value. Accumulate the count(ID). module C ◾Read index map Client.MessageArchive.DateArchived, looping on DateArchived (with a range condition) and ID. ◾For each row: Add a row to temp-file A, subscripted by ID, with no node data. module D ◾Read index map Client.MessageArchive.TemplateIDUsed, looping on %SQLUPPER(TemplateIDUsed) (with a %STARTSWITH range condition) and ID. ◾For each row: Add a row to temp-file B, subscripted by ID, with no node data. А этот запрос: запрос 2: Код: sql 1. 2. 3. 4. 5.
Возвращает 516 записей за 0.057 сек. Query Plan Relative cost = 1013388 ◾Call module B. ◾Output the row. module B ◾Call module C, which populates temp-file A. ◾Call module D, which populates temp-file B. ◾Generate a stream of idkey values using the multi-index combination: ((temp-file A) INTERSECT (temp-file B)) ◾For each idkey value: Read master map Client.MessageArchive.Primary, using the given idkey value. Accumulate the count(ID). module C ◾Read index map Client.MessageArchive.DateArchived, looping on DateArchived (with a range condition) and ID. ◾For each row: Add a row to temp-file A, subscripted by ID, with no node data. module D ◾Read index map Client.MessageArchive.IssuedBy, looping on IssuedBy (with a %STARTSWITH range condition) and ID. ◾For each row: Add a row to temp-file B, subscripted by ID, with no node data. Класс проиндексирован по всем этим полям (см. выше переписку). Как заставить работать идексацию? В Cache2013 можно было бы использовать %ALLINDEX. А в Cache2008? Или как можно по-другому оптимизировать запрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2013, 15:59 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichka , Код: sql 1. 2. 3. 4. 5. 6.
Можно было бы выключить индекс TemplateIDUsed , но, к сожалению, в 2008 версии недоступны %ALLINDEX и %IGNOREINDEX (или %IGNOREINDICES ), поэтому пробуйте варианты с подзапросом, например: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2013, 17:10 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servit vichka , Код: sql 1.
Плохая наследственность... Это то, что досталось от создателя проекта... Теперь вот пытаюсь оптимизировать ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2013, 20:23 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaЭто то, что досталось от создателя проекта... Теперь вот пытаюсь оптимизироватьЭто-то понятно. Непонятно, почему Вы эту конструкцию до сих пор оставляете, когдаservitНо лучше Like '%' заменить на is not null :АленочкаLike '%' - это использовать вообще не советую, жутко тормозная тема.vichkaЗато когда заменила MobileNumber с '%' на MobileNumber с NULL , быстродействие значительно возросло! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2013, 20:51 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
Кроме тогоДокументацияFor performance reasons, the predicate %STARTSWITH 'abc' is preferable to the equivalent predicate LIKE 'abc%' .Поэтому вместо Код: sql 1.
лучше Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2013, 11:01 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
О, как! %STARTSWITH - это оптимизированный в Cache %LIKE :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2013, 08:00 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
servit... vichkaЗапустила- особой разницы не увидела. Стоит ли заменять? Сейчас, наверное, не стоит, но имейте в виду на будущее... Поэтому оставила как есть, если запрос работает достаточно быстро. Запросов очень много, и параметров с LIKE в них предостаточно. А на будущее для себя учла! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2013, 12:53 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
У меня еще один вопрос. Нашла несоответствие в полях. Есть несколько классов, которые имеют однаковое поле MessageID. В трех классах оно объявлено как %Integer (это автосчетчик и Primary Key в одном из них- MessageArchive), а в одном, четвертом, как %String (ReceiptArchive), причем в этом же классе это поле стоит в Primary Key как MessageID || ReceiptResponseID. Я хотела поменять это поле на %Integer тоже. Можно ли это делать, если в этой таблице полно записей, или у меня все рухнет (хотя в тестовой системе вроде работает с замененным полем...)? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2013, 13:05 |
|
Помогите оптимизировать SQL запрос
|
|||
---|---|---|---|
#18+
vichkaМожно ли это делать, если в этой таблице полно записей, или у меня все рухнет?Раз Вы спрашиваете, то - нет, не стоит. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2013, 13:31 |
|
|
start [/forum/topic.php?all=1&fid=39&tid=1557136]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
131ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
76ms |
get tp. blocked users: |
1ms |
others: | 231ms |
total: | 481ms |
0 / 0 |