1 2 ► |
1С:Предприятие
:: 1С:Предприятие 8 общая
|
|
| ||
чувак 07.10.20 - 14:19 | Доброго дня!
Есть два запроса. Формируют одну и ту же таблицу. Но запрос2 в 3-4 раза быстрее формирует чем запрос1. По логике запрос1 быстрее должен формироваться. В чем подвох? Запрос1 = Новый Запрос; Запрос1.Текст = "ВЫБРАТЬ ЭСФ.СчетФактура КАК СчетФактура, ЭСФ.РегистрационныйНомер, ЭСФ.ПометкаУдаления ПОМЕСТИТЬ втЭСФ ИЗ Документ.ЭСФ КАК ЭСФ ГДЕ НЕ ЭСФ.Статус В (&СтатусОтозван) ИНДЕКСИРОВАТЬ ПО СчетФактура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РеализацияТоваровУслугТоварыПоГТД.НомерСтроки, РеализацияТоваровУслугТоварыПоГТД.ГТДДокумент КАК ГТДДокумент ПОМЕСТИТЬ ВТ_Документы ИЗ Документ.РеализацияТоваровУслуг.ТоварыПоГТД КАК РеализацияТоваровУслугТоварыПоГТД ГДЕ РеализацияТоваровУслугТоварыПоГТД.Ссылка = &Ссылка ИНДЕКСИРОВАТЬ ПО ГТДДокумент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДокументыСФ.НомерСтроки, ДокументыСФ.ГТДДокумент, ДокументыСФ.СФ, МАКСИМУМ(втЭСФ.РегистрационныйНомер) КАК РегистрационныйНомер ИЗ (ВЫБРАТЬ ВТ_Документы.НомерСтроки КАК НомерСтроки, ВТ_Документы.ГТДДокумент КАК ГТДДокумент, МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ ИЗ ВТ_Документы КАК ВТ_Документы ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование ГДЕ СчетФактураВыданныйДокументыОснования.Ссылка В (ВЫБРАТЬ втЭСФ.СчетФактура ИЗ втЭСФ КАК втЭСФ) СГРУППИРОВАТЬ ПО ВТ_Документы.НомерСтроки, ВТ_Документы.ГТДДокумент) КАК ДокументыСФ ЛЕВОЕ СОЕДИНЕНИЕ втЭСФ КАК втЭСФ ПО ДокументыСФ.СФ = втЭСФ.СчетФактура И (НЕ втЭСФ.ПометкаУдаления) СГРУППИРОВАТЬ ПО ДокументыСФ.ГТДДокумент, ДокументыСФ.НомерСтроки, ДокументыСФ.СФ" Запрос2 = Новый Запрос; Запрос2.Текст = "ВЫБРАТЬ РеализацияТоваровУслугТоварыПоГТД.НомерСтроки, РеализацияТоваровУслугТоварыПоГТД.ГТДДокумент КАК ГТДДокумент ПОМЕСТИТЬ ВТ_Документы ИЗ Документ.РеализацияТоваровУслуг.ТоварыПоГТД КАК РеализацияТоваровУслугТоварыПоГТД ГДЕ РеализацияТоваровУслугТоварыПоГТД.Ссылка = &Ссылка ИНДЕКСИРОВАТЬ ПО ГТДДокумент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДокументыСФ.НомерСтроки, ДокументыСФ.ГТДДокумент, ДокументыСФ.СФ, МАКСИМУМ(ЭСФ.РегистрационныйНомер) КАК РегистрационныйНомер ИЗ (ВЫБРАТЬ ВТ_Документы.НомерСтроки КАК НомерСтроки, ВТ_Документы.ГТДДокумент КАК ГТДДокумент, МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ ИЗ ВТ_Документы КАК ВТ_Документы ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование ГДЕ СчетФактураВыданныйДокументыОснования.Ссылка В (ВЫБРАТЬ ЭСФ.СчетФактура ИЗ Документ.ЭСФ КАК ЭСФ ГДЕ НЕ ЭСФ.Статус В (&СтатусОтозван)) СГРУППИРОВАТЬ ПО ВТ_Документы.НомерСтроки, ВТ_Документы.ГТДДокумент) КАК ДокументыСФ ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭСФ КАК ЭСФ ПО ДокументыСФ.СФ = ЭСФ.СчетФактура И (НЕ ЭСФ.ПометкаУдаления) И (НЕ ЭСФ.Статус В (&СтатусОтозван)) СГРУППИРОВАТЬ ПО ДокументыСФ.ГТДДокумент, ДокументыСФ.НомерСтроки, ДокументыСФ.СФ" | ||
Жан Пердежон 1 - 07.10.20 - 14:25 | оба запроса из серии: "слышал, что в 1С временные таблицы есть". тут они не нужны | ||
чувак 2 - 07.10.20 - 14:27 | (1) а когда они нужны? | ||
fisher 3 - 07.10.20 - 14:27 | Планы выполнения надо смотреть, чтобы понять за счет чего оптимизация.
Но максимальное использование временных таблиц (как часто советуют) - палка о двух концах. В общем случае это костыль - страховка от ошибок оптимизатора запросов. Особенно для постгри актуально. Потому что если оптимизатор запросов не лажает - то чем меньше временных таблиц, тем больше у него пространство для маневра и оптимизаций. | ||
чувак 4 - 07.10.20 - 14:28 | (3) Скуля под рукой нет. База файловая | ||
H A D G E H O G s 5 - 07.10.20 - 14:30 | Тут уместна цитата Эскобар, который из группы Бредор. | ||
GANR 6 - 07.10.20 - 14:30 | На формирование и индексирование ВТ время уходит. И ещё может реквизит ЭСФ.СчетФактура уже индексирован (или в критерии отбора включен)? Тогда здесь ВТ да ещё с индексированием как зонтик рыбке явно. | ||
чувак 7 - 07.10.20 - 14:31 | (6) Знаю. С ним ли без него - результат один и тот же | ||
fisher 8 - 07.10.20 - 14:31 | (4) Не отозванные ЭСФ - это большая выборка или маленькая? | ||
чувак 9 - 07.10.20 - 14:32 | (8) много, больше мильёна | ||
GANR 10 - 07.10.20 - 14:33 | (7) Результат один, время выполнения - разное, ибо в 1 случае бесполезную ВТ создаем. Что именно не понятно? | ||
fisher 11 - 07.10.20 - 14:34 | (9) Ну вот. А во втором случае условие могло отработать "наоборот" - искать небольшое количество вхождений в большой таблице, не загоняя всю эту выборку во временную таблицу. | ||
чувак 12 - 07.10.20 - 14:35 | (10) Ну индексировать чтоб потом в другом запросе использовать при соединении. Или во временной таблице не надо ее? | ||
H A D G E H O G s 13 - 07.10.20 - 14:38 | (12) Конечно не надо | ||
GANR 14 - 07.10.20 - 14:38 | |||
fisher 15 - 07.10.20 - 14:39 | А нафига там вообще "В"? Почему не через соединение с ВЫРАЗИТЬ для получения статуса? | ||
GANR 16 - 07.10.20 - 14:40 | (15) +1 так сделать можно ещё ускорить | ||
fisher 17 - 07.10.20 - 14:42 | (16) Вряд ли. Скорее всего план выполнения будет похож для второго случая. Но шансов на правильный план выполнения в этом случае больше. | ||
чувак 18 - 07.10.20 - 14:43 | Еще один вопрос.
Вот здесь формируется быстро и 35 строк: ВЫБРАТЬ ВТ_Документы.НомерСтроки КАК НомерСтроки, ВТ_Документы.ГТДДокумент КАК ГТДДокумент, МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ ИЗ ВТ_Документы КАК ВТ_Документы ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование ГДЕ СчетФактураВыданныйДокументыОснования.Ссылка В (ВЫБРАТЬ ЭСФ.СчетФактура ИЗ Документ.ЭСФ КАК ЭСФ ГДЕ НЕ ЭСФ.Статус В (&СтатусОтозван)) СГРУППИРОВАТЬ ПО ВТ_Документы.НомерСтроки, ВТ_Документы.ГТДДокумент А здесь очень долго ВЫБРАТЬ ЭСФ.СчетФактура ИЗ Документ.ЭСФ КАК ЭСФ ГДЕ НЕ ЭСФ.Статус В (&СтатусОтозван) Получается здесь подзапрос эффективнее чем через времнную таблицу? | ||
fisher 19 - 07.10.20 - 14:44 | (18) Если скорость - критерий эффективности, то чем быстрее - тем эффективнее! Ваш кэп. | ||
trad 20 - 07.10.20 - 14:47 | (18) во втором, долгом запросе - скан всей таблицы
В первом, быстром - сик на запись ибо ЭСФ.СчетФактура скорее всего индексировано, как предполагают выше | ||
Uberschall 21 - 07.10.20 - 14:48 | мне кажется, без значения статистики (состояния базы) польза от такой темы ну разве что в поиске грубых ошибок, т.к. при разной статистике планы запросов могут быть разными.
т.е. получается какой-то сферический конь в ваккуме. по факту если есть проблема- смотришь план и разбираешь его. | ||
чувак 22 - 07.10.20 - 14:49 | (21) Возможно ли средствами 1с посмотреть план запроса? Или только скул? | ||
trad 23 - 07.10.20 - 14:50 | (18) первый запрос в плане выполнения вырождается в такое:
ИЗ ВТ_Документы КАК ВТ_Документы ВНУТР СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование ВНУТР СОЕДИНЕНИЕ Документ.ЭСФ КАК ЭСФ ПО СчетФактураВыданныйДокументыОснования.Ссылка = ЭСФ.СчетФактура И НЕ ЭСФ.Статус В (&СтатусОтозван) | ||
чувак 24 - 07.10.20 - 14:50 | (20) Т.е. если ЭСФ.СчетФактура не индексирован то в первом запросе тоже будет полное сканирование? | ||
Said_We 25 - 07.10.20 - 14:51 | А вот так:
ВЫБРАТЬ ВТ_Документы.НомерСтроки КАК НомерСтроки, ВТ_Документы.ГТДДокумент КАК ГТДДокумент, МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ ИЗ ВТ_Документы КАК ВТ_Документы ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ СчетФактураВыданныйДокументыОснования.Ссылка ,СчетФактураВыданныйДокументыОснования.ДокументОснование ИЗ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования ГДЕ СчетФактураВыданныйДокументыОснования.Ссылка В (ВЫБРАТЬ ЭСФ.СчетФактура ИЗ Документ.ЭСФ КАК ЭСФ ГДЕ НЕ ЭСФ.Статус В (&СтатусОтозван)) ) как СчетФактураВыданныйДокументыОснования ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование СГРУППИРОВАТЬ ПО ВТ_Документы.НомерСтроки, ВТ_Документы.ГТДДокумент | ||
trad 26 - 07.10.20 - 14:51 | (24) да | ||
Timon1405 27 - 07.10.20 - 14:52 | |||
Said_We 28 - 07.10.20 - 14:52 | |||
trad 29 - 07.10.20 - 14:52 | (24) зачем людям голову морочить? сложно посмотреть и ответить?? | ||
VladZ 30 - 07.10.20 - 14:54 | (0) Потому что голову нужно включать.
Тебе нужны СФ по указанным реализациям. Зачем ты выбираешь ВСЕ СФ? Порядок должен быть такой: 1. выбрать реализацию за период. 2. выбрать сф по указанным реализациям (с фильтром по статусу). 3. Собрать всё в кучу. Рекламное место пустует | ||
чувак 31 - 07.10.20 - 14:56 | (28) Тоже долго | ||
Said_We 32 - 07.10.20 - 14:57 | (31) Это понятно. Но в сравнении с 18 обоими как? | ||
чувак 33 - 07.10.20 - 14:59 | (32) Первоначально первом запрос в среднем было 6-8 сек. во втором 1-2 сек. В твоем 5-6 | ||
Said_We 34 - 07.10.20 - 15:01 | |||
чувак 35 - 07.10.20 - 15:03 | (34) 0 | ||
Said_We 36 - 07.10.20 - 15:03 | НЕЕЕЕ сравнивай с (18) | ||
Said_We 37 - 07.10.20 - 15:07 | Ещё вопрос. В//*** не пробовал кусочек добавить? ИЗ ВТ_Документы КАК ВТ_Документы ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ... ИЗ Документ.СчетФактураПолученный.ДокументыОснования ГДЕ СчетФактураВыданныйДокументыОснования.Ссылка В (...) //********************************** И СчетФактураВыданныйДокументыОснования.ДокументОснование в ( ВЫБРАТЬ ВТ_Документы.ГТДДокумент КАК ГТДДокумент, ИЗ ВТ_Документы КАК ВТ_Документы ) //********************************** ) как СчетФактураВыданныйДокументыОснования | ||
чувак 38 - 07.10.20 - 15:09 | Ок, всем спасибо. Попробую варианты | ||
Said_We 39 - 07.10.20 - 15:09 | У тебя основная таблица ВТ_Документы. К ней ты цепляешь другую таблицу, связывая по некому полю. Так возьми сразу только те, которые входят в значение этого поля. | ||
чувак 40 - 07.10.20 - 15:10 | (39) ок, попробую | ||
Said_We 41 - 07.10.20 - 15:11 | И условие тоже можно поменять. Сначала то что в//**** максимально обрежет множество, а потом уточняющее условие на ГДЕ СчетФактураВыданныйДокументыОснования.Ссылка В (...).
По идее должно быть одинаково, но бывают случаи, что не одинаково. | ||
чувак 42 - 07.10.20 - 15:23 | дааа, стыдно на мою седую голову )))) | ||
Said_We 43 - 07.10.20 - 15:27 | ВЫБРАТЬ
РеализацияТоваровУслугТоварыПоГТД.НомерСтроки, РеализацияТоваровУслугТоварыПоГТД.ГТДДокумент КАК ГТДДокумент ПОМЕСТИТЬ ВТ_Документы ИЗ Документ.РеализацияТоваровУслуг.ТоварыПоГТД КАК РеализацияТоваровУслугТоварыПоГТД ГДЕ РеализацияТоваровУслугТоварыПоГТД.Ссылка = &Ссылка ИНДЕКСИРОВАТЬ ПО ГТДДокумент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СчетФактураВыданныйДокументыОснования.Ссылка ,СчетФактураВыданныйДокументыОснования.ДокументОснование ПОМЕСТИТЬ ВТ_СФ ИЗ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования ГДЕ СчетФактураВыданныйДокументыОснования.ДокументОснование В (ВЫБРАТЬ Т.ГТДДокумент ИЗ ВТ_Документы КАК Т ) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЭСФ.СчетФактура КАК СчетФактура, ЭСФ.РегистрационныйНомер, ЭСФ.ПометкаУдаления ПОМЕСТИТЬ втЭСФ ИЗ Документ.ЭСФ КАК ЭСФ ГДЕ ЭСФ.СчетФактура в (ВЫБРАТЬ Т.Ссылка ИЗ ВТ_СФ КАК Т) И (НЕ ЭСФ.ПометкаУдаления) И НЕ ЭСФ.Статус В (&СтатусОтозван) ИНДЕКСИРОВАТЬ ПО СчетФактура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДокументыСФ.НомерСтроки,ДокументыСФ.ГТДДокумент, ДокументыСФ.СФ, МАКСИМУМ(ЭСФ.РегистрационныйНомер) КАК РегистрационныйНомер ИЗ (ВЫБРАТЬ ВТ_Документы.НомерСтроки КАК НомерСтроки, ВТ_Документы.ГТДДокумент КАК ГТДДокумент, МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ ИЗ ВТ_Документы КАК ВТ_Документы ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СФ КАК СчетФактураВыданныйДокументыОснования ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование СГРУППИРОВАТЬ ПО ВТ_Документы.НомерСтроки, ВТ_Документы.ГТДДокумент ) КАК ДокументыСФ ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭСФ КАК ЭСФ ПО ДокументыСФ.СФ = ЭСФ.СчетФактура СГРУППИРОВАТЬ ПО ДокументыСФ.ГТДДокумент, ДокументыСФ.НомерСтроки, ДокументыСФ.СФ | ||
Said_We 44 - 07.10.20 - 15:28 | Что-то скопировалось не всё....
Посмотри на английские и русские буквы, мог напортачить. Ну так по мелочи.... ВЫБРАТЬ РеализацияТоваровУслугТоварыПоГТД.НомерСтроки, РеализацияТоваровУслугТоварыПоГТД.ГТДДокумент КАК ГТДДокумент ПОМЕСТИТЬ ВТ_Документы ИЗ Документ.РеализацияТоваровУслуг.ТоварыПоГТД КАК РеализацияТоваровУслугТоварыПоГТД ГДЕ РеализацияТоваровУслугТоварыПоГТД.Ссылка = &Ссылка ИНДЕКСИРОВАТЬ ПО ГТДДокумент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СчетФактураВыданныйДокументыОснования.Ссылка ,СчетФактураВыданныйДокументыОснования.ДокументОснование ПОМЕСТИТЬ ВТ_СФ ИЗ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования ГДЕ СчетФактураВыданныйДокументыОснования.ДокументОснование В (ВЫБРАТЬ Т.ГТДДокумент ИЗ ВТ_Документы КАК Т ) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЭСФ.СчетФактура КАК СчетФактура, ЭСФ.РегистрационныйНомер, ЭСФ.ПометкаУдаления ПОМЕСТИТЬ втЭСФ ИЗ Документ.ЭСФ КАК ЭСФ ГДЕ ЭСФ.СчетФактура в (ВЫБРАТЬ Т.Ссылка ИЗ ВТ_СФ КАК Т) И (НЕ ЭСФ.ПометкаУдаления) И НЕ ЭСФ.Статус В (&СтатусОтозван) ИНДЕКСИРОВАТЬ ПО СчетФактура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДокументыСФ.НомерСтроки,ДокументыСФ.ГТДДокумент, ДокументыСФ.СФ, МАКСИМУМ(ЭСФ.РегистрационныйНомер) КАК РегистрационныйНомер ИЗ (ВЫБРАТЬ ВТ_Документы.НомерСтроки КАК НомерСтроки, ВТ_Документы.ГТДДокумент КАК ГТДДокумент, МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ ИЗ ВТ_Документы КАК ВТ_Документы ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СФ КАК СчетФактураВыданныйДокументыОснования ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование СГРУППИРОВАТЬ ПО ВТ_Документы.НомерСтроки, ВТ_Документы.ГТДДокумент ) КАК ДокументыСФ ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭСФ КАК ЭСФ ПО ДокументыСФ.СФ = ЭСФ.СчетФактура СГРУППИРОВАТЬ ПО ДокументыСФ.ГТДДокумент, ДокументыСФ.НомерСтроки, ДокументыСФ.СФ | ||
Said_We 45 - 07.10.20 - 15:29 | Результат отпишись. Интересно же. | ||
чувак 46 - 07.10.20 - 15:37 | |||
чувак 47 - 07.10.20 - 15:42 | респект! спасибо! ознакомлюсь с твоим запросом на досуге | ||
hhhh 48 - 07.10.20 - 15:48 | (46) вообще-то еще из-за кеша может быть. Если запустить 2 идентичных запроса, то 2-й запрос обычно выполняется в 10 раз быстрее, чем первый. Потому что он использует кеш после первого запроса. | ||
Said_We 49 - 07.10.20 - 15:51 | (47) Не за что.
Это не мой запрос, а твой :-) Просто не вдумываясь, что он там делает и какая структура данных он был немного переписан. Если структуру глянуть, где и какие индексы, то возможно можно ещё быстрее. В данном случае изначально не оптимально был сделан сам запрос. | ||
чувак 50 - 07.10.20 - 15:52 | (49) Вообщето запрос не мой тоже )) Дали мне просьбу оптимизировать ) | ||
Said_We 51 - 07.10.20 - 15:53 | :-)
Везет же кому-то!!! :-) | ||
чувак 52 - 07.10.20 - 15:56 | (44) Можешь объяснить такой нюанс?
Ф.СчетФактура в (ВЫБРАТЬ Т.Ссылка ИЗ ВТ_СФ КАК Т) И (НЕ ЭСФ.ПометкаУдаления) И НЕ ЭСФ.Статус В (&СтатусОтозван)ЭС вот этот "И НЕ ЭСФ.Статус В (&СтатусОтозван)" будет сканировать уже отобранные ЭСФшки? Если был бы так, то замедлился бы? НЕ ЭСФ.Статус В (&СтатусОтозван) И (НЕ ЭСФ.ПометкаУдаления) И ЭСФ.СчетФактура в (ВЫБРАТЬ Т.Ссылка ИЗ ВТ_СФ КАК Т) | ||
чувак 53 - 07.10.20 - 16:05 | (44) И еще. Третий пакет вроде нигде не используется. Странно | ||
чувак 54 - 07.10.20 - 16:08 | 3-й пакет убрал, три раза быстрее стало | ||
Said_We 55 - 07.10.20 - 16:11 | Вместо ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭСФ КАК ЭСФ ПО ДокументыСФ.СФ = ЭСФ.СчетФактура ЛЕВОЕ СОЕДИНЕНИЕ втЭСФ КАК ЭСФ ПО ДокументыСФ.СФ = ЭСФ.СчетФактура | ||
Said_We 56 - 07.10.20 - 16:12 | Это я забыл доисправлять... | ||
Said_We 57 - 07.10.20 - 16:16 | При создании "ВТ_СФ" необходимо добавить Индекс по полю "ДокументОснование"....
И т.д. Это примерный вариант, но ход мысли понятно думаю... | ||
Said_We 58 - 07.10.20 - 16:19 | А вообще если нужна производительность, то виртуальные таблицы лучше не использовать....
Но тогда будет малочитаемый код и копипаст сплошной. Виртуальные таблицы не сильно влияют на производительность, если они не большие. Тогда на производительность это сильно не повлияет. | ||
чувак 59 - 07.10.20 - 16:21 | (58) Имел ввиду временные таблицы? | ||
Said_We 60 - 07.10.20 - 16:23 | да Рекламное место пустует | ||
чувак 61 - 07.10.20 - 16:23 | ок, спасибо | ||
H A D G E H O G s 62 - 07.10.20 - 17:57 | (58) Настало время оуительных историй | ||
H A D G E H O G s 63 - 07.10.20 - 17:58 | (57) Индексы в ВТ не нужны. | ||
Жан Пердежон 64 - 07.10.20 - 18:49 | (58) иногда лучше ничего не писать | ||
Said_We 65 - 07.10.20 - 19:04 | |||
Said_We 66 - 08.10.20 - 09:23 | |||
H A D G E H O G s 67 - 08.10.20 - 09:49 | (66) Мой не ждать. Мне лениво в этой каше разбираться. | ||
Said_We 68 - 08.10.20 - 11:17 | (67) Тогда каков вклад в пользу дела? | ||
H A D G E H O G s 69 - 08.10.20 - 11:35 | (68) Покритиковать глупые высказывания. | ||
trad 70 - 08.10.20 - 12:58 | |||
H A D G E H O G s 71 - 08.10.20 - 13:23 | (70) Давай, расскажи, как ты юудешь использовать индексы в ВТ | ||
trad 72 - 08.10.20 - 13:31 | (71) Мне лениво | ||
H A D G E H O G s 73 - 08.10.20 - 13:34 | (72) Ну значит ваш удел прозябать в невежестве. | ||
Said_We 74 - 08.10.20 - 13:57 | (71), (72)
А мне не лень. Ниже запрос с закомментированным индексом. Выполнить можно на любой базе - от данных не зависит. Без интекса у меня выполняется 3 сек. С индексом 1 сек. (71) Давай расскажи почему так? ВЫБРАТЬ
0 КАК А
ПОМЕСТИТЬ ВТ_Два
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ ВСЕВЫБРАТЬ 2 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 11 ВТ_Два.А * 3 + ВТ_Два1.А * 2 + ВТ_Два2.А КАК А ПОМЕСТИТЬ ВТ_Десять ИЗ ВТ_Два КАК ВТ_Два, ВТ_Два КАК ВТ_Два1, ВТ_Два КАК ВТ_Два2 УПОРЯДОЧИТЬ ПО А ; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ ВТ_Два ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 5000 ВТ_Десять3.А * 1000 + ВТ_Десять2.А * 100 + ВТ_Десять1.А * 10 + ВТ_Десять.А КАК А ПОМЕСТИТЬ ВТ_1000 ИЗ ВТ_Десять КАК ВТ_Десять, ВТ_Десять КАК ВТ_Десять1, ВТ_Десять КАК ВТ_Десять2, ВТ_Десять КАК ВТ_Десять3 УПОРЯДОЧИТЬ ПО А ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_1000.А КАК А, ДОБАВИТЬКДАТЕ(&ДатаН, ДЕНЬ, ВТ_1000.А) КАК Дата ПОМЕСТИТЬ ВТ_Даты ИЗ ВТ_1000 КАК ВТ_1000 //ИНДЕКСИРОВАТЬ ПО // А, // Дата ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ т1.А КАК А, т1.Дата КАК Дата, т2.А КАК А1, т2.Дата КАК Дата1 ИЗ ВТ_Даты КАК т1 ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Даты КАК т2 ПО т1.А <= т2.А И т1.Дата >= т2.Дата | ||
Said_We 75 - 08.10.20 - 13:59 | К (74) "Без интекса у меня выполняется 3 сек. С индексом 1 сек." - это когда десяток раз запускаешь с индексом и десяток раз без индекса и в перемешку по нескольку раз. Для чистоты эксперимента. | ||
H A D G E H O G s 76 - 08.10.20 - 14:16 | (74) Потому что используется индекс. В этом уникальном случае. | ||
H A D G E H O G s 77 - 08.10.20 - 14:23 | Но когда ты соединяешь свою 'относительно' небольшую временную таблицу с большой физической, то индекс временной таблицы использоваться не будет. В лучшем случае используется индекс физической таблицы и !порядок! записей временной таблицы. | ||
trad 78 - 08.10.20 - 14:37 | (77) и почему же в запросе ниже индекс ВТ использоваться не будет (если бы он был)
ИЗ Документ.ЭСФ КАК ЭСФ ГДЕ ЭСФ.СчетФактура в (ВЫБРАТЬ Т.Ссылка ИЗ ВТ_СФ КАК Т) | ||
trad 79 - 08.10.20 - 14:40 | (78) + или в таком
ИЗ ВТ_Документы КАК ВТ_Документы ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СФ КАК СчетФактураВыданныйДокументыОснования ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование | ||
H A D G E H O G s 80 - 08.10.20 - 14:40 | (78) Потому что, чтобы использовался индекс, надо, чтобы каждый документ ЭСФ поискал своим полем в таблице ВТ_СФ
Нужно перебрать все документы ЭСФ | ||
trad 81 - 08.10.20 - 14:41 | |||
H A D G E H O G s 82 - 08.10.20 - 14:42 | (79) В таком, если записей мало, то проще обойти весь индекс (indexscan) через mergejoin. А если записей много - то вы сами себе злые буратины пихать большие куски в ВТ.
Это у вас сейчас, в спокойной системе ВТ и индексы строятся махом, вы попробуйте в нагруженной. | ||
Said_We 83 - 08.10.20 - 14:43 | (76) В (63) вы написали "Индексы в ВТ не нужны."А тут оказывается нужны. | ||
trad 84 - 08.10.20 - 14:44 | (80) справедливо, если знаем, что есть индекс ЭСФ.СчетФактура | ||
trad 85 - 08.10.20 - 14:48 | (82) а mergejoin по вашему святым духом питается?
Вообще то, для его выполнения, нужно для начала два источника упорядочить. За сколько то и где то. | ||
Said_We 86 - 08.10.20 - 14:50 | (82) Я это ещё в (58) написал. Но в данном случае в (0) просил найти узкое место. В самом запросе их хватало. На выходе ВТ не большие будут - в разрезе ТЧ с ГТД по одному документу. Это не большие ВТ. Так что большой потери производительности тут не будет и что бы понять в чем узкое место вполне достаточно оставить ВТ, что бы не путать сложными конструкциями.
А вам бы только покритиковать, вместо того что бы применить свои знания с пользой дела. Как-то так получается. :-( (0) Вам сильно помогла критика "H A D G E H O G s" и "Жан Пердежон"? | ||
trad 87 - 08.10.20 - 14:51 | (85) поэтому, лучше вместо условно двух наборов упорядочивающих служебных данных (индексов по сути), один индекс и лупджойн по нему | ||
H A D G E H O G s 88 - 08.10.20 - 14:53 | (85) СОртировка проще индексации, так как индексация включает в себя сортировку. | ||
H A D G E H O G s 89 - 08.10.20 - 14:54 | (87) Нет, не индексов по сути, а сортировок. | ||
trad 90 - 08.10.20 - 14:56 | (88) а я бы сказал наоборот: сортировка включает в себя индексацию, если сортировка не предполагает перестановку записей источника. | ||
H A D G E H O G s 91 - 08.10.20 - 14:57 | SQL, кстати, вполне себе сам выполнит сортировку, если захочет сделать merge. Но, тут можно оказать медвежью услугу, когда SQL не хотел делать merge, а у него на входе отсортированная таблица (не особо важно, через Индекс или через Упорядочить). | ||
H A D G E H O G s 92 - 08.10.20 - 14:58 | (90) Сортировка строит и хранит копию части данных в B+ дереве? Я все правильно вас понял? | ||
trad 93 - 08.10.20 - 14:58 | (91) "SQL, кстати, вполне себе сам выполнит сортировку, если захочет сделать merge" да, именно. И это нифига не дешево | ||
H A D G E H O G s 94 - 08.10.20 - 14:59 | (93) Но дешевле индексации | ||
H A D G E H O G s 95 - 08.10.20 - 15:02 | (84) есть или нет индекса в ЭСФ.СчетФактура - это не важно. Важно, что индекс в ВТ_СФ в лучшем случае будет использоваться в mergejoin как источник упорядоченных данных и может подтолкнуть SQL к mergejoin вместо nestedloop. | ||
trad 96 - 08.10.20 - 15:03 | (95) нет, индекс в ВТ_СФ как раз подтолкнет SQL к nestedloop вместо mergejoin | ||
trad 97 - 08.10.20 - 15:04 | (96) + повторю. в случае отсутствия индекса ЭСФ.СчетФактура. И это важно | ||
чувак 98 - 08.10.20 - 15:07 | (86) Помог только твой лайфхак | ||
H A D G E H O G s 99 - 08.10.20 - 15:08 | (96) Будет цикл, для каждой записи таблицы документа ЭСФ, будет искаться соответствующая запись в ВТ по ее индексу? Я правильно понял? | ||
trad 100 - 08.10.20 - 15:10 | (92) нет, сортировка - выстраивание идентификаторов записей источник в нужном порядке.
Например: имеем источник И1 - много записей, и И2 - мало записей и И1 join И2 для мерджа нужно отсортировать и И1 и И2для лупа можно проиндексировать только И2, по И1 пройтись как есть выдергивая из И2 то что нужно |
1 2 ► |
Список тем форума
|