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