|
|
|
Supreme Being
      
участник
Last Login: 06.07.2008 10:37
Сообщ.: 236,
Visits: 1 734
|
|
| Вобщем дело в следующем: Есть у меня приложение, написанное в ACCESS. БД в которой одна из таблиц имеет около 2 млн. записей. И запрос на поиск по этой таблице по полю F1 - тип которого Текст, длина - 8. и полю F2 - тип Текст, длина - 8. Плюс объединения с еще тремя таблицами для дополнительной информации. Поля F1 и F2 индексированные по отдельности, с возможностью повторов. Так вот, запрос этот выводит инфу мгновенно ( ну, скажем менее 1 сек. ) Перевожу эту систему на SQL Server 2k sp4, и там этот же запрос выполняется от 4 до 7 сек. Поля объединены в один индекс. Вопрос: правильно ли я настроил индексирование, а если нет то как правильно это делать? Когда лучше объединять поля в один индекс, а когда лучше по отдельности индексировать? Да и есть ли разница? Не может же быть чтобы ACCESS работал быстрее SQL Server? Спасибо.
|
|
|
|
|
Forum Member
      
участник
Last Login: 27.02.2008 16:42
Сообщ.: 43,
Visits: 1 569
|
|
Не может же быть чтобы ACCESS работал быстрее SQL Server? Oчень дaже мoжет. В зaвисимoсти oт тoгo кaк хрaнятся дaнные и кaк сoстaвлен зaпрoс. И oчень слoжнo oтветить нa Вaш вoпрoс - недoстaтoчнo инфoрмaции. В любoм случaе я не стaл бы грешить нa индексы - слишкoм уж великa рaзницa. Скoрее, прoблемa в зaпрoсе. Пoкaжите кaк Вы сoздaете зaпрoс в SQL Server, тoгдa мoжнo будет чтo-тo скaзaть.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 06.07.2008 10:37
Сообщ.: 236,
Visits: 1 734
|
|
Вот текст ХП:ALTER procedure dbo.S_GetDateFromBD ( @SerDoc as varchar(8), @NumDoc as varchar(8) ) AS BEGIN Select dbo.S_Strax.id_strax as strax, dbo.S_Work.ndog, dbo.S_Raion.id_raion as raion, dbo.S_Policy.ss as snils, dbo.S_Policy.fio, dbo.S_Sex.id_s as sex, dbo.S_Policy.birthday as birthday, dbo.S_Policy.adr, dbo.S_Work.id_work, dbo.S_Work.inn, dbo.S_Work.kpp, dbo.S_Policy.leave_date From dbo.S_Policy Inner Join dbo.S_Work on ( ( dbo.S_Work.regno = dbo.S_Policy.regno) and ( dbo.S_Work.label = dbo.S_Policy.label ) ) Inner Join dbo.S_Strax on ( dbo.S_Work.strax_cod = dbo.S_Strax.code_f ) Inner Join dbo.S_Raion on ( dbo.S_Raion.code_r = LEFT( dbo.S_Policy.regno, 2 ) ) Inner Join dbo.S_Sex on ( dbo.S_Sex.sex = dbo.S_Policy.sex ) Where ( dbo.S_Policy.polis_ser = @SerDoc ) And ( dbo.S_Policy.polis_num = @NumDoc ) END
Запрос из ACCESS пока привести не могу. Нет под рукой, но обязательно напишу. Вот запрос из ACCESSa: ( Выполняется мгновенно на той-же машине ) SELECT POLICY.POLIS_SER, POLICY.POLIS_NUM, POLICY.FIO, POLICY.BIRTHDAY, sex.id_sex, POLICY.ADR, POLICY.SS, WORK.WORKPLACE, strax.NAME, RAION.RAION_NAME FROM RAION, strax INNER JOIN ( (sex INNER JOIN POLICY ON sex.sex = POLICY.SEX) INNER JOIN [WORK] ON (POLICY.REGNO = WORK.REGNO) AND (POLICY.LABEL = WORK.LABEL)) ON strax.CODE_F = WORK.STRAX_COD WHERE ( ((POLICY.POLIS_SER)=[Forms]![talon]![seria_dok]) AND ((POLICY.POLIS_NUM)=[Forms]![talon]![num_dok]) AND ((RAION.CODE_R)=Left([Policy].[REGNO],2)) );
В принципе все то-же самое. Естественно все поля, учавствующие в условиях запросов индексированы. Вот только не могу понять почему ACCESS работает быстрее SQL Server'a. А время выполнения запроса очень важно, т.к. пользователи выполняют этот запрос по 1000 раз за день и простой даже в пару секунд в ожидании заполнения нужных полей сильно раздражает. ( По себе знаю :) ) Что делать?
|
|
|
|
|
Supreme Being
      
участник
Last Login: 06.07.2008 10:37
Сообщ.: 236,
Visits: 1 734
|
|
| Разобрался, все таки дело в индексах, вернее в неправильном индексе. В общем в ACCESS у меня было два индекса на таблицу POLICY, один составной на серию и номер, второй на фио. А в SQL Server я почему то сделал один индекс для серии, номера и фио. Стоило их разделить и все стало летать. Вот такие дела. В общем всем спасибо. PS: Если кто даст ссылки на полезные ресурсы по SQL Server буду очень признателен.
|
|
|
|