Tidak dapat melanjutkan eksekusi karena sesi dalam kondisi mati. saat membangun indeks berkerumun

11

Saya mendapatkan kesalahan berikut saat mencoba membuat indeks berkerumun

Pernyataan itu telah dihentikan.
Msg 596, Level 21,
Status 1, Baris 0 Tidak dapat melanjutkan eksekusi karena sesi ini dalam status kill.

Msg 0, Level 20, Negara 0, Baris 0
Terjadi kesalahan parah pada perintah saat ini. Hasilnya, jika ada, harus dibuang.

Indeksnya adalah:

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT

BEGIN TRANSACTION
GO

CREATE CLUSTERED INDEX IX_CO_DES_INPUT 
ON dbo.CO_DES_INPUT(DESIGN_ID, PRODUCT_INPUT_NUM, INPUT_NAME)
          WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
               ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

ALTER TABLE dbo.CO_DES_INPUT 
  SET (LOCK_ESCALATION = TABLE)
GO
COMMIT

Saya menggunakan Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) Edisi Standar (64-bit) pada Windows NT 6.3 (Build 9600:)

aku harus lari

DBCC CheckDB ('concept-test') WITH NO_INFOMSGS, ALL_ERRORMSGS  

dan tidak menemukan masalah

Saya takut database saya rusak karena saya mendapatkan kesalahan ini. Bagaimana cara memperbaiki masalah saya dan meletakkan indeks ini di atas meja?

pengguna2904235
sumber
Saya mendapatkan kesalahan yang sama ketika saya menambahkan indeks yang tidak berkerumun di tabel yang sama. Saya mencoba menambahkan yang non clustered terlebih dahulu. Saya mendapat kesalahan ini. Jadi saya berpikir bahwa saya mungkin memiliki indeks korupsi dan mencoba untuk menjatuhkan semua indeks dan membuatnya kembali. Saat itulah saya mendapat pesan kesalahan yang awalnya saya posting. Saya mungkin menambahkan bahwa pemeriksaan Idera SQL Integrity menemukan korupsi pada indeks untuk tabel ini. Sekarang pertanyaannya adalah, bagaimana cara memperbaikinya.
user2904235
Mungkinkah operasi Anda gagal ketika mengetahui bahwa ada pelanggaran kendala atau sesuatu seperti itu? Silakan lihat ini: http://stackoverflow.com/questions/34518205/c-sharp-cmd-executescalar-cannot-continue-the-execution-because-the-session
Victor Barajas

Jawaban:

4

Just a pointer re: SQL Server 2017 (di mana saya memukul kesalahan ini) dan beberapa versi 2016 berpotensi menghemat waktu lain:

Sebelum SQL Server 2017 CU8 (juga 2016 SP1 CU9 dan 2016 SP2 CU1), ada masalah di mana tabel dipartisi dengan statistik inkremental akan menghasilkan kesalahan ini jika operasi DML menyebabkan pembaruan statistik otomatis.

Halaman KB minimal ada di sini:

https://support.microsoft.com/en-us/help/4163478/fix-access-violation-when-incremental-statistics-automatically-updated

Menginstal CU lebih baru dari yang tercantum di atas memperbaiki masalah.

cbailiss
sumber
3

Ini bisa disebabkan oleh Korupsi Indeks,

Cara terbaik untuk mengelola ini adalah Jatuhkan Indeks Lama yang rusak.

DROP INDEX dbo.CO_DES_INPUT.IX_CO_DES_INPUT 

Dan daripada Menjalankan kueri dalam pertanyaan, seharusnya berfungsi dengan baik jika semua catatan unik. di kolom yang diberikan.

MarmiK
sumber
3

Dalam database yang dikonfigurasi untuk Selalu Pada Grup yang Tersedia, Anda juga dapat menemukan perilaku ini jika Grup Ketersediaan dalam mode SYNCHRONOUS dan sekunder telah offline atau ditangguhkan. Ini adalah efek samping yang dialami oleh server aplikasi. Terima kasih,

Kangeles
sumber
2

Sesuatu yang tanpa disadari saya temukan: Ketika Anda menonaktifkan / membangun kembali indeks pada tampilan yang diindeks, Anda akan mendapatkan kesalahan yang sama ini jika Anda mencoba untuk membangun kembali satu bijih lebih banyak dari indeks yang tidak berkerumun sebelum membangun clustered atau menggunakan REBUILD ALL.

PseudoToad
sumber
2

Saya selalu mendapatkan kesalahan ini ketika saya memiliki kueri yang sedang berjalan, menggunakan Always On AG Listener, menggunakan salah satu database AG dan ada failover:

Penyedia Data SqlClient. Net: Msg 596, Level 21, State 1, Line 0 Tidak dapat melanjutkan eksekusi karena sesi ini dalam status kill. Penyedia Data SqlClient. Bersih: Msg 0, Level 20, Negara 0, Baris 0 Terjadi kesalahan parah pada perintah saat ini. Hasilnya, jika ada, harus dibuang.

Sangat mudah untuk mereproduksi! Tentu saja, mungkin ada alasan lain tetapi ini adalah satu contoh khusus saya mendapatkan jenis kesalahan ini ...

HansLindgren
sumber
0

Saya dapat mereproduksi masalah ini dalam program C # yang cukup kecil yang menggunakan Koneksi Asynchronous, tetapi saya tidak yakin 100% mengapa. Ini adalah program repro saya kalau-kalau ada yang mau mencobanya - Saya curiga ada beberapa hal yang harus disejajarkan dengan sempurna agar hal ini terjadi:

  • Penyambungan koneksi diaktifkan
  • Menggunakan peniruan di kolam koneksi, tidak diperbolehkan mengembalikan konteks peniruan itu di kolam koneksi
void Main()
{
    var impersonateMyself = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

    var testCommand = "SELECT TOP 1 * FROM sys.objects";
    var calls = Enumerable.Repeat(
        $@"{testCommand};",
        10
    );
    var impersonatedCalls = Enumerable.Repeat(
        $@"EXECUTE AS LOGIN = '{impersonateMyself} WITH NO REVERT';  {testCommand}; REVERT;",
        10
    );
    Dictionary<string, object> dict = new Dictionary<string, object>()
    {
    };

    // Scenario 1: Impersonated Calls, With connection pooling -- will randomly fail
    Parallel.ForEach(
        impersonatedCalls,
        c => new SqlAsync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=2;").AsyncSqlCall<List<A>>(c, CommandType.Text, handleResultAsync, dict).Dump());

    Parallel.ForEach(
        impersonatedCalls,
        c => new SqlSync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=2;").SyncSqlCall<List<A>>(c, CommandType.Text, handleResultSync, dict).Dump());


    // Scenario 2: Normal calls, with connection pooling -- should succeed every time
    Parallel.ForEach(
        calls,
        c => new SqlAsync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=2;").AsyncSqlCall<List<A>>(c, CommandType.Text, handleResultAsync, dict).Dump());

    Parallel.ForEach(
        calls,
        c => new SqlSync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=2;").SyncSqlCall<List<A>>(c, CommandType.Text, handleResultSync, dict).Dump());



// Scenario 3: Impersonated Calls, WITHOUT connection pooling -- should succeed every time
    Parallel.ForEach(
        impersonatedCalls,
        c => new SqlAsync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=200;").AsyncSqlCall<List<A>>(c, CommandType.Text, handleResultAsync, dict).Dump());

    Parallel.ForEach(
        impersonatedCalls,
        c => new SqlSync("Data Source=devsql2;Initial Catalog=Test;Integrated Security=true;Max Pool Size=200;").SyncSqlCall<List<A>>(c, CommandType.Text, handleResultSync, dict).Dump());
}

public class SqlSync
{
    private readonly string _connectionString;
    public int Timeout {get; set;}

    public SqlSync(string connString)
    {
        _connectionString = connString;
        Timeout = 30;
    }

    public T SyncSqlCall<T>(string commandText, CommandType type, Func<SqlDataReader, T> handleResult, Dictionary<string, object> parameters = null)
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        using (SqlCommand cmd = new SqlCommand(commandText, conn))
        {
            cmd.CommandTimeout = Timeout;
            cmd.CommandType = CommandType.Text;

            if (parameters != null)
            {
                foreach (KeyValuePair<string, object> kvp in parameters)
                    cmd.Parameters.AddWithValue(kvp.Key, kvp.Value ?? DBNull.Value);
            }

            conn.Open();

            using (var rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                return handleResult(rdr);
        }
    }
}

public class SqlAsync
{
    private readonly string _connectionString;
    public int Timeout { get; set; }

    public SqlAsync(string connString)
    {
        _connectionString = connString;
        Timeout = 30;
    }

    public Task<T> AsyncSqlCall<T>(string sp, CommandType commandType, Func<SqlDataReader, Task<T>> handleResult, Dictionary<string, object> parameters = null)
    {
        return AsyncSqlCall<T>(sp, commandType, (reader, token) => handleResult(reader), CancellationToken.None, parameters);
    }

    public async Task<T> AsyncSqlCall<T>(string commandText, CommandType type, Func<SqlDataReader, CancellationToken, Task<T>> handleResult, CancellationToken cancellationToken, Dictionary<string, object> parameters = null)
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        using (SqlCommand cmd = new SqlCommand(commandText, conn))
        {
            cmd.CommandTimeout = Timeout;
            cmd.CommandType = CommandType.Text;

            if (parameters != null)
            {
                foreach (KeyValuePair<string, object> kvp in parameters)
                    cmd.Parameters.AddWithValue(kvp.Key, kvp.Value ?? DBNull.Value);
            }

            await conn.OpenAsync(cancellationToken);

//          if (conn.State != ConnectionState.Open)
//              await Task.Delay(TimeSpan.FromMilliseconds(10));
            using (var rdr = await cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection, cancellationToken))
                return await handleResult(rdr, cancellationToken);
        }
    }
}

public class A
{
    public string object_name { get; set; }
}

public static Func<SqlDataReader, Task<List<A>>> handleResultAsync = (SqlDataReader sdr) =>
{
    var result = new List<A>();
    while (sdr.Read())
    {
        result.Add(new A { object_name = sdr.GetFieldValue<string>(0) });
    }
    return Task.FromResult(result);
};

public static Func<SqlDataReader, List<A>> handleResultSync = (SqlDataReader sdr) =>
{
    var result = new List<A>();
    while (sdr.Read())
    {
        result.Add(new A { object_name = sdr.GetFieldValue<string>(0) });
    }
    return result;
};
John Zabroski
sumber