none
Непостоянность времени работы куска кода.. RRS feed

  • Вопрос

  • Небольшой вопросик.. =)
    Когда первый раз запускаю программу, то она кусок кода приведенный ниже - выполняет 10 секунд, а если ее закрыть, и запустить заново(с теми-же самыми данными и всё такое), то этот кусок кода работает 2 секунды.. Почему такие различия, и как сделать, чтобы этот кусок выполнялся с персого раза за 2 секунды?? =)

    string connectionString = "Data Source=." + "\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Wo­rdsDictionary.mdf;Integrated Security=True;User Instance=True";
    using (SqlConnection destinationConnection = new SqlConnection(connectionString))
    {
    destinationConnection.Open();

    SqlCommand myCommand = new SqlCommand("truncate table Words", destinationConnection);
    SqlDataReader reader = myCommand.ExecuteReader();
    reader.Close();

    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
    {
    bulkCopy.DestinationTableName = "Words";
    bulkCopy.WriteToServer(wordsDataSet.Tables[0]);// Вот эта строчка работает то 10 секунд, то 2
    destinationConnection.Close();
    }
    }

    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 0:23 MSDN Forums consolidation (От:SQL Server для разработчиков)
    20 февраля 2010 г. 19:28

Ответы

  • Думаю дело в том как вы подключаете базу, а конкретно в User Instance = true. В этом случае создаётся отдельный процесс SQL Server, внутри которого вы работаете, и который завершается спустя некоторое время после последнего коннекта. Попробуйте приаттачить вашу БД к серверу и избавиться от параметров AttachDbFilename и User Instance = true, и посмотрите что будет с временем в этом случае. Про User Instance можете почитать здесь - http://msdn.microsoft.com/ru-ru/library/ms254504.aspx.

    21 февраля 2010 г. 15:47

Все ответы

  • замечания по использованию объектов SqlCommand и SqlConnection
    1. destinationConnection.Close(); вызывать не нужно, если используется
    using (SqlConnection destinationConnection = new SqlConnection(connectionString))
    т.к. он диспозабл - он сам закроется, в секции юзинг
    2. SqlCommand myCommand = new SqlCommand("truncate table Words", destinationConnection);
    если вы хотите выполнить команду - не нужен ридер
    это делается так
    myCommand.ExecuteNonQuery();

    20 февраля 2010 г. 20:38
  • Сравни размер mdf-файла перед первым и перед вторым запусками. Скорее всего на втором запуске не тратится время на рост базы. 
    Ну или кэширование на каком-то уровне срабатывает :)
    20 февраля 2010 г. 21:00
    Модератор
  • Скорее всего это все дело уже в MS SQL сервере и его оптимизаторе. Первый раз составляется план выполнения, второй раз план берется из кеша. Может быть сам инстанс MS SQL сервера в неактивном состоянии.
    Так же может быть и дело в .NET, грузятся библиотеки и т.п.
    [Мой блог], [LinkedIn]
    21 февраля 2010 г. 13:16
  • Думаю дело в том как вы подключаете базу, а конкретно в User Instance = true. В этом случае создаётся отдельный процесс SQL Server, внутри которого вы работаете, и который завершается спустя некоторое время после последнего коннекта. Попробуйте приаттачить вашу БД к серверу и избавиться от параметров AttachDbFilename и User Instance = true, и посмотрите что будет с временем в этом случае. Про User Instance можете почитать здесь - http://msdn.microsoft.com/ru-ru/library/ms254504.aspx.

    21 февраля 2010 г. 15:47
  • Тоесть мне нужно  исполльзовать локальную БД sdf??
    21 февраля 2010 г. 23:11
  • Неожиданный вывод. Нужно попробовать обычную, не-user instance базу, постоянно приаттаченную к SQL Server.
    21 февраля 2010 г. 23:25
    Модератор