Переключение на Главную Страницу Страницы: [1] 2 3 4 ОтправитьПечать
Очень популярная тема (более 25 ответов) Наилучший поиск по заданному номеру всех документов конкретного вида (sql) (число прочтений - 12655 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
28. Мая 2010 :: 09:06
Печать  
Задача найти среди документов конкретного вида все с заданным номеров по всему интервалу дат.
Ветка возникла на  мисте http://www.forum.mista.ru/topic.php?id=484193&page=1

Утвержалось не мной что наиболее оптимальный запрос получается так (проблема в том что qa показывает index seek )
Код
Выбрать все
SELECT    Жур.IDDoc,Жур.dnprefix
FROM _1SJourn as Жур
WHERE
Жур.DocNo = '18311' and Жур.IDDocDef  = 196
and   Жур.dnprefix > '	 196	  ' 




мое мнение что это неправильно и самый лучший способ решение этой задачи следующий
Код
Выбрать все
SELECT Жур.IDDoc,Жур.dnprefix
FROM _1SJourn as Жур
WHERE
Жур.DocNo = '18311' and Жур.IDDocDef  = 196
and   Жур.dnprefix = '	 1962004    '

union all

SELECT Жур.IDDoc,Жур.dnprefix
FROM _1SJourn as Жур
WHERE
Жур.DocNo = '18311' and Жур.IDDocDef  = 196
and   Жур.dnprefix = '	 1962005    '

union all

SELECT Жур.IDDoc,Жур.dnprefix
FROM _1SJourn as Жур
WHERE
Жур.DocNo = '18311' and Жур.IDDocDef  = 196
and   Жур.dnprefix = '	 1962006    '

union all

SELECT Жур.IDDoc,Жур.dnprefix
FROM _1SJourn as Жур
WHERE
Жур.DocNo = '18311' and Жур.IDDocDef  = 196
and   Жур.dnprefix = '	 1962007    '

union all

SELECT Жур.IDDoc,Жур.dnprefix
FROM _1SJourn as Жур
WHERE
Жур.DocNo = '18311' and Жур.IDDocDef  = 196
and   Жур.dnprefix = '	 1962008    '

union all

SELECT Жур.IDDoc,Жур.dnprefix
FROM _1SJourn as Жур
WHERE
Жур.DocNo = '18311' and Жур.IDDocDef  = 196
and   Жур.dnprefix = '	 1962009    '

union all

SELECT Жур.IDDoc,Жур.dnprefix
FROM _1SJourn as Жур
WHERE
Жур.DocNo = '18311' and Жур.IDDocDef  = 196
and   Жур.dnprefix = '	 1962010    ' 

  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #1 - 28. Мая 2010 :: 09:32
Печать  
Код
Выбрать все
SELECT    Жур.IDDoc,Жур.dnprefix
FROM _1SJourn as Жур
WHERE
Жур.dnprefix like '     196%' and
Жур.DocNo = '18311' 

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #2 - 28. Мая 2010 :: 09:37
Печать  
Также непонятно почему для запроса
Код
Выбрать все
SELECT
    Жур.IDDoc,Жур.dnprefix
FROM
_1SJourn as Жур
WHERE
Жур.dnprefix<>'' and Жур.DocNo = '18311' and Жур.IDDocDef  = 196 


получается план выполнения Index seek

  

12.JPG ( 88 KB | Загрузки )
12.JPG
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #3 - 28. Мая 2010 :: 09:40
Печать  
Тогда уже так:
Код
Выбрать все
SELECT Жур.IDDoc, Жур.dnprefix
FROM _1SJourn as Жур
WHERE Жур.DocNo = '18311' and Жур.IDDocDef  = 196
    and Жур.dnprefix IN ('	 1962004', '	 1962005', '	 1962006', '	 1962007', '	 1962008', '	 1962009', '	 1962010')
 



Но оригинатору, IMHO, хватило бы и того, что предложил alexdd.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #4 - 28. Мая 2010 :: 09:44
Печать  
Z1 писал(а) 28. Мая 2010 :: 09:37:
Также непонятно почему для запроса получается план выполнения Index seek

Что там непонятного? Обрати внимание на секцию where итератора index seek - оно, по сути, вырождается в скан.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #5 - 28. Мая 2010 :: 09:49
Печать  
я, кстати, не подумал..like может не прокатить, может же быть десятичный iddocdef 196 и, например, 19622 или типа того.
Z1,
лучше в профайлере статистику смотреть, а не план, там нагляднее.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #6 - 28. Мая 2010 :: 09:51
Печать  
alexdd писал(а) 28. Мая 2010 :: 09:32:
Код
Выбрать все
SELECT    Жур.IDDoc,Жур.dnprefix
FROM _1SJourn as Жур
WHERE
Жур.dnprefix like '     196%' and
Жур.DocNo = '18311' 


долго очень
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #7 - 28. Мая 2010 :: 09:54
Печать  
alexdd писал(а) 28. Мая 2010 :: 09:49:
я, кстати, не подумал..like может не прокатить, может же быть десятичный iddocdef 196 и, например, 19622 или типа того.

Там ещё значащие пробелы в начале строки. Подмигивание
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #8 - 28. Мая 2010 :: 10:01
Печать  
berezdetsky писал(а) 28. Мая 2010 :: 09:40:
Тогда уже так:
Код
Выбрать все
SELECT Жур.IDDoc, Жур.dnprefix
FROM _1SJourn as Жур
WHERE Жур.DocNo = '18311' and Жур.IDDocDef  = 196
    and Жур.dnprefix IN ('	 1962004', '	 1962005', '	 1962006', '	 1962007', '	 1962008', '	 1962009', '	 1962010')
 



Но оригинатору, IMHO, хватило бы и того, что предложил alexdd.

посмотрел в текстах у меня тоже написано через in ( если год один то вместо  in  пишу = )
(когда отвечал наа  мисте забыл детали и написал через union all )
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #9 - 28. Мая 2010 :: 10:03
Печать  
alexdd писал(а) 28. Мая 2010 :: 09:49:
я, кстати, не подумал..like может не прокатить, может же быть десятичный iddocdef 196 и, например, 19622 или типа того.
Z1,
лучше в профайлере статистику смотреть, а не план, там нагляднее.

статистика приведена в ветке на мисте
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #10 - 28. Мая 2010 :: 10:07
Печать  
оператор через union all из поста #0
и in из #8
время в qa ( справа внизу ) неразличимо
#0
0 1 0
#8
0 0 1

Перед каждым стартом обнулял кеш процедур и буфер данных.

PS Можно конечно и спецтаблицу сделать и inner join вместо in
но нет смысла так уже "оптимизировать" для этой задачи.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #11 - 28. Мая 2010 :: 10:09
Печать  
berezdetsky писал(а) 28. Мая 2010 :: 09:54:
alexdd писал(а) 28. Мая 2010 :: 09:49:
я, кстати, не подумал..like может не прокатить, может же быть десятичный iddocdef 196 и, например, 19622 или типа того.

Там ещё значащие пробелы в начале строки. Подмигивание

да пробелы при copy  paste преобразовались в табуляцю
'7пробелов196...'
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #12 - 28. Мая 2010 :: 10:09
Печать  
ну фз, вариант с like выигрывает у меня по количеству Reads(116), для первого варианта Reads = 132, для варианта с union all - 744, по CPU все одинаково. Но у меня 2000й сервер..
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #13 - 28. Мая 2010 :: 10:13
Печать  
Z1 писал(а) 28. Мая 2010 :: 10:07:
время в qa ( справа внизу ) неразличимо

В QA время - с точностью до секунд. И потом, кого в многопользовательских системах интересует время выполнения? Бóльшую часть стоимости плана выполнения составляет IO.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Наилучший поиск по заданному номеру всех документов конкретного вида (sql)
Ответ #14 - 28. Мая 2010 :: 10:14
Печать  
alexdd писал(а) 28. Мая 2010 :: 10:09:
ну фз, вариант с like выигрывает у меня по количеству Reads(116), для первого варианта Reads = 132, для варианта с union all - 744, по CPU все одинаково. Но у меня 2000й сервер..

у меня тоже sql2000  sp3a
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 4
ОтправитьПечать