Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Хэширование varchar(max)  [new]
блудомонстр
Guest
Народ, поделитесь, кто какой техникой пользуется для построения хэшей, позволяющих построить уникальный индекс по длинным (varhar(MAX)) текстовым полям. Вот, думаю, если я эту строку перед созданием индекса обработаю MD5 - алгоритмом, какова вероятность, что хэши у двух записей совпадут? Моя задача - быстро искать полное совпадение длинной nvarchar(MAX) строки с записью в таблице, содержащей > 10 000 000 записей
22 июл 09, 12:26    [7444529]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
Чуть не забыл - если кто знает, может есть какие-нибудь штатные средства для хэширования? Сервер MS SQL 2008 экспресс
22 июл 09, 12:32    [7444580]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
CHECKSUM не подходит для этого?
В любом случае индекс-то будет неуникальным, ибо совпадения всегда возможны.
22 июл 09, 12:32    [7444585]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
iap,

поиск можно сделать и так, что бы сначала выбрать все записи по совпадающему хэшу, а потом уже из мелкой выборки перебором по полной строке. Только я думаю, насколько это будет производительно?
22 июл 09, 12:35    [7444603]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
И еще. Попробовал просто по строкам искать - дедлоки пачками сыплются (дело происходит в транзакции).
22 июл 09, 12:36    [7444614]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31215
блудомонстр
iap,

поиск можно сделать и так, что бы сначала выбрать все записи по совпадающему хэшу, а потом уже из мелкой выборки перебором по полной строке. Только я думаю, насколько это будет производительно?
Нужно просто сделать запрос с двумя условиями - по полю с хэшем и полю с содержимым.

Сервер сам сделает поиск по индексу и потом из мелкой выборки перебором по полной строке. Будет очень быстро.
22 июл 09, 12:38    [7444620]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
блудомонстр
iap,

поиск можно сделать и так, что бы сначала выбрать все записи по совпадающему хэшу, а потом уже из мелкой выборки перебором по полной строке. Только я думаю, насколько это будет производительно?
Правильно. Но индекс по хэшу не может быть уникальным, верно?
Если, конечно, хэш меньше самой строки
А в первом сообщении Вы писали
блудомонстр
позволяющих построить уникальный индекс по длинным (varhar(MAX)) текстовым полям
22 июл 09, 12:43    [7444659]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
iap
Вы писали
блудомонстр
позволяющих построить уникальный индекс по длинным (varhar(MAX)) текстовым полям

Ну да, меня интересует конечный результат. И если в нем скрыть реализацию, то получается обеспечение уникальности. Так понятней?
22 июл 09, 12:45    [7444671]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
alexeyvg
Сервер сам сделает поиск по индексу и потом из мелкой выборки перебором по полной строке. Будет очень быстро.

Спасибо. Сейчас попробую.
22 июл 09, 12:46    [7444679]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
блудомонстр
iap
Вы писали
блудомонстр
позволяющих построить уникальный индекс по длинным (varhar(MAX)) текстовым полям

Ну да, меня интересует конечный результат. И если в нем скрыть реализацию, то получается обеспечение уникальности. Так понятней?
Ну так надо же сразу точно выражаться
Всё-таки, чем не подходят простые CHECKSUM() и BINARY_CHECKSUM()?
22 июл 09, 12:48    [7444695]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
iap
Всё-таки, чем не подходят простые CHECKSUM() и BINARY_CHECKSUM()?

Спасибо еще раз. Сейчас все попробую. О вкусовых впечатления отпишусь :)
22 июл 09, 12:49    [7444703]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
m.soloviev
Member

Откуда: МСК
Сообщений: 45
блудомонстр,

Никакой вероятности, есть встроенная классическая функция = md5("значение");
На этом и основана user_session!
22 июл 09, 12:52    [7444722]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
m.soloviev
есть встроенная классическая функция = md5("значение");
На этом и основана user_session!

Что-то я такой не нашел. Может не там ищу?
22 июл 09, 13:00    [7444788]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
iap
BINARY_CHECKSUM()?

А они могут быть дефолтом для поля типа int? Что-то как-то не выходит. Или триггером надо обновлять?
22 июл 09, 13:01    [7444804]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
m.soloviev
блудомонстр,

Никакой вероятности, есть встроенная классическая функция = md5("значение");
На этом и основана user_session!
В TSQL функция называется HashBytes (SQL2005/2008)
22 июл 09, 13:04    [7444823]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
iap
В TSQL функция называется HashBytes (SQL2005/2008)

Спасибо, уже сам нашел :)
22 июл 09, 13:05    [7444836]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
alexeyvg
Нужно просто сделать запрос с двумя условиями - по полю с хэшем и полю с содержимым.

Сервер сам сделает поиск по индексу и потом из мелкой выборки перебором по полной строке. Будет очень быстро.

Что-то у сервера у самого так не получается. Скан таблицы получается. Может тестовых данных маловато?

Скрипты исходных таблиц:

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[KnownTypes](
	[KnownTypeID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
	[TypeName] [nvarchar](max) NOT NULL,
	[HumanReadableDescription] [nvarchar](max) NULL)
GO
CREATE TABLE [dbo].[Resource](
	[ResourceID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
	[ResourceUri] [nvarchar](max) NOT NULL,
	[UriMD5Hash] [binary](16) NULL,
	[KnownTypeID] [int] NOT NULL,
	[IsCollection] [int] NOT NULL)
GO
CREATE NONCLUSTERED INDEX [IX_UriMD5Hash] ON [dbo].[Resource] 
(
	[UriMD5Hash] ASC,
	[KnownTypeID] ASC
)
GO
ALTER TABLE [dbo].[Resource]  ADD  CONSTRAINT [FK_Resource_KnownTypes] FOREIGN KEY([KnownTypeID])
REFERENCES [dbo].[KnownTypes] ([KnownTypeID])
GO
ALTER TABLE [dbo].[Resource] ADD  CONSTRAINT [DF_Resource_IsCollection]  DEFAULT ((0)) FOR [IsCollection]
GO
insert [KnownTypes] (TypeName, HumanReadableDescription)
select 'Root',	'Корневой каталог' union all
select 'Collection',	'Папка с файлами' union all
select 'File',	'Файл неизвестного формата' union all
select 'Image',	'Картинка'
GO
insert [Resource]([ResourceUri], [UriMD5Hash], [KnownTypeID], [IsCollection])
select '/',0x6B92BB2C65A19276DF9388E936CCD25C,1,1 union all
select '/test/test.jpg/',0x87BEECE8E1F6BED8B8B834A5F4497281,4,0 union all
select '/test/',0x0DB6E7A2881AB43A4FF0238B69C92A2F,2,1 union all
select '/Orders/',0x95E3DF9632015E4F7E8855A71B2BFB20,2,1 union all
select '/Orders/431698/',0x6E4113A6B0BD1AEA65F007CD378BAD8F,2,1 union all
select '/Orders/431698/Original Files/',0x339DCFD647000A1254B4952F3870D544,2,1 union all
select '/Orders/431698/Original Files/348523_IMG_2416.jpg.jpeg/',0x9E5F0E307CB8711423FCBD652A7597D4,3,0 union all
select '/Orders/431698/Original Files/348522_IMG_2418.jpg.jpeg/',0x12F0993A11DEE1C973C471AB30367FF1,3,0 union all
select '/Orders/431698/Original Files/348521_IMG_2420.jpg.jpeg/',0xF581144367EB013901D7FDA2782E7017,3,0 union all
select '/Orders/431698/Original Files/348520_IMG_2406.jpg.jpeg/',0x01516DC8A2126AAAF6C756732B6C0C14,3,0 union all
select '/Orders/431698/Original Files/348524_IMG_2415.jpg.jpeg/',0x98E7EDCE4CC3B054EED3F265770E4458,3,0 union all
select '/Orders/431698/Original Files/348526_IMG_2413.jpg.jpeg/',0x61C21045925D0C5D22F6D25FB3276A3D,3,0 union all
select '/Orders/431698/Original Files/348525_IMG_2414.jpg.jpeg/',0x2A814DA36A3482DAA5E2E7EF96EB1E28,3,0 union all
select '/Orders/431698/Original Files/348527_IMG_2412.jpg.jpeg/',0x1B4CFE2FCB910170E126AAC47EDEB4D2,3,0 union all
select '/Orders/431698/Original Files/348528_IMG_2410.jpg.jpeg/',0xBA36759174620392C63B88D91DBA8374,3,0 union all
select '/Orders/431698/Original Files/348529_IMG_2409.jpg.jpeg/',0xCFBB0CB95FB4AE795C1ABD61935C4F21,3,0 union all
select '/Orders/431698/Original Files/348530_IMG_2407.jpg.jpeg/',0xF49F87C86168EE8BEC999FD786F98856,3,0 union all
select '/Orders/431698/Original Files/348531_DSC_0002.JPG.jpeg/',0xC49D1D3021FBA4EDD8A4E88C68F48484,3,0 union all
select '/Orders/431698/Original Files/348532_DSC_0120.JPG.jpeg/',0xB54ABD1F1C4365137DF0BAAF2F102758,3,0 union all
select '/Orders/431698/Original Files/348534_DSC_0118.JPG.jpeg/',0xD301A907631D655362474FAA66FADA65,3,0 union all
select '/Orders/431698/Original Files/348533_DSC_0119.JPG.jpeg/',0x8E8F40D8D136CAD9AD0DDFEDDF7C6997,3,0 union all
select '/Orders/431698/Original Files/348535_DSC_0117.JPG.jpeg/',0x8345B8094C27A907D52205BFB9ED15C0,3,0 union all
select '/Orders/431698/Original Files/348536_DSC_0116.JPG.jpeg/',0x9501B2989ADAD9FE517257890298C3E7,3,0 union all
select '/Orders/431698/Original Files/348538_DSC_0114.JPG.jpeg/',0x5F0B111D6566C9A689610A686869395C,3,0 union all
select '/Orders/431698/Original Files/348537_DSC_0115.JPG.jpeg/',0xBC8477DA621AB36C806D2D206BF665C5,3,0 union all
select '/Orders/431698/Original Files/348539_DSC_0113.JPG.jpeg/',0xD32340921030D20982ACBDAA7E292B72,3,0 union all
select '/Orders/431698/Original Files/348540_DSC_0112.JPG.jpeg/',0xC64AF07378FE63D01984EECADDFBAC42,3,0 union all
select '/Orders/431698/Original Files/348542_DSC_0110.JPG.jpeg/',0x93BABBBC38000197DF908506E3226759,3,0 union all
select '/Orders/431698/Original Files/348541_DSC_0111.JPG.jpeg/',0x05A914DAD394A40E05F20A8F90753350,3,0 union all
select '/Orders/431698/Original Files/348543_DSC_0109.JPG.jpeg/',0x5995FB439BBE61701B759FF1E0444665,3,0 union all
select '/Orders/431698/Original Files/348544_DSC_0108.JPG.jpeg/',0x762D545B6C6C2CE70F4456BE9E70CB3D,3,0 union all
select '/Orders/431698/Original Files/348545_DSC_0107.JPG.jpeg/',0x4B9A87C4822C3A3D07C48BE1034039D0,3,0 union all
select '/Orders/431698/Original Files/348546_DSC_0106.JPG.jpeg/',0x8ED564A951229CD5DF35A26823BE8C4C,3,0 union all
select '/Orders/431698/Original Files/348547_DSC_0105.JPG.jpeg/',0xDD8C77B6532C7ADF502596C83577A7A9,3,0 union all
select '/Orders/431698/Original Files/348548_DSC_0104.JPG.jpeg/',0xBDC81E36B470AABABA041F6E4FDF46AA,3,0 union all
select '/Orders/431698/Original Files/348549_DSC_0103.JPG.jpeg/',0x6275E9AAECFD320809B30BE75587BBA2,3,0 union all
select '/Orders/431698/Original Files/348550_DSC_0102.JPG.jpeg/',0xFD0BB7698FE4CFBD90FB8A49326F1A07,3,0 union all
select '/Orders/431698/Original Files/348551_DSC_0101.JPG.jpeg/',0x04BB07895C3A1763B9C9CA33AF150886,3,0 union all
select '/Orders/431698/Original Files/348552_DSC_0100.JPG.jpeg/',0xFBBF94825BEC8C0AA1ABE5BB7A3FF886,3,0 union all
select '/Orders/431698/Original Files/348553_DSC_0099.JPG.jpeg/',0x30D5AC8D0B604961462B9E732006B718,3,0 union all
select '/Orders/431698/Original Files/348554_DSC_0098.JPG.jpeg/',0x8C148C133758CF0E148C9FDCCC51147C,3,0 union all
select '/Orders/431698/Original Files/348555_DSC_0097.JPG.jpeg/',0x5D08A4392D5B2B697606ABC87754CD44,3,0 union all
select '/Orders/431698/Original Files/348556_DSC_0096.JPG.jpeg/',0xA2B691B91F992B320D2806A3C3773D62,3,0 union all
select '/Orders/431698/Original Files/348557_DSC_0095.JPG.jpeg/',0xAB39E24D93490E096223DF9EEB3F4C41,3,0 union all
select '/Orders/431698/Original Files/348558_DSC_0094.JPG.jpeg/',0xE2E6220CAA44539CE57BF1D71E1E2A72,3,0 union all
select '/Orders/431698/Original Files/348559_DSC_0093.JPG.jpeg/',0x175DD6CE49F447310011CA8E50250A19,3,0 union all
select '/Orders/431698/Original Files/348560_DSC_0092.JPG.jpeg/',0x6D19471A9E5A5596BF70EBE549DD081F,3,0 union all
select '/Orders/431698/Original Files/348562_DSC_0090.JPG.jpeg/',0x668B8BE0FA85EF2E51765AB2059B2652,3,0 union all
select '/Orders/431698/Original Files/348561_DSC_0091.JPG.jpeg/',0xD3E84E2F557EE1D89F68BF43BF6239AD,3,0 union all
select '/Orders/431698/Original Files/348563_DSC_0089.JPG.jpeg/',0x8936A5AEA20BAFC0790C89723532E949,3,0 union all
select '/Orders/431698/Original Files/348564_DSC_0088.JPG.jpeg/',0xAF8BA0943037C6F9CC543968A785F86D,3,0 union all
select '/Orders/431698/Original Files/348565_DSC_0087.JPG.jpeg/',0xDEA1FF4A62CB1F9BFC1F675DFDADBA1E,3,0 union all
select '/Orders/431698/Original Files/348566_DSC_0086.JPG.jpeg/',0x5BF2945ED6ECDD0E2B3CE692956B1838,3,0 union all
select '/Orders/431698/Original Files/348567_DSC_0085.JPG.jpeg/',0x9534ECA1D07C0D12313CB69A4084E6B5,3,0 union all
select '/Orders/431698/Original Files/348568_DSC_0084.JPG.jpeg/',0x9CF68D94B66EED079E9DA19318C2A33C,3,0 union all
select '/Orders/431698/Original Files/348569_DSC_0083.JPG.jpeg/',0x3611B73A3E6F6F9483175140D37A7497,3,0 union all
select '/Orders/431698/Original Files/348570_DSC_0082.JPG.jpeg/',0x65AF8E47D659E54C405970C4671017E0,3,0 union all
select '/Orders/431698/Original Files/348571_DSC_0081.JPG.jpeg/',0xE8E1E0527AF31F5B0D0B759C7A634055,3,0 union all
select '/Orders/431698/Original Files/348572_DSC_0080.JPG.jpeg/',0x5607E00DCFB2E906886AD6BEEBC10582,3,0 union all
select '/Orders/431698/Original Files/348573_DSC_0079.JPG.jpeg/',0x40C86176D47175A5D0BF619E74F0F42F,3,0 union all
select '/Orders/431698/Original Files/348574_DSC_0078.JPG.jpeg/',0x4419B8EFE6491ED570E02A4C805AE691,3,0 union all
select '/Orders/431698/Original Files/348575_DSC_0077.JPG.jpeg/',0x601B1011645A3B0F034E1A367933849F,3,0 union all
select '/Orders/431698/Original Files/348576_DSC_0076.JPG.jpeg/',0x0B0A1710D9BAD3D2336DA4A2047D20B9,3,0 union all
select '/Orders/431698/Original Files/348577_DSC_0075.JPG.jpeg/',0xD1F1B638880034D1A8D92ACE0DECDFC3,3,0 union all
select '/Orders/431698/Original Files/348578_DSC_0074.JPG.jpeg/',0xE3A26518198529880F1B98D73FC11B8B,3,0 union all
select '/Orders/431698/Original Files/348579_DSC_0073.JPG.jpeg/',0x754783F8372B96C3F1A6B5F5024055A6,3,0 union all
select '/Orders/431698/Original Files/348580_DSC_0072.JPG.jpeg/',0x2277886EABA174D2B8462949A85C8AE5,3,0 union all
select '/Orders/431698/Original Files/348581_DSC_0071.JPG.jpeg/',0x5C412FF0D36BE8E10062926AFB2A952A,3,0 union all
select '/Orders/431698/Original Files/348582_DSC_0070.JPG.jpeg/',0xF1F4A03BD13B4213E06B530ED50FA023,3,0 union all
select '/Orders/431698/Original Files/348583_DSC_0069.JPG.jpeg/',0x52498140E9E92A5991986A3FB652E946,3,0 union all
select '/Orders/431698/Original Files/348584_DSC_0068.JPG.jpeg/',0xAAA369CC55D07866759B48BB07F08894,3,0 union all
select '/Orders/431698/Original Files/348585_DSC_0067.JPG.jpeg/',0x8C9009EEBF8781FDD23C6164EE5BC199,3,0 union all
select '/Orders/431698/Original Files/348586_DSC_0066.JPG.jpeg/',0x4231807BFA0B7B33836B377BF5CBEA27,3,0 union all
select '/Orders/431698/Original Files/348587_DSC_0065.JPG.jpeg/',0xBFB6036DB05E84E340F1587018690467,3,0 union all
select '/Orders/431698/Original Files/348588_DSC_0064.JPG.jpeg/',0xD8B4139E419A9D13E27F76EBB862E6D9,3,0 union all
select '/Orders/431698/Original Files/348589_DSC_0063.JPG.jpeg/',0xBED33AB5E474F8D6FDFE217C5C5DC87B,3,0 union all
select '/Orders/431698/Original Files/348590_DSC_0062.JPG.jpeg/',0x03E42D08A400D04A5C043BE724B232CC,3,0 union all
select '/Orders/431698/Original Files/348591_DSC_0061.JPG.jpeg/',0x62BBC2A5D9AED7D870AA097091806FE0,3,0 union all
select '/Orders/431698/Original Files/348592_DSC_0060.JPG.jpeg/',0xF30FF4FCEDCBEC04D5F07343F36B5411,3,0 union all
select '/Orders/431698/Original Files/348593_DSC_0059.JPG.jpeg/',0xF0F1FCCF63B3A89AEB26A6E275DBEF26,3,0 union all
select '/Orders/431698/Original Files/348594_DSC_0058.JPG.jpeg/',0x281A3F0675E93C406A67638C2C1EF652,3,0 union all
select '/Orders/431698/Original Files/348595_DSC_0057.JPG.jpeg/',0x7CADD8DBDBF9298328109D1339ADF3D8,3,0 union all
select '/Orders/431698/Original Files/348596_DSC_0056.JPG.jpeg/',0x04EEB97F6045BB587B617A2F5A925AFE,3,0 union all
select '/Orders/431698/Original Files/348597_DSC_0055.JPG.jpeg/',0x22029B320D3FE41F9D7B965E5387EEC6,3,0 union all
select '/Orders/431698/Original Files/348598_DSC_0054.JPG.jpeg/',0x0CA78218FA0B91D7BA676F98D206CE18,3,0 union all
select '/Orders/431698/Original Files/348599_DSC_0053.JPG.jpeg/',0xCD791AE552E120CAC4CEC56DED467215,3,0 union all
select '/Orders/431698/Original Files/348600_DSC_0052.JPG.jpeg/',0xC4D44C7FD8959C2E78BDD6E74A7C8135,3,0 union all
select '/Orders/431698/Original Files/348601_DSC_0051.JPG.jpeg/',0xD5E249EB944A27CB6E8B0DFA961EA913,3,0 union all
select '/Orders/431698/Original Files/348602_DSC_0050.JPG.jpeg/',0x185400DA82AABB59323FE775FFAB006D,3,0 union all
select '/Orders/431698/Original Files/348603_DSC_0049.JPG.jpeg/',0x397E0E855F0732E2D75459E8971AC3DD,3,0 union all
select '/Orders/431698/Original Files/348604_DSC_0048.JPG.jpeg/',0xC9F0E517755773A3B9F013B85934AE3A,3,0 union all
select '/Orders/431698/Original Files/348605_DSC_0047.JPG.jpeg/',0x68E75142A5091605DCE70BABF733243A,3,0 union all
select '/Orders/431698/Original Files/348606_DSC_0046.JPG.jpeg/',0xB80F92C44F94E5DA1CB2D15DE427DF28,3,0 union all
select '/Orders/431698/Original Files/348607_DSC_0045.JPG.jpeg/',0x9EED24973D4AE40E00AC58110A7F9E67,3,0 union all
select '/Orders/431698/Original Files/348608_DSC_0044.JPG.jpeg/',0x0ED3A0AF391D0CC54E73F89B2C2AE8E1,3,0 union all
select '/Orders/431698/Original Files/348609_DSC_0043.JPG.jpeg/',0xA54223B472ED567383D83959C40C6E2B,3,0 union all
select '/Orders/431698/Original Files/348610_DSC_0042.JPG.jpeg/',0xD9FD90629628975A3E99DE7523836E94,3,0 union all
select '/Orders/431698/Original Files/348611_DSC_0041.JPG.jpeg/',0x1A80F8BD16130AD557C0FBBE9D71FD16,3,0 union all
select '/Orders/431698/Original Files/348612_DSC_0040.JPG.jpeg/',0xD03356DEEEB0EF5FB79A1204398E36DA,3,0 union all
select '/Orders/431698/Original Files/348613_DSC_0039.JPG.jpeg/',0x70B68D9E16FFE577385EAE9E3581B407,3,0 union all
select '/Orders/431698/Original Files/348614_DSC_0038.JPG.jpeg/',0x9A354A3FE89FE2CCFE3E50D10623CF29,3,0 union all
select '/Orders/431698/Original Files/348615_DSC_0037.JPG.jpeg/',0xA1C8611A2181DA9758A0CEF0E1528320,3,0 union all
select '/Orders/431698/Original Files/348616_DSC_0036.JPG.jpeg/',0x33B24FB1E1344C8F2CAC113C71028A96,3,0 union all
select '/Orders/431698/Original Files/348617_DSC_0035.JPG.jpeg/',0x33097633F60F730C47EABDF0C3D56B0D,3,0 union all
select '/Orders/431698/Original Files/348618_DSC_0034.JPG.jpeg/',0x22F6BB8FAAE85C8DC8ED82CA506057D0,3,0 union all
select '/Orders/431698/Original Files/348619_DSC_0033.JPG.jpeg/',0x99B54B01F47136F665ED72B806CB99CA,3,0 union all
select '/Orders/431698/Original Files/348620_DSC_0032.JPG.jpeg/',0x2E520A086E643F40276E9617B958F115,3,0 union all
select '/Orders/431698/Original Files/348621_DSC_0031.JPG.jpeg/',0xE7FFF00323A0F9BFA3D2D08B72B731D5,3,0 union all
select '/Orders/431698/Original Files/348622_DSC_0030.JPG.jpeg/',0x1289F7B70D0E4C547AA0301F44001E42,3,0 union all
select '/Orders/431698/Original Files/348623_DSC_0029.JPG.jpeg/',0x32E92E0EACDB54583F6B58D566F551E1,3,0 union all
select '/Orders/431698/Original Files/348624_DSC_0028.JPG.jpeg/',0x53DB3D4F517C8452D9486618C89BD382,3,0 union all
select '/Orders/431698/Original Files/348625_DSC_0027.JPG.jpeg/',0x857FF5E799DEF55EBFDAE99B162B1C3D,3,0 union all
select '/Orders/431698/Original Files/348626_DSC_0026.JPG.jpeg/',0x802660CAA2151F19E126BE889DBBC20A,3,0 union all
select '/Orders/431698/Original Files/348627_DSC_0025.JPG.jpeg/',0x1C9C9736F5621E6D6A429EAAA93A3E9C,3,0 union all
select '/Orders/431698/Original Files/348628_DSC_0024.JPG.jpeg/',0x0480C5668E12022491B1645B07261329,3,0 union all
select '/Orders/431698/Original Files/348629_DSC_0023.JPG.jpeg/',0x6BB293F8395F16B651F75DA6F1ACE86F,3,0 union all
select '/Orders/431698/Original Files/348630_DSC_0022.JPG.jpeg/',0xCF0BD5201501A0A669601732A5776B5D,3,0 union all
select '/Orders/431698/Original Files/348631_DSC_0021.JPG.jpeg/',0xC450F096B8731A061320A254C1DFA5D7,3,0 union all
select '/Orders/431698/Original Files/348632_DSC_0020.JPG.jpeg/',0x6CF59F4E5AA6ABEF0870B81729EE3BAD,3,0 union all
select '/Orders/431698/Original Files/348633_DSC_0019.JPG.jpeg/',0x5D3DE169D6BA20213069E69B993B49A8,3,0 union all
select '/Orders/431698/Original Files/348634_DSC_0018.JPG.jpeg/',0xAE28CCDFA18248DFB1FF31415AD9FBFD,3,0 union all
select '/Orders/431698/Original Files/348635_DSC_0016.JPG.jpeg/',0xD1CF0E9B9DDE9877CF599640DE2F7C71,3,0 union all
select '/Orders/431698/Original Files/348636_DSC_0017.JPG.jpeg/',0xABF174ADE458AF1C8D88154C2813DEBC,3,0 union all
select '/Orders/431698/Original Files/348638_DSC_0013.JPG.jpeg/',0xB8497604935C91AA2672ED8DDA6B6231,3,0 union all
select '/Orders/431698/Original Files/348637_DSC_0014.JPG.jpeg/',0x0D026FBB4B74215910B9DA91F4EA7E35,3,0 union all
select '/Orders/431698/Original Files/348639_DSC_0012.JPG.jpeg/',0xCC27196C03549BDBA44BCA459314528D,3,0 union all
select '/Orders/431698/Original Files/348640_DSC_0011.JPG.jpeg/',0x1D896466DF3F32DBF614EB0970109AE6,3,0 union all
select '/Orders/431698/Original Files/348641_DSC_0010.JPG.jpeg/',0x91B12A69E73F793D4E382E8D31B34C62,3,0 union all
select '/Orders/431698/Original Files/348642_DSC_0009.JPG.jpeg/',0xC2A7BD6B7D4EA4116553B282DF20311A,3,0 union all
select '/Orders/431698/Original Files/348643_DSC_0008.JPG.jpeg/',0x3F578652FDBFB460693CE3E3AF73C562,3,0 union all
select '/Orders/431698/Original Files/348644_DSC_0007.JPG.jpeg/',0xEEFFFE6D29D24819910B94544860DB14,3,0 union all
select '/Orders/431698/Original Files/348645_DSC_0006.JPG.jpeg/',0x9ABCF3A929D1B0C5914090F4DC15E7DA,3,0 union all
select '/Orders/431698/Original Files/348646_DSC_0005.JPG.jpeg/',0x1865C5C7238F75EC17B05AB03750BF32,3,0 union all
select '/Orders/431698/Original Files/348647_DSC_0004.JPG.jpeg/',0xE22DE35CD71196D382386B2632BCFF83,3,0 union all
select '/Orders/431698/Original Files/348648_DSC_0003.JPG.jpeg/',0xD3DF360CC70A9FA28D7DC4B7E4CBAD2F,3,0 union all
select '/Orders/431698/Original Files/348649_DSC_0001.JPG.jpeg/',0x41D04876D70D7F6B0894760E715572BF,3,0 union all
select '/Orders/431698/Original Files/348650_IMG_2422.jpg.jpeg/',0x778B14D79A4131F3291CAFF96EBE0F6E,3,0 union all
select '/Orders/431698/Original Files/348651_IMG_2430.jpg.jpeg/',0x63207CEBD39E91F174572603986E8E5B,3,0 union all
select '/Orders/431698/Original Files/348652_IMG_2429.jpg.jpeg/',0x9FF3E37020972F14244D581FDF788713,3,0 union all
select '/Orders/431698/Original Files/348653_IMG_2428.jpg.jpeg/',0x0B9F1DFB1E8FF09BCF43D09E1D86154B,3,0 union all
select '/Orders/431698/Original Files/348654_IMG_2426.jpg.jpeg/',0xCC0BA4B0A7D046346D718125F26DF1EF,3,0 union all
select '/Orders/431698/Original Files/348655_IMG_2425.jpg.jpeg/',0x3228177A544B3333C43F4826503A5533,3,0 union all
select '/Orders/431698/Original Files/348656_IMG_2424.jpg.jpeg/',0xA0A78193ED4A26ABFCF2A4F7D77F8218,3,0 union all
select '/Orders/431698/Original Files/348657_IMG_2423.jpg.jpeg/',0x1478840FF013B5E9CEBD96DB441EEE2E,3,0 union all
select '/Orders/431698/Original Files/348658_IMG_2421.jpg.jpeg/',0x4F24BFDAC84FD867723FA45A318F5436,3,0
GO

сам запрос:

declare @Uri nvarchar(max)
set @Uri = '/Orders/431698/Original Files/348559_DSC_0093.JPG.jpeg'

select r.ResourceID
from (select Uri = @Uri + case when right(@Uri, 1) = '/' then '' else '/' end) u
  cross apply (select UriMD5Hash = HashBytes('MD5', u.Uri)) h
  join Resource r on r.UriMD5Hash = h.UriMD5Hash and u.Uri = r.ResourceUri


То ли лыжи не едут... как избавиться от скана?
22 июл 09, 13:54    [7445235]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
iljy
Member

Откуда:
Сообщений: 8711
блудомонстр,

если сделать побольше строк, а запрос переделать так:
declare @Uri nvarchar(max), @md5 varbinary(1000)
set @Uri = '/Orders/431698/Original Files/348559_DSC_0093.JPG.jpeg'
set @Uri = @Uri + case when right(@Uri, 1) = '/' then '' else '/' end
set @md5 = HashBytes('MD5', @Uri)

select r.ResourceID
from Resource r 
where r.UriMD5Hash = @md5 and r.ResourceUri = @Uri
все получается.
22 июл 09, 14:13    [7445382]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
iljy
Member

Откуда:
Сообщений: 8711
блудомонстр,
кстати - можно прямо указать для Resource хинт with(index (IX_UriMD5Hash))
22 июл 09, 14:16    [7445404]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36818
iljy
блудомонстр,
кстати - можно прямо указать для Resource хинт with(index (IX_UriMD5Hash))
Да что уж там мелочиться, можно и forceseek указать.
22 июл 09, 14:24    [7445475]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
iljy
все получается.

Спасибо огромное.

Может подскажете еще вариант что можно сделать с поиском по like?

declare @Uri nvarchar(max), @md5 binary(16)

set @Uri = '/Orders/431698/Original Files/'
set @Uri = @Uri + case when right(@Uri, 1) = '/' then '' else '/' end
set @md5 = HashBytes('MD5', @Uri)

-- Поиск потомков
select 
  ResourceUri = case when IsCollection = 0 then substring(r.ResourceUri, 1, len(r.ResourceUri)-1) else r.ResourceUri end,
  TypeName = t.TypeName
from Resource r 
  join KnownTypes t on t.KnownTypeID = r.KnownTypeID
where r.ResourceUri like @Uri + '%'
  and len(@Uri) - len(replace(@Uri, '/', '')) + 1 = len(r.ResourceUri) - len(replace(r.ResourceUri, '/', ''))

-- поиск родителя
select  r.ResourceUri,  1,  t.TypeName
from Resource r 
  join KnownTypes t on t.KnownTypeID = r.KnownTypeID
where @Uri like r.ResourceUri + '%'
  and len(@Uri) - len(replace(@Uri, '/', '')) - 1 = len(r.ResourceUri) - len(replace(r.ResourceUri, '/', ''))
22 июл 09, 14:36    [7445560]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36818
Ничего не сделать. Нормализуйте ваши пути и будет вам щастье.
22 июл 09, 14:37    [7445575]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
Гавриленко Сергей Алексеевич
Ничего не сделать. Нормализуйте ваши пути и будет вам щастье.

Честно - слабо представляю, как их можно нормализовать. Создать что-то на подобии полнотекстового поиска?
22 июл 09, 14:39    [7445589]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
iljy
Member

Откуда:
Сообщений: 8711
блудомонстр,

если у вас идет поиск по каталогам - можно например вынести в отдельную таблицу дерево каталогов, а в таблице с данными хранить привязку к каталогу по ID и имя файла. вообще - задачу надо ставить конкретно, у вас не просто текстовое поле получается, а вполне себе структурированное.
22 июл 09, 14:42    [7445615]     Ответить | Цитировать Сообщить модератору
 Re: Хэширование varchar(max)  [new]
блудомонстр
Guest
iljy
у вас не просто текстовое поле получается, а вполне себе структурированное.

Да, структурированное. Но данные тестовые - в реальных будут смешанные данные. Например, выделен отдельный каталог под каждый файл и название каталога размером в килобайт.
22 июл 09, 14:47    [7445657]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить