Вопрос к DBA MS SQL2k
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
Вопрос к DBA MS SQL2k
Есть таблица t1, которую могу квери: select fld from t1
Есть также таблица t2, которую могу квери: select fld from t2
Не могу выполнить (из СКЛ аналайзер ): select T2.* from tbl2 T2, tbl1 T1 where T2.fld = T1.fld
DBCC updateusage не выдаёт ошибок.
DBCC checkdb ('MyDB', REPAIR_REBUILD ) не помогает.
Не работает даже если, как оказывается, в таблице tb1 содержится только одна запись.
Что чинить стал бы опытный дба?
Есть также таблица t2, которую могу квери: select fld from t2
Не могу выполнить (из СКЛ аналайзер ): select T2.* from tbl2 T2, tbl1 T1 where T2.fld = T1.fld
DBCC updateusage не выдаёт ошибок.
DBCC checkdb ('MyDB', REPAIR_REBUILD ) не помогает.
Не работает даже если, как оказывается, в таблице tb1 содержится только одна запись.
Что чинить стал бы опытный дба?
- Oleksandr
- Пользователь
- Сообщения: 83
- Зарегистрирован: 20 июн 2006, 22:31
- Откуда: Україна-Vancouver
- Oleksandr
- Пользователь
- Сообщения: 83
- Зарегистрирован: 20 июн 2006, 22:31
- Откуда: Україна-Vancouver
Кажется DBA тут не помогут.
Наслько мне подсказывает опыт, подобная ситуация может быть
(если пустой резалт-сет) только если T2.fld нигде неравно T1.fld
Пробуй так сравнить
rtrim(ltrim(T2.fld )) = rtrim(ltrim(T1.fld ))
если есть лидрующие иле в хвосте пробелы (или невидимый символ)
то оно несравнится никогда
Кстати, как описаны поля?
Наслько мне подсказывает опыт, подобная ситуация может быть
(если пустой резалт-сет) только если T2.fld нигде неравно T1.fld
Пробуй так сравнить
rtrim(ltrim(T2.fld )) = rtrim(ltrim(T1.fld ))
если есть лидрующие иле в хвосте пробелы (или невидимый символ)
то оно несравнится никогда
Кстати, как описаны поля?
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
Вопрос именно к DBA. Это была работающая годы база. Гарантируется, что в обеих таблицах имеются одинаковые значения поля fld char(4).Oleksandr писал(а):Кажется DBA тут не помогут.
Наслько мне подсказывает опыт, подобная ситуация может быть
(если пустой резалт-сет) только если T2.fld нигде неравно T1.fld
Пробуй так сравнить
rtrim(ltrim(T2.fld )) = rtrim(ltrim(T1.fld ))
если есть лидрующие иле в хвосте пробелы (или невидимый символ)
то оно несравнится никогда
Кстати, как описаны поля?
Вопрос из разряда рековери и траблшутинга.
ПС. для уменьшения неопределённости я удалил индексы, первичные и фореин ключи в обеих таблицах.
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
план запроса покажи. и скажи сколько записей реально должно возвращаться по запросу.vg писал(а):Вопрос именно к DBA. Это была работающая годы база. Гарантируется, что в обеих таблицах имеются одинаковые значения поля fld char(4).Oleksandr писал(а):Кажется DBA тут не помогут.
Наслько мне подсказывает опыт, подобная ситуация может быть
(если пустой резалт-сет) только если T2.fld нигде неравно T1.fld
Пробуй так сравнить
rtrim(ltrim(T2.fld )) = rtrim(ltrim(T1.fld ))
если есть лидрующие иле в хвосте пробелы (или невидимый символ)
то оно несравнится никогда
Кстати, как описаны поля?
Вопрос из разряда рековери и траблшутинга.
ПС. для уменьшения неопределённости я удалил индексы, первичные и фореин ключи в обеих таблицах.
-
- Житель
- Сообщения: 876
- Зарегистрирован: 19 июл 2004, 23:36
- Откуда: Ванкувер
на основании этого можно предположить что таблицы большие и без индексов конечно будет тайм аут. А еще - если много общих значений, то может получится слишком большой ризалт сет.vg писал(а):...Это была работающая годы база. ...
ПС. для уменьшения неопределённости я удалил индексы, первичные и фореин ключи в обеих таблицах.
Попробуйте сделать индексы по полям fld в обеих таблицах и сделать типа так:
select DISTINCT T2.* from tbl2 T2, tbl1 T1 where T2.fld = T1.fld
или (не очень хороший вариант, но можно попробовать, но только после создания индексов)
select T2.* from tbl2 T2 where T2.fld in (select fld from tbl1 T1)
и еще надо посмотреть - не отключен ли сбор статистики по этим таблицам.
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
хммм интересеный момент.ir писал(а):на основании этого можно предположить что таблицы большие и без индексов конечно будет тайм аут. А еще - если много общих значений, то может получится слишком большой ризалт сет.vg писал(а):...Это была работающая годы база. ...
ПС. для уменьшения неопределённости я удалил индексы, первичные и фореин ключи в обеих таблицах.
Попробуйте сделать индексы по полям fld в обеих таблицах и сделать типа так:
select DISTINCT T2.* from tbl2 T2, tbl1 T1 where T2.fld = T1.fld
или (не очень хороший вариант, но можно попробовать, но только после создания индексов)
select T2.* from tbl2 T2 where T2.fld in (select fld from tbl1 T1)
и еще надо посмотреть - не отключен ли сбор статистики по этим таблицам.

-
- Пользователь
- Сообщения: 155
- Зарегистрирован: 06 май 2006, 11:44
тяжело советовать без ddl и не зная какие и сколько данных в таблице.
distinct заставит движок выполнить stream aggegate что только усугубит дело. Можно проигнорировать для начала result set и попросить вернуть только count(*) что бы убедиться что записи есть. Посмотреть бы ожидаемый план и для внутренней таблицы прикинуть что дешевле - скан или index seek, тогда в последнем случае создать индекс на join column, кластерный. Для outer table судя по запросу всегда будет скан. Если есть clustered index, тогда скан по IAM pages может оказаться быстрее, поэтому можно поставить nolock либо tablock hint на эту таблицу.
Не зная всех деталей, это так, совет вслепую
distinct заставит движок выполнить stream aggegate что только усугубит дело. Можно проигнорировать для начала result set и попросить вернуть только count(*) что бы убедиться что записи есть. Посмотреть бы ожидаемый план и для внутренней таблицы прикинуть что дешевле - скан или index seek, тогда в последнем случае создать индекс на join column, кластерный. Для outer table судя по запросу всегда будет скан. Если есть clustered index, тогда скан по IAM pages может оказаться быстрее, поэтому можно поставить nolock либо tablock hint на эту таблицу.
Не зная всех деталей, это так, совет вслепую
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
база в каком состоянии? вообще из таблиц ничего прочитать не можешь? бакап базы есть? бакап хвоста лога сделал?vg писал(а):Похоже, ключевые слова - рекавери и траблшутинг не прочитаны. Эти таблицы убитой базы - мизерные. Каждая из таблиц может содержать 10 и даже одну запись. Вопрос не в производительности. Вопрос в невозможности выполнить join на этих двух таблицах в принципе.
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
То что в продакшн восстановлено из бекапа - сейчас работает нормально.папа Карло писал(а):база в каком состоянии? вообще из таблиц ничего прочитать не можешь? бакап базы есть? бакап хвоста лога сделал?vg писал(а):Похоже, ключевые слова - рекавери и траблшутинг не прочитаны. Эти таблицы убитой базы - мизерные. Каждая из таблиц может содержать 10 и даже одну запись. Вопрос не в производительности. Вопрос в невозможности выполнить join на этих двух таблицах в принципе.
Здесь же речь идёт о базе, которую убили on a fly.
Сравнение структуры этих таблиц, включая индексы и прочее показывает, что внешне всё одинаково.
Интересно, что как я отмечал в начале, можно легко делать запросы к каждой из таблиц по-отдельности. Думаю, не возможно будет скомпилировать план запроса. Не уверен. Проверю в понедельник на работе. Если план некомпилируется, то разгадка и решение рядом.
ПС. Важно не восстановить базу (в продакшн мы уже восстановили базу из бекапа), а понять что случилось в течение дня, как лечить это на лету, как сделать регулярный майтаненс привентинг всё это хозяйство от повторных крашей.
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
убили на лету -- прям как в сказке. надо четко знать что делали, а не загадками гвоорить -- пойди туда не знаю куда, принеси то, не знаю что. превентится это стандартно... читайте про авайлабилити базы и про то как делается бакап рековери стратегия...vg писал(а):То что в продакшн восстановлено из бекапа - сейчас работает нормально.папа Карло писал(а):база в каком состоянии? вообще из таблиц ничего прочитать не можешь? бакап базы есть? бакап хвоста лога сделал?vg писал(а):Похоже, ключевые слова - рекавери и траблшутинг не прочитаны. Эти таблицы убитой базы - мизерные. Каждая из таблиц может содержать 10 и даже одну запись. Вопрос не в производительности. Вопрос в невозможности выполнить join на этих двух таблицах в принципе.
Здесь же речь идёт о базе, которую убили on a fly.
Сравнение структуры этих таблиц, включая индексы и прочее показывает, что внешне всё одинаково.
Интересно, что как я отмечал в начале, можно легко делать запросы к каждой из таблиц по-отдельности. Думаю, не возможно будет скомпилировать план запроса. Не уверен. Проверю в понедельник на работе. Если план некомпилируется, то разгадка и решение рядом.
ПС. Важно не восстановить базу (в продакшн мы уже восстановили базу из бекапа), а понять что случилось в течение дня, как лечить это на лету, как сделать регулярный майтаненс привентинг всё это хозяйство от повторных крашей.
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага