Mengeksekusi permintaan yang sama dari C # VS SSMS memberikan waktu eksekusi yang berbeda

12

Saya punya permintaan seperti ini

SELECT 
[EstimateId], 
[CreationUserId], 
[EstimateStatusValueId], 
[LanguageId], 
[LocationId], 
[EstimatorUserId], 
[FilterUnitSystemTypeId], 
[EstimateNumber], 
[RevisionNumber], 
[CreationDate], 
[ModificationDate], 
[ProjectDescription], 
[IsBsdq], 
[ClosingDate], 
[ClosingTime], 
[ClosingUpdatedOn], 
[DeadLineDate], 
[IsReceived], 
[Inclusion], 
[Exclusion], 
[Misc], 
[Note], 
[WorkDeadLines], 
[Comments], 
[Validity], 
[PlansLocation], 
[PlansReceivedFrom], 
[Price]
FROM [Estimate].[Estimates] 
ORDER BY [ClosingDate] ASC, [ClosingTime] ASC

Ketika saya menjalankan kueri ini di SSMS saya mendapatkan waktu pelaksanaan 953ms, tetapi ketika saya menjalankan kueri ini dari Linq Query di C # saya mendapatkan waktu pelaksanaan 1813ms.

Kueri Linq menggunakan ".Net SqlClient Data Provider" dan dikeluarkan terhadap EntityFramework (file EDMX). Apakah ini bisa menjadi masalah?

Adakah yang tahu mengapa saya memiliki perbedaan besar antara waktu eksekusi permintaan yang sama tetapi mengeksekusi dari konteks yang berbeda terhadap database yang sama?

Saya memverifikasi semua rencana eksekusi dari kedua permintaan dan mereka menggunakan indeks yang sama untuk memenuhi permintaan mereka masing-masing.

Untuk melihat rencana eksekusi permintaan C # saya menggunakan profiler SQL untuk menjebak acara Show Plan XML dan saya membandingkannya dengan salah satu SSMS dan keduanya sama.

Nico
sumber
hanya sebuah pertanyaan kecil - mengapa Anda memilih semua data tabel tanpa kondisi pencarian apa pun? Apakah Anda benar-benar membutuhkan semua data dalam aplikasi tanpa penyaringan?
Marian
Ya ini adalah fitur yang saya butuhkan tetapi fitur ini tidak akan sering digunakan. Saya tahu itu tidak optimal untuk mengeluarkan permintaan besar tanpa klausa mana.
Nico
Pokoknya kekhawatiran saya bukanlah permintaan itu sendiri tetapi perbedaan antara waktu pelaksanaan. Saya menunjukkan kepada Anda pertanyaan ini tetapi semua pertanyaan memberikan hasil yang serupa. Mengapa
Nico

Jawaban:

6

Apakah ini konsisten, berkali-kali?

Saya melihat perbedaan CPU yang bisa jadi waktu kompilasi. Apakah ada pengaturan LINQ yang memengaruhi ini?

Edit:

  • Abadikan paket dalam Profiler
  • Apakah Anda yakin SQL sama di Profiler ?
gbn
sumber
Ya itu konsisten dari waktu ke waktu. Saya tidak tahu untuk pengaturan LINQ. tetapi saya menemukan tautan ini codeproject.com/KB/cs/linqsql2.aspx
Nico
Anda dapat melihat paket pada gambar di atas untuk kedua permintaan. Ya saya yakin SQL sama di profiler. Aplikasi SQL, Profiler, SSMS, dan C # semuanya di-host di komputer saya untuk tujuan pengembangan.
Nico
Abadikan paket aktual dalam XML dari Profiler. Bukan dari cache. Anda memiliki respons berbeda tetapi Anda menunjukkan rencana berbeda = rencana salah yang ditunjukkan di atas mungkin
gbn
4

Saya pikir masalahnya ada pada penggunaan file EDMX untuk menghasilkan pertanyaan dari aplikasi C #.

Saya menemukan tautan yang menjelaskan kasus itu.

Proyek Kode

Stackoverflow-1

Stackoverflow-2

Nico
sumber
3

Anda akan ingin melihat rencana Eksekusi untuk dua pertanyaan dan melihat di mana mereka berbeda.

mrdenny
sumber
saya hanya mengedit posting saya ... dan saya sudah memverifikasi bahwa kedua permintaan menggunakan paket yang sama.
Nico
1
Saya hanya menambahkan acara yang Anda beri tahu saya ke dalam profiler dan itu sama dengan permintaan terakhir yang saya posting di pertanyaan saya. Saya mendapat rencana yang sama .. ada ide lain ...
Nico
2
Semuanya terlihat benar. Satu-satunya hal yang mungkin menjelaskannya adalah jika aplikasi .NET tidak menerima data dengan cukup cepat. Waktu yang dilaporkan dalam SQL Profiler termasuk jumlah waktu untuk mentransfer data dari server ke klien. Jadi, jika klien tidak mengunduh semuanya dengan cukup cepat, waktu berjalan yang dilaporkan akan lebih lama.
mrdenny
2
Kemudian turun ke apa aplikasi lakukan dengan data, dan bagaimana itu membaca data dari database.
mrdenny
3
Untuk mendukung jawaban mrdenny, saya akan menambahkan bahwa saya menguji kueri dalam 3 klien SQL yang berbeda dan waktu yang dilaporkan semuanya berbeda walaupun statistik IO dan pelaksanaannya sama. Itu semua disebabkan oleh cara internal bagaimana klien memperlakukan data. Saya percaya bahwa Anda bisa mendapatkan hasil waktu yang berbeda dengan mengeluarkan ke file, ke grid di Management Studio atau ke output teks. Bagaimanapun, dari apa yang saya ingat, dokumentasi mengatakan bahwa SQL akan selalu lebih cepat daripada LINQ ke SQL, jadi ini bukan kejutan :-).
Marian