| 
    
        
     
     | 
    
  | 
чем заменить конструкцию подобно, ускорить запрос. | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        zladenuw    
     20.06.13 
            ✎
    13:21 
 | 
         
        есть такой запрос
  
        "ВЫБРАТЬ | Авто.Ссылка, | Авто.Кузов |ПОМЕСТИТЬ СписокФирм |ИЗ | Справочник.Авто КАК Авто |ГДЕ | Авто.Модель В ИЕРАРХИИ(&Модель) | |СГРУППИРОВАТЬ ПО | Авто.Ссылка, | Авто.Кузов |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СервисныеАкции.Авто, | СервисныеАкции.Дата, | СервисныеАкции.Источник, | СервисныеАкции.Выполнено, | СервисныеАкции.ТекстСообщения, | СервисныеАкции.Причина, | СервисныеАкции.НеВыполнено, | СервисныеАкции.ДатаВыполнения |ИЗ | РегистрСведений.СервисныеАкции КАК СервисныеАкции, | СписокФирм КАК СписокФирм |ГДЕ | ВЫБОР | КОГДА СервисныеАкции.Авто ССЫЛКА Справочник.Авто | ТОГДА СервисныеАкции.Авто = СписокФирм.Ссылка | ИНАЧЕ СервисныеАкции.Авто ПОДОБНО СписокФирм.Кузов | КОНЕЦ" если заменить подобно на равно, запрос выполняется за секунды 2. если подобно, очень при очень долго. как ускорить ?  | 
|||
| 
    1
    
        andreymongol82    
     20.06.13 
            ✎
    13:22 
 | 
         
        (0) "если заменить подобно на равно, запрос выполняется за секунды 2"     
         | 
|||
| 
    2
    
        zak555    
     20.06.13 
            ✎
    13:22 
 | 
         
        зачем тебе произведение таблиц СервисныеАкции и СписокФирм ?     
         | 
|||
| 
    3
    
        SanGvin    
     20.06.13 
            ✎
    13:23 
 | 
         
        Фигасе какое извращенное соединение таблиц!!!!     
         | 
|||
| 
    4
    
        zladenuw    
     20.06.13 
            ✎
    13:24 
 | 
         
        (2) там опятка. там список Авто :). которые есть в базе. и есть сервисные акции. где много разных авто. и при заезде авто нужно проверить или есть на него сервисная акция. по этому вин код храним строкой. если есть такой автомобиль то ссылка на авто     
         | 
|||
| 
    5
    
        zladenuw    
     20.06.13 
            ✎
    13:25 
 | 
         
        (3) а как правильно ?     
         | 
|||
| 
    6
    
        AaNnDdRrEeYy    
     20.06.13 
            ✎
    13:27 
 | 
         
        зачем тут вообще подобно?
  
        СервисныеАкции.Авто (это ссылка) ПОДОБНО СписокФирм.Кузов (и это ссылка) как поведет себя "подобно" если применять его к ссылкам?  | 
|||
| 
    7
    
        zladenuw    
     20.06.13 
            ✎
    13:27 
 | 
         
        (6)  СписокФирм.Кузов - строка кода     
         | 
|||
| 
    8
    
        SanGvin    
     20.06.13 
            ✎
    13:28 
 | 
         
        (5) через соединение     
         | 
|||
| 
    9
    
        SanGvin    
     20.06.13 
            ✎
    13:29 
 | 
         
        тогда зачем написал "СервисныеАкции.Авто ПОДОБНО СписокФирм.Кузов" ? Поле "Авто" - это ж ссылка     
         | 
|||
| 
    10
    
        zladenuw    
     20.06.13 
            ✎
    13:30 
 | 
         
        (9) не Ссылка. в (4) написал же. что если есть такой автомобиль в базе, то там ссылка. если нет то строка.     
         | 
|||
| 
    11
    
        AaNnDdRrEeYy    
     20.06.13 
            ✎
    13:30 
 | 
         
        у вин номеров последнии 6 цифр уникальны. от них прыгай. там можно не подобно применять а к подстроке на равно условие сделать     
         | 
|||
| 
    12
    
        zladenuw    
     20.06.13 
            ✎
    13:34 
 | 
         
        (11) попробую. хотя вроде нет. в каких то символах заложена модель. может по последнем найти,а вот первый ключ будет отличатся. или делать двойное условие с проверкой на равенство последних. если равно то смотрим весь код или так не взлетит ?     
         | 
|||
| 
    13
    
        SanGvin    
     20.06.13 
            ✎
    13:35 
 | 
         
        (10) ну в любом случае условия в соединение пиши, а не в где. И проверь, на сколько быстрее станет.
  
        ВЫБРАТЬ СервисныеАкции.ТвоеПоле1, СписокФирм.ТвоеПоле2 ИЗ РегистрСведений.СервисныеАкции КАК СервисныеАкции ЛЕВОЕ СОЕДИНЕНИЕ СписокФирм КАК СписокФирм ПО ВЫБОР КОГДА СервисныеАкции.Авто ССЫЛКА Справочник.Авто ТОГДА СервисныеАкции.Авто = СписокФирм.Ссылка ИНАЧЕ СервисныеАкции.Авто ПОДОБНО СписокФирм.Кузов КОНЕЦ еще идею из (11) попробуй, тоже ускорить должно процесс.  | 
|||
| 
    14
    
        GANR    
     20.06.13 
            ✎
    13:36 
 | 
         
        (0) Как угодно избавиться от этого ПОДОБНО - при таком сравнении индексы идут лесом и сканируется вся таблица (table scan), что и является тормозящей операцией в плане запроса.     
         | 
|||
| 
    15
    
        zladenuw    
     20.06.13 
            ✎
    13:37 
 | 
         
        (13) да так и сделал. жду вот. крутится запросы еще. все равно долго. только конструкция подобно и можно идти пить что то. в прошлый раз до 6 часов выполнялось. ужас.  может где то ограничение на самом сервере постгреса на объем запроса или это не при чем     
         | 
|||
| 
    16
    
        zladenuw    
     20.06.13 
            ✎
    13:38 
 | 
         
        (14) тогда проще в фоне ночью, обрабатывать этот регистр и убивать лишение символы в поле. и использовать конструкцию =     
         | 
|||
| 
    17
    
        SanGvin    
     20.06.13 
            ✎
    13:38 
 | 
         
        (15) значит, только через подстроку и условие на равенство     
         | 
|||
| 
    18
    
        SanGvin    
     20.06.13 
            ✎
    13:39 
 | 
         
        (16) а не проще "лишние символы" при вводе както контроллировать?     
         | 
|||
| 
    19
    
        GANR    
     20.06.13 
            ✎
    13:41 
 | 
         
        +(14) И еще, что будет если заменить ВЫБОР КОГДА в секции ГДЕ на ОБЪЕДИНИТЬ ВСЕ и 2 запроса с разными условиями соединения? Не побыстрее стало?
  
        (16) А может можно как-то методически решить вопрос - подогнать данные таким образом, чтобы эта самая операция = стала применима или вообще перейти на сравнение по Ссылке?  | 
|||
| 
    20
    
        GANR    
     20.06.13 
            ✎
    13:43 
 | 
         
        А нельзя ли как-то уменьшить размер левой или правой таблицы? Так, хоть и без индексов, но количество сравнений будет меньше.     
         | 
|||
| 
    21
    
        zladenuw    
     20.06.13 
            ✎
    13:43 
 | 
         
        (19) разделить выбор. выбрать где есть ссылка и вывести и отдельно где строка и так же вывести. попробую так поигратся     
         | 
|||
| 
    22
    
        GANR    
     20.06.13 
            ✎
    13:43 
 | 
         
        (20) В смысле, отфильтровать данные перед операцией соединения.     
         | 
|||
| 
    23
    
        zladenuw    
     20.06.13 
            ✎
    13:44 
 | 
         
        (22) так есть фильтр по авто. по определенному бренду. а вот в РС неа     
         | 
|||
| 
    24
    
        GANR    
     20.06.13 
            ✎
    13:46 
 | 
         
        (21) Да-да... И еще при сравнении по ПОДОБНО во второй таблице ОБЪЕДИНИТЬ ВСЕ надо-бы перед проверкой этого подобно убедиться, что в проверяемых полях именно строка ТИПЗНАЧЕНИЯ(СервисныеАкции.Авто) = ТИП(Строка), иначе - не проверять.     
         | 
|||
| 
    25
    
        GANR    
     20.06.13 
            ✎
    13:47 
 | 
         
        (24) хотя бы урежет количество проверок по ПОДОБНО     
         | 
|||
| 
    26
    
        zladenuw    
     20.06.13 
            ✎
    14:00 
 | 
         
        (25) а разве такое условие это не проверяет
  
        ВЫБОР КОГДА СервисныеАкции.Авто ССЫЛКА Справочник.Авто ТОГДА СервисныеАкции.Авто = СписокФирм.Ссылка ИНАЧЕ СервисныеАкции.Авто = СписокФирм.Кузов КОНЕЦ  | 
|||
| 
    27
    
        zladenuw    
     20.06.13 
            ✎
    14:16 
 | 
         
        и самое интересное то что если условие то быстрее 1668, а соединение 1751. хотя ведь соединение должно быть быстрее     
         | 
|||
| 
    28
    
        zladenuw    
     20.06.13 
            ✎
    14:19 
 | 
         
        ура.
  
        нашел как обмануть. так выполняет 0.94 ВЫБРАТЬ Авто.Ссылка, Авто.Кузов ПОМЕСТИТЬ СписокАвто ИЗ Справочник.Авто КАК Авто ГДЕ Авто.Модель В ИЕРАРХИИ(&Модель) СГРУППИРОВАТЬ ПО Авто.Ссылка, Авто.Кузов ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СервисныеАкции.Авто, СервисныеАкции.Дата, СервисныеАкции.Источник, СервисныеАкции.Выполнено, СервисныеАкции.ТекстСообщения, СервисныеАкции.Причина, СервисныеАкции.НеВыполнено, СервисныеАкции.ДатаВыполнения ИЗ СписокАвто КАК СписокФирм ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СервисныеАкции КАК СервисныеАкции ПО СписокФирм.Ссылка = СервисныеАкции.Авто ГДЕ СервисныеАкции.Авто ССЫЛКА Справочник.Авто ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ СервисныеАкции.Авто, СервисныеАкции.Дата, СервисныеАкции.Источник, СервисныеАкции.Выполнено, СервисныеАкции.ТекстСообщения, СервисныеАкции.Причина, СервисныеАкции.НеВыполнено, СервисныеАкции.ДатаВыполнения ИЗ РегистрСведений.СервисныеАкции КАК СервисныеАкции ВНУТРЕННЕЕ СОЕДИНЕНИЕ СписокАвто КАК СписокАвто ПО СервисныеАкции.Авто = СписокАвто.Кузов ГДЕ НЕ СервисныеАкции.Авто ССЫЛКА Справочник.Авто  | 
|||
| 
    29
    
        zladenuw    
     20.06.13 
            ✎
    14:26 
 | 
         
        (28) соврал по времени 0.094 :). а вот подобно все равно долго :(.     
         | 
|||
| 
    30
    
        zladenuw    
     20.06.13 
            ✎
    14:40 
 | 
         
        такой вопрос. сначала будет выполнена конструкция где или сначала соединение и потом где ?     
         | 
|||
| 
    31
    
        zladenuw    
     20.06.13 
            ✎
    15:15 
 | 
         
        можно идти отдыхать.
  
        литает запрос. с условием и конструкцией подобно по автомобилям до 1 секунды, без условия 3 секунды. ВЫБРАТЬ Авто.Ссылка, Авто.Кузов ПОМЕСТИТЬ СписокАвто ИЗ Справочник.Авто КАК Авто СГРУППИРОВАТЬ ПО Авто.Ссылка, Авто.Кузов ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СписокАкций.Авто, СписокАкций.Дата, СписокАкций.Источник, СписокАкций.Выполнено, СписокАкций.ТекстСообщения, СписокАкций.Причина, СписокАкций.НеВыполнено, СписокАкций.ДатаВыполнения ИЗ СписокАвто КАК СписокАвто ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ СервисныеАкции.Авто КАК Авто, СервисныеАкции.Дата КАК Дата, СервисныеАкции.Источник КАК Источник, СервисныеАкции.Выполнено КАК Выполнено, СервисныеАкции.ТекстСообщения КАК ТекстСообщения, СервисныеАкции.Причина КАК Причина, СервисныеАкции.НеВыполнено КАК НеВыполнено, СервисныеАкции.ДатаВыполнения КАК ДатаВыполнения ИЗ РегистрСведений.СервисныеАкции КАК СервисныеАкции ГДЕ СервисныеАкции.Авто ССЫЛКА Справочник.Авто И НЕ СервисныеАкции.Выполнено) КАК СписокАкций ПО СписокАвто.Ссылка = СписокАкций.Авто ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ СписокАкций.Авто, СписокАкций.Дата, СписокАкций.Источник, СписокАкций.Выполнено, СписокАкций.ТекстСообщения, СписокАкций.Причина, СписокАкций.НеВыполнено, СписокАкций.ДатаВыполнения ИЗ (ВЫБРАТЬ СервисныеАкции.Авто КАК Авто, СервисныеАкции.Дата КАК Дата, СервисныеАкции.Источник КАК Источник, СервисныеАкции.Выполнено КАК Выполнено, СервисныеАкции.ТекстСообщения КАК ТекстСообщения, СервисныеАкции.Причина КАК Причина, СервисныеАкции.НеВыполнено КАК НеВыполнено, СервисныеАкции.ДатаВыполнения КАК ДатаВыполнения ИЗ РегистрСведений.СервисныеАкции КАК СервисныеАкции ГДЕ СервисныеАкции.Авто ССЫЛКА Справочник.Авто И НЕ СервисныеАкции.Выполнено) КАК СписокАкций ВНУТРЕННЕЕ СОЕДИНЕНИЕ СписокАвто КАК СписокАвто ПО (СписокАкций.Авто ПОДОБНО СписокАвто.Кузов) Но есть вопрос к знатокам запросов. почему так работает быстрее, если использовать вложенные запросы ? чем можно увидеть какой запрос уходить на сервер субд ?  | 
|||
| 
    32
    
        GANR    
     21.06.13 
            ✎
    10:26 
 | 
         
        (0) А попробуй посмотреть на план запроса, предварительно выловив его в MS SQL Profiler и заменив параметры в запросе прямыми указаниями значений. Вообще, имхо, надо попросту перепроектировать структуру данных так, чтобы не было надобности в этих часто использующихся ПОДОБНО - эта операция без какого-то специализированного индекса полнотекстового поиска полюбому приведет к полному сканированию всей таблицы, да еще в цикле, если это соединение.     
         | 
|||
| 
    33
    
        GANR    
     21.06.13 
            ✎
    11:10 
 | 
||||
| 
    34
    
        GANR    
     21.06.13 
            ✎
    11:10 
 | 
||||
| 
    35
    
        GANR    
     21.06.13 
            ✎
    11:12 
 | 
         
        Выдержка из (33) 
  
        Избегать конструкции ПОДОБНО (LIKE) При работе с отборами удобно выполнять поиск контрагента не по наименованию, а путем установки отбора по условию «Содержит» по полю «Наименование». Однако это отрицательно сказывается на производительности из-за невозможности использования индексов и так приводит к запросам: ВЫБРАТЬ .. ИЗ Справочник.Контрагенты ГДЕ Наименование ПОДОБНО «%СтрокаПоиска%» В таком запросе будет выполнен полный перебор всех записей таблицы. Это отрицательно сказывается на производительности. П р и м е ч а н и е. В последних версиях MS SQL Server LIKE стал уметь в некоторых случаях использовать поиск, но это все равно не лучший оператор. Так что, возможно MS SQL 2008 - 2013 спасут ситуацию без реструктуризаций данных.  | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |