Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 магия trim-ов  [new]
beg_inner
Guest
имеются 2 таблицы:
CREATE TABLE [dbo].[BAD0BANCHE](
	[BB20_IDBANCA] [int] NOT NULL,
	[BB20_DES_BANCA] [char](50) NULL,
	[BB20_DEN_BANCA] [varchar](255) NULL,
	...
 CONSTRAINT [PK_BAD0BANCHE] PRIMARY KEY CLUSTERED 
) 

1.330 строк

CREATE TABLE [dbo].[eb_anagrafe_pcor](
	[id_anagraf] [int] IDENTITY(1,1) NOT NULL,
	[bb01_part_iva] [varchar](21)  NULL,
	[bb01_cod_fisc] [varchar](21)  NULL,
	[bb01_intestazione] [varchar](160)  NULL,
	...
 CONSTRAINT [PK_eb_anagrafe_pcor] PRIMARY KEY CLUSTERED 
) 

11.199 строк


считается, что в таблице BAD0BANCHE "названия" (BB20_DES_BANCA, BB20_DEN_BANCA) -- "правильные", т.е. например "ТТ Бу-Бу" с одним пробелом между словами.
название может быть в одной из колонок(BB20_DES_BANCA, BB20_DEN_BANCA) , или сразу в обеих,
могут быть 2 разных названия одного и того же.

в таблице eb_anagrafe_pcor находятся данные для вывода,
но таблица "неправильная", т.е. в ней с названиями(bb01_intestazione) может быть "бардак" типа " ТТ Бу-Бу",
т.е. лишние пробелы (или вообще что угодно) между словами.
требуется вывести информацию из "помойной" таблицы eb_anagrafe_pcor,
где для названий(bb01_intestazione) найдено соответствие в BAD0BANCHE (BB20_DES_BANCA, BB20_DEN_BANCA).
сказано попытаться смэтчить только вычистив лишние пробелы.

вот поиск по одной из колонок(для второй будет аналогично):
select p.bb01_part_iva,
       p.bb01_cod_fisc,
       p.bb01_intestazione
from dbo.EB_ANAGRAFE_PCOR p
where exists (select * 
              from dbo.bad0banche b
              where replace(p.bb01_intestazione,' ','') = replace(b.BB20_DEN_BANCA,' ','')
                    and b.BB20_DEN_BANCA <> '')


на даже таких небольших данных думает больше минуты.
зато если вставить тримы, то сразу всего 20 секунд.
план показывает другое соотношение по времени: 54% - 46%,
но вот статистика:
+
SET STATISTICS TIME ON;

select p.bb01_part_iva,
       p.bb01_cod_fisc,
       p.bb01_intestazione
       --p.*
from dbo.EB_ANAGRAFE_PCOR p
where exists (select * 
              from dbo.bad0banche b
              where replace(p.bb01_intestazione,' ','') = replace(b.BB20_DEN_BANCA,' ','')
                    and b.BB20_DEN_BANCA <> '')

select p.bb01_part_iva,
       p.bb01_cod_fisc,
       p.bb01_intestazione
       --p.*
from dbo.EB_ANAGRAFE_PCOR p
where exists	(select * from  dbo.bad0banche b
                 where
		replace(ltrim(rtrim(p.bb01_intestazione)),' ','') = replace(ltrim(rtrim(b.BB20_DEN_BANCA)),' ','')
and not (ltrim(rtrim(b.BB20_DEN_BANCA)) = ''))

SET STATISTICS TIME OFF;                    


SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

(7 row(s) affected)

(1 row(s) affected)

SQL Server Execution Times:
CPU time = 157906 ms, elapsed time = 85582 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

(7 row(s) affected)

(1 row(s) affected)

SQL Server Execution Times:
CPU time = 35938 ms, elapsed time = 18544 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.


почему с тримами лучше?
и как можно еще попытаться ускорить выборку?

К сообщению приложен файл. Размер - 43Kb
5 июн 13, 12:35    [14393750]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
Glory
Member

Откуда:
Сообщений: 104751
beg_inner
почему с тримами лучше?

Потому что меньше записей в table spool попадает

beg_inner
но вот статистика:

Где статистика чтений ?

beg_inner
и как можно еще попытаться ускорить выборку?

Привести "неправильные" названия к правильным заранее и убрать вычисления из запроса
5 июн 13, 12:43    [14393810]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Glory
beg_inner
почему с тримами лучше?

Потому что меньше записей в table spool попадает

beg_inner
но вот статистика:

Где статистика чтений ?

beg_inner
и как можно еще попытаться ускорить выборку?

Привести "неправильные" названия к правильным заранее и убрать вычисления из запроса
И наладить контроль за вводом только правильных строк
5 июн 13, 12:48    [14393858]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
beg_inner
Guest
Glory,

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

(7 row(s) affected)
Table 'Worktable'. Scan count 2, logical reads 117326, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'BAD0BANCHE'. Scan count 2, logical reads 140, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'eb_anagrafe_pcor'. Scan count 3, logical reads 649, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 158797 ms, elapsed time = 83479 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

(7 row(s) affected)
Table 'Worktable'. Scan count 2, logical reads 106120, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'BAD0BANCHE'. Scan count 2, logical reads 140, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'eb_anagrafe_pcor'. Scan count 3, logical reads 649, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 35954 ms, elapsed time = 19085 ms.


сейчас попробую во временную таблицу скинуть "приведенное",
поди одно и то же по времени будет.
их "изначальную" таблицу трогать нельзя,
можно использовать свои временные с последующим удалением,
т.е. они себе в бд "почищенную" таблицу на постоянной основе не примут
5 июн 13, 12:55    [14393909]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
beg_inner
Guest
iap
И наладить контроль за вводом только правильных строк

добро не наше, а выгружаемое из Аксесса, вообще непонятно кем введенное,
короче, мне сказали, были и всегда будут помойные данные.
5 июн 13, 13:00    [14393933]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
beg_inner
iap
И наладить контроль за вводом только правильных строк

добро не наше, а выгружаемое из Аксесса, вообще непонятно кем введенное,
короче, мне сказали, были и всегда будут помойные данные.

так при выгрузке обрабатывайте и делайте из говна конфетку.
5 июн 13, 13:04    [14393982]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
aleks2
Guest
beg_inner
и как можно еще попытаться ускорить выборку?


Нормализовать апдейтом данные в таблицах . После чего, выполнить тривиальный JOIN.
5 июн 13, 13:08    [14394012]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
beg_inner
Guest
Мистер Хенки,

ну так не я гружу-то.
мое дело отчеты, в них можно что угодно использовать.
а на чем они строятся, мне трогать нельзя.
можно переделывать под себя во временные таблицы на время жизни отчета
5 июн 13, 13:11    [14394046]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
aleks2
Guest
beg_inner
Мистер Хенки,

ну так не я гружу-то.
мое дело отчеты, в них можно что угодно использовать.
а на чем они строятся, мне трогать нельзя.
можно переделывать под себя во временные таблицы на время жизни отчета


Ну дык, СНАЧАЛА переделай - ПОТОМ join.
А то у тя столько сканов, скока раз exists вызывется.
Т.е. дохера.
5 июн 13, 13:14    [14394089]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
beg_inner
Guest
со вставкой в 2 табличные переменные данных исходных таблиц
с вычисленными "беспробельными" полями для обеих
и поиском по обоим полям общее время выполнения 6 секунд.
всем спасибо!
5 июн 13, 14:19    [14394745]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
Glory
Member

Откуда:
Сообщений: 104751
beg_inner
со вставкой в 2 табличные переменные данных исходных таблиц
с вычисленными "беспробельными" полями для обеих
и поиском по обоим полям общее время выполнения 6 секунд.

Вы планы то сравнили ? Поняли, в чем была проблема с производительностью то ?
5 июн 13, 14:35    [14394883]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
beg_inner
Guest
Glory,

не, с планами ничего не поняла,
даже из Вашего первого поста, чем отличалось с тримами и без, не поняла
(вообще как раз наоборот, я считала, что тримы не нужны).
одно ясно: лучше посчитать, записать и потом сканировать,
а не считать по ходу дела.
в плане вижу только, что с переменными он считает, что на выходе 1 строка
(близко к истине, там всего 7 строк)
а в исходном запросе думает, что на выходе строк 1119.9
(что очень напоминает число строк в бОльшей таблице, почему-то деленное на 10).
если нежалко, объясните для тех кто в танке.
может планы в xml выложить?

К сообщению приложен файл. Размер - 56Kb
5 июн 13, 16:08    [14395533]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
aleks2
Guest
beg_inner
одно ясно: лучше посчитать, записать и потом сканировать,
а не считать по ходу дела.

А если правильные индексы на табличные переменные повесить - будет ишо быстрее.
5 июн 13, 17:55    [14396329]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
beg_inner
Guest
aleks2,

пардон, вроде ж на переменные только ПК и юник можно повесить,
но для этих сцепленных беспробельных строк никто уникальность не гарантирует.
заменить на темповые таблицы?
5 июн 13, 18:07    [14396381]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
beg_inner
Guest
да, с темповыми таблицами и индексами 0 секунд
на все: создание таблиц, индексов и выборка
5 июн 13, 18:24    [14396451]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
aleks2
Guest
beg_inner
aleks2,

пардон, вроде ж на переменные только ПК и юник можно повесить,
но для этих сцепленных беспробельных строк никто уникальность не гарантирует.
заменить на темповые таблицы?


Темнота
declare @t table (s nvarchar(256), i int identity, unique clustered (s, i));
5 июн 13, 18:29    [14396474]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
beg_inner
Guest
aleks2
beg_inner
aleks2,

пардон, вроде ж на переменные только ПК и юник можно повесить,
но для этих сцепленных беспробельных строк никто уникальность не гарантирует.
заменить на темповые таблицы?


Темнота
declare @t table (s nvarchar(256), i int identity, unique clustered (s, i));


и кто тут не читатель?
говорю, мне неуникальный индекс надо, а не ПК и не юник.
давайте пример, как неуникальный индекс на табличную переменную сделать,
прежде чем обзываться.
со временными таблицами уже сделала, вон выше отчиталась
5 июн 13, 22:20    [14397166]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
beg_inner
говорю, мне неуникальный индекс надо, а не ПК и не юник.
Предложенный вариант это и делает
5 июн 13, 22:43    [14397245]     Ответить | Цитировать Сообщить модератору
 Re: магия trim-ов  [new]
beg_inner
Guest
каюсь, вообще не прочла, что по двум полям,
трюк с идентити не оценила и вообще по диагонали прочла
спасибо, что перечитать заставили,
кстати да, до такого не доперла бы, ценно.
ушла спать.
спасибо, aleks2 и alexeyvg.
ок, да, "темнота"
5 июн 13, 23:34    [14397389]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить