|   |   | 
| 
 | v7: маленький SQL-эксперимент | ☑ | ||
|---|---|---|---|---|
| 0
    
        ADirks 19.11.13✎ 12:27 | 
        Оказывается, задавать условие константной строкой прямо в тексте запроса выгоднее, чем через временную таблицу.
 Экспериментировал на 2005, 10000 значений соотношение 42 / 58 в пользу константного списка, и это не учитывая времени на создание таблички - чистое время SELECT'ов. Самое большое время в этом тесте ушло на формирование текста запроса :) Собственно, эксперимент: Процедура ДлинныйСписок() стр = ""; зпт = ""; Для н = 1 По 10000 Цикл //стр = стр + зпт + н; стр = стр + зпт + н; зпт = ","; КонецЦикла; ЗапросСКЛ.Выполнить(" |create table #t1(к1 int) |declare @k1 int |set @k1 = 1 |while @k1 <= 10000 |begin | insert into #t1 values (@k1) | set @k1 = @k1 + 1 |end | |"); тз = ЗапросСКЛ.ВыполнитьИнструкцию("Set NoCount ON |SELECT | ID [Эл $Справочник.Контрагенты] |FROM | спрКонтрагенты |WHERE | ROW_ID In ("+стр+") | | |SELECT | ID [Эл $Справочник.Контрагенты] |FROM | спрКонтрагенты |-- left join #t1 on [#t1].к1 = ROW_ID |WHERE |-- ROW_ID Is not Null | ROW_ID In (select к1 from #t1) |"); КонецПроцедуры Текст запроса потом профайлером выцепил, и в студии уже анализировал. | |||
| 1
    
        Sorm 19.11.13✎ 12:31 | 
        |WHERE
 |-- ROW_ID Is not Null | ROW_ID In (select к1 from #t1)) Чего-чего?? | |||
| 2
    
        ADirks 19.11.13✎ 12:32 | 
        (1) проверял варианты, они абсолютно эквивалентны     | |||
| 3
    
        1dvd 19.11.13✎ 12:33 | 
        Это каменты чтоли?
 
 | |||
| 4
    
        ADirks 19.11.13✎ 12:34 | 
        (3) да, для SQL     | |||
| 5
    
        ЧеловекДуши 19.11.13✎ 12:34 | 
        (0) Запрос в топку :)     | |||
| 6
    
        Sorm 19.11.13✎ 12:35 | 
        (0) Я не очень понял, нафига left c условием, если можно inner, и где индекс на временной таблице?     | |||
| 8
    
        Z1 19.11.13✎ 12:36 | 
        так потому что про константы оптимизатор все знает
 и учтет константы при созтавлении плана выполнения а про содержимое временной таблицы оптимизатор может только предполагать. Значительно улучшишь запрос с временной таблицей если создашь на ней индекс ( кластерный индекс ) | |||
| 9
    
        1dvd 19.11.13✎ 12:36 | 
        *каменты     | |||
| 10
    
        ADirks 19.11.13✎ 12:37 | 
        (8) кластерный? щас проверю     | |||
| 11
    
        ЧеловекДуши 19.11.13✎ 12:38 | 
        (0) А где проверка, что временная таблица уже создана? :)
 Пример: //Создает временную таблицу на SQL сервере //Параметры: // ИмяТаблицы - имя временной таблицы, имена локальных таблиц должны // начинаться с символа #, глобальных с ## // ПоляТаблицы - имена и типы полей таблицы // Функция глСоздатьВременнуюТаблицу(ИмяТаблицы,ПоляТаблицы) Экспорт //НЗ=глУстановитьНаборЗаписей(); НЗ = СоздатьОбъект("ODBCRecordSet"); попытка НЗ.УстБД1С(); Если глОтладкаSQL=1 Тогда НЗ.Отладка(); КонецЕсли; исключение глСообщить("Ошибка при создании объекта ""ODBCRecordSet"", обратитесь к системному адмнистратору!", "!"); Возврат 0; конецпопытки; ТекстЗапроса=" |if exists (select * from tempdb..sysobjects | where id = object_id('tempdb.."+ИмяТаблицы+"')) |drop table "+ИмяТаблицы+" |create table "+ИмяТаблицы+" ("+ПоляТаблицы+") |"; Если НЗ.Выполнить(ТекстЗапроса) = 0 Тогда глСообщить(НЗ.GetLastError(), "!"); НЗ.Закрыть(); Возврат 0; КонецЕсли; НЗ.Закрыть(); Возврат 1; КонецФункции | |||
| 12
    
        ЧеловекДуши 19.11.13✎ 12:38 | 
        (7) Там все однополое :)     | |||
| 13
    
        ADirks 19.11.13✎ 12:42 | 
        (8) в исходном варианте получилось 84 / 16
 но если select-лист сделать более приближенным к реальности SELECT ID [Эл $Справочник.Контрагенты], ИНН то получается 51 / 49 | |||
| 14
    
        Sorm 19.11.13✎ 12:44 | 
        (8) При таком объеме практически неважно:)
 (0) А так низзья? .... |SELECT | ID [Эл $Справочник.Контрагенты] |FROM | спрКонтрагенты | inner join #t1 on [#t1].к1 = ROW_ID | |||
| 15
    
        ADirks 19.11.13✎ 12:50 | 
        (14) что inner, что left & is not null, что in  - абсолютно без разницы     | |||
| 16
    
        Z1 19.11.13✎ 12:51 | 
        (14) Да дело не в объемах, а том что куча это одно
 а хороший индекс это другое. Хотя согласен стоит или нет что-то оптимизировать зависит от того что хочет узнать (0) Кстати текст запроса (14) будет давать другой результат от (1) если временная таблица допускает повторяющиеся элементы | |||
| 17
    
        КонецЦикла 19.11.13✎ 13:39 | 
        Когда-то пихал в строку дофига значений, но не мерял
 Смотря откуда брать, наверное Время на формирование текста запроса тоже надо учитывать :) | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |