Moving-average-sql-query

Moving-average-sql-query

How-to-do-online-trading-in-pakistan
Pilihan-pedagang-interaktif-pialang
Instaforex-malaysia-johor


Vladimirs-forex-signal - & - mentoring Moving-average-with-labview Opsi saham terbatas Online-trading-websites-india Options-trading-strategies-india-excel Strategi perdagangan berjangka-etf-day-trading

Daftar Isi williamrobertson Menyiapkan Pengembang PLSQL, bagian 2 Artikel ini ditulis untuk Pengembang PLSQL 8.0.4 menggunakan Oracle 11.2 dan Windows XP, dalam mesin virtual Parallels di Mac saya, oleh karena itu screenshot menunjukkan campuran jendela XP Silver and Aqua. PLSQL Developer adalah salah satu dari beberapa lingkungan pengembangan terintegrasi (IDE) yang tersedia untuk Oracle. Salah satu hal yang saya sukai adalah bagaimana dikonfigurasi - Anda dapat mengubah hampir semua hal, dan dengan plug-in yang dapat didownload seperti Browser Extender Anda dapat menambahkan fungsionalitas Anda sendiri. Setelah memindahkan PC beberapa kali dan harus segera menginstal ulang Pengembang PLSQL setiap saat, saya telah menemukan bahwa ada beberapa penyesuaian yang tidak dapat saya jalani, dan menurut saya, Id mendokumentasikannya. Bagian Pertama mencakup preferensi seperti font dan tata letak layar, dan Bagian 2 mencakup browser Sesi. Saya akan menyertakan tindakan mouseclick yang benar yang telah saya tambahkan menggunakan Browser Extender. Tapi ada banyak hal yang dapat Anda lakukan dengan browser Session yang harus saya tinggalkan untuk Bagian 3. Memperluas Browser Sesi 1. Buat Sesi Browser lebih mudah ditemukan Dalam tata letak default, cara terkuburnya di bawah daftar di bawah Alat menu, tapi sebagai sesuatu yang Anda akan menggunakan semua waktu yang jauh lebih baik untuk memiliki tombol untuk itu. Jika Anda melewatkannya di bagian 1. Anda dapat menyesuaikan toolbar dengan menambahkan ikon untuk Session Browser. Heres jenis hal yang dapat Anda lakukan: Bilah alat default toolbar yang disesuaikan Perhatikan ikon lintas tombol kedua dari kiri di toolbar yang disesuaikan. 2. Tampak pada pengaturan default Sekarang buka Session Browser dan lihat set-up defaultnya. (Sebenarnya tidak cukup default - saya telah mengubah font ke Corbel 8pt, yang sesuai dengan lebih banyak informasi di layar, dan juga lebih menarik dari pada bawaan menurut saya Tahoma juga bekerja dengan baik.Anda akan sering melihat layar ini, Setelah semua.) Layar adalah laporan master-detail, dengan kedua master dan detail kueri dikonfigurasi menggunakan ikon kunci inggris. Permintaan utama di bagian atas jendela didefinisikan di bawah Filter, dan beberapa variasi pada pilih dari vsession disediakan. Di bawah Rincian, ada empat kueri yang sangat mendasar untuk kursor terbuka, pernyataan SQL saat ini, statistik sesi dan kunci: Perhatikan variabel terikat: sid di kueri Cursors. Hal yang keren tentang query detail browser sesi adalah Anda dapat merujuk pada nilai kolom saat ini dari bagian atas sebagai variabel terikat dalam query detail. Jadi, selama query utama berisi kolom bernama sid, kita bisa menggunakan ungkapan seperti di mana sessionid: sid in any detail query. (Ini berarti, bagaimanapun, bahwa Anda mungkin perlu memasukkan beberapa kolom dalam query master semata-mata untuk digunakan sebagai kunci dalam pertanyaan rinci.) Satu hal lagi yang perlu diperhatikan tentang kotak permintaan detail adalah menambahkan teks yang digabungkan setelah kueri membuat Pengembang PLSQL menggabungkan semua baris output menjadi satu blok besar. Sementara fitur yang apik, ini juga mencegah pengguliran jadi saya merasakannya berkat campuran. 3. Tuliskan pertanyaan VSESSION Anda sendiri Active Sessions Query default semua dipilih dari vsession dimana. . Yang tentu saja adalah pengaturan default yang masuk akal yang akan bekerja di semua versi Oracle. Atribut baru dan berguna ditambahkan ke vsession di setiap rilis, dan tentu saja mengkodekannya secara eksplisit dalam join dan look-up berarti query mungkin tidak bekerja pada versi sebelumnya.1 Jika Anda bekerja dengan beberapa versi Oracle, Anda mungkin perlu menyimpan Lebih dari satu query di bagian Filter, dan pilih yang sesuai sesuai kebutuhan (sayangnya pengembang PLSQL tidak dapat memeriksa versinya dan memilihnya untuk Anda). Heres query sesi yang lebih aktif yang lebih baik untuk Oracle 10.2.0.2 dan seterusnya (perhatikan kolom plsqlentryobjectid dan plsqlentrysubprogramid antara lain, ditambahkan dalam versi ini sehingga tidak berfungsi di Oracle 10g XE). Semua sesi yang sedang aktif (kecuali proses latar belakang Oracle seperti Log Writer), atau yang menghalangi sesi lain, atau yang dimiliki oleh saya. Orang tua mereka, jika bagian dari kueri paralel Objek yang saat ini ditunggu (biasanya berupa tabel atau indeks) - mendongak dari dbaobjects menggunakan rowwaitobj. The PLSQL entri dan prosedur saat ini - mendongak dari dbaprocedures menggunakan kolom plsql ditambahkan di Oracle 10.2.0.2. Beberapa statistik tentang CPU, baca, penggunaan memori dan query parsing, dari vsessmetric. Saat hasilnya ditampilkan, Anda dapat mengeklik kolom ini untuk mengurutkan sesi dengan penggunaan CPU. Sesi mana pun yang menghalangi yang lain, terlepas dari statusnya, selain sesi latar depan yang sedang aktif. Contoh RAC, untuk cluster multi-node. Jika Anda hanya memiliki satu contoh, itu akan menjadi 1 (Anda mungkin ingin memindahkannya ke akhir daftar untuk memberi ruang bagi kolom lainnya). Tampilan GV untuk RAC Tampilan v (sebenarnya sinonim untuk tampilan sys.v) semuanya memiliki versi awalan - misalnya, gvsession - yang menyertakan nomor contoh, untuk digunakan dalam sistem RAC. Untuk sistem single-instance ini akan selalu menjadi 1. Daftar dokumentasi hanya versi v, jadi jika Anda ingin tahu tentang gvsession. Sebagai contoh, lihat saja vsession dan anggap akan ada satu kolom tambahan bernama instid. Saya telah menggunakan nama vv reguler dan RAC-ready secara bergantian. Salin kueri di bawah ini ke kotak Kueri (setelah mengujinya di jendela SQL untuk memastikannya bekerja sesuai dengan versi dan izin Oracle Anda - untuk mengakses tampilan V yang Anda butuhkan SELECTCATALOGROLE). Perhatikan bahwa tidak ada titik koma di akhir. Anda mungkin juga ingin mengulasnya terhadap vsession jika ada kolom berguna yang berguna bagi Anda. Sesi Saya Pada sistem yang sibuk, terkadang Anda hanya ingin melihat sesi Anda sendiri dan mengecualikan hal lainnya. Untuk ini saya menggunakan kueri sesi saya, yang sama dengan yang di atas kecuali klausa WHERE, yaitu: Semua Sesi Ini juga terkadang berguna untuk memiliki satu versi yang menunjukkan semua sesi, termasuk penulis log Oracle, monitor proses dll. Buatlah salinan lain dari query di atas, dan tinggalkan klausa WHERE. 4. Sekarang tambahkan tab detail Anda sendiri Ini menggunakan vsqlstats untuk menampilkan statistik eksekusi rinci tentang sesi pernyataan SQL saat ini (diidentifikasi oleh sqlid). Perhatikan bahwa itu mengacu pada semua contoh kursor, bukan hanya sesi ini saat ini panggilan. (Juga, karena v pandangan hanya merefleksikan apa yang ada dalam ingatan saat ini, mungkin berbeda dari apa yang Anda lihat dalam pandangan dbahist jika Anda memiliki Paket Diagnostik) Gagasan tentang persentase adalah untuk menunjukkan bagaimana waktu berlalu total Ke CPU, IO, concurrency menunggu dll. Perkiraannya hanya dan mereka tidak selalu menambahkan hingga 100, karena mungkin ada faktor lain yang tidak diketahui seperti waktu transfer jaringan dan pemrosesan aplikasi, namun mereka memberi gambaran bagaimana pernyataan tersebut sedang Diproses Sekarang Anda harus mendapatkan tab Statistik SQL seperti tangkapan layar di bawah untuk sesi yang mengeksekusi SQL. (Binding, Prev SQL dll adalah tab lain Ill define in a moment.) Perf history this cursor Jika sebuah pernyataan SQL memakan waktu lama, Anda mungkin ingin memeriksa riwayat kinerjanya (dari dbahistsqlstats) untuk melihat apakah ini normal untuk Kursor atau apakah sesuatu telah berubah Query pertama di bawah ini memberikan rencana eksekusi yang berbeda dan statistik runtime yang sesuai, digabungkan untuk keseluruhan sejarah kursor, sehingga Anda dapat melihat waktu eksekusi rata-rata dan apakah ada banyak rencana. (Perhatikan join ke gvsqlplan - g yang menunjukkan versi RAC-enabled - yang seeems menjadi cara yang paling andal untuk menemukan rencana eksekusi yang saat ini digunakan karena mencakup nomor anak. Seperti laporan vsqlstats hanya satu baris per sqlid yang berbeda ) Versi yang kedua - yang saya beri label sebagai Perf history kursor ini menurut tanggal - membagi informasi yang sama setiap hari, sehingga Anda dapat melihat apakah berjalan cepat pada hari Selasa yang lalu, atau apakah itu Rencana berubah pagi ini: Permintaan berikut akan menampilkan variabel terikat yang ada di vsqlbindcapture untuk pernyataan SQL saat ini. Saya telah memfilter hasilnya untuk mengecualikan duplikat. Perhatikan bahwa Oracle tidak menangkap setiap nilai bind tunggal, dan hanya memegang nilai terakhir yang diambil pada interval cursorbindcaptureinterval dan tergantung pada jumlah ruang yang tersedia hingga cursorbindcaptureareasize. Alternatifnya adalah untuk mendapatkan data bind yang digunakan pada waktu parsing dari vsqlplan. Meskipun ini membutuhkan beberapa decoding seperti yang dipegang dalam format RAW dalam kolom XML - lihat entri blog Jonathan Lewis Bind Capture. Yang terhubung ke Membuat Skrip Uji Dengan Variabel Bind dari Kerry Osborne dan Melacak Nilai Bind dari Dion Cho. Hal ini membawa saya pada pertanyaan berikut menggunakan sebuah gagasan dari Kyle Hailey dalam komentar di posting Jonathan Lewis: Dalam pengujian saya yang menggunakan Oracle 11.2.0.2, ini menghilangkan nama pengikat. Pokoknya menangkap nilai-nilai mengikat adalah subjek yang besar, maka saya akan meninggalkan Anda dengan pertanyaan di atas untuk bereksperimen dengan, dan melanjutkan. Sebelumnya SQL, statemen SQL sebelumnya Terkadang berguna untuk melihat seperti apa pernyataan sebelumnya. Vsession berisi beberapa kolom prev, jadi duplikat tab detail untuk SQL Text dan SQL Stats tapi ganti prevsqlid dan prevchildnumber. Statistik objek Saat menyelidiki masalah kinerja, Anda sering ingin memeriksa status statistik saat ini pada tabel yang terlibat dalam kueri. Query di bawah ini bergabung dengan vsqlplanstatisticsall dengan dbatabstatistics untuk mencantumkan informasi ini - tabel partisi yang tidak sempurna jika dipartisi, karena masalahnya mungkin terletak pada statistik partisi individual atau subpartisi, namun merupakan awal. Ganti query Cursors default (pilih dari vopencursor dimana sid: sid) dengan yang berikut untuk menambahkan beberapa statistik aktivitas. (Perhatikan bahwa statistik eksekusi mengacu pada semua sesi, bukan hanya sesi saat ini.) Rencana saat ini PLSQL Developers built-in Explain Plan tool (F5) semuanya baik dan bagus, namun hanya bisa sebagus menjelaskan rencana. Artinya, alat tersebut menggunakan menjelaskan rencana untuk memprediksi rencana eksekusi, dan kemudian menampilkan hasilnya dalam bentuk grafis. Terkadang hal ini tidak sama dengan runtime plan yang sebenarnya. Saat melihat sesi pelaksana saat ini, saya ingin menggunakan dbmsxplan.displaycursor () untuk melihat apa sebenarnya yang sedang dilakukan database. Tentukan tab Current plan dengan menggunakan berikut ini: Komentar gabungan akan membuat Developer PLSQL membungkus semua baris output dari query menjadi satu blok besar. Hal ini membuat lebih mudah dibaca, meski memang juga mencegah scrolling jadi saya tidak yakin semua itu berguna disini. (Sayangnya Anda tidak dapat menentukan font monospace untuk item menu individual, jadi tampilan defaultnya tidak terlalu bagus.) Cara terbaik untuk membacanya adalah dengan menyalin dan menempelkan ke jendela SQL baru. Ini lebih mudah jika Anda mendefinisikan hotkey seperti Alt-S untuk File gt New gt SQL Window seperti yang saya sarankan di bagian 1. (Saya juga memiliki ekstensi Browser Extender untuk melakukan ini dalam satu klik kanan, yang akan datang nanti. ) Saya juga menggunakan variasi lain dari query ini, yang telah saya beri label Current plan GPS (Mengumpulkan Rencana Statistik - walaupun mungkin rencana Extended akan menjadi nama yang lebih baik sekarang saya pikirkan). Ini menggunakan ALLSTATS LAST dalam format argumen untuk dbmsxplan.displaycursor untuk mendapatkan jumlah baris yang diperkirakan dan aktual (kardinalitas) jika kueri menggunakan petunjuk gatherplanstatistics, atau jika statistik parameter ditetapkan ke SEMUA untuk sesi tersebut. Bagian yang sedikit rumit dengan ini adalah Anda tidak dapat menggunakannya sampai permintaan selesai (karena jumlah baris aktual belum diketahui), namun bila selesai, sudah tidak ada lagi kueri yang dijalankan saat ini dan karena itu lenyap dari vsession, dan saat Anda melakukannya Refresh browser sesi Anda yang hilang. Sebagai gantinya Anda perlu menyegarkan layar saat kueri dijalankan, tapi tunggu sampai selesai sebelum membuka tab GPS Rencana Saat Ini. Menunggu saat ini Meskipun sesi menunggu saat ini sudah ditunjukkan pada query master, di atas, saya juga ingin menyimpan informasi di tabnya sendiri. Saya telah memberi label pada objek tunggu yang mendongak dari rowwaitobj karena mungkin tidak terkait sebagai pengingat bahwa meskipun ini adalah objek terbaru yang menunggu sesi ini, pemrosesan mungkin sekarang telah beralih ke hal lain (memilah output misalnya, atau menunggu aplikasi ke Memproses output query) dan sesi sebenarnya tidak mengakses objek ini saat ini. 10 terakhir menunggu Berikut ini adalah sekilas aktivitas sesi dengan menggunakan vsessionwaithistory (waktu tunggu dalam seperseratus detik): vsessionlongops menampilkan status berbagai operasi yang berjalan lebih lama dari 6 detik. Operasi ini saat ini mencakup banyak fungsi backup dan pemulihan, pengumpulan statistik, dan eksekusi kueri, dan lebih banyak operasi ditambahkan untuk setiap rilis Oracle. Jika query menggunakan operasi hash atau sort, pemindaian tabel, operasi partisi dll yang memakan waktu lebih dari 6 detik, operasi ini akan muncul dalam vsessionlongops dan Anda dapat melacak kemajuannya. (Perhatikan bahwa satu-satunya operasi individual yang dilacak, bukan keseluruhan query.) Banyak proses Oracle yang telah berjalan lama diinstruksikan juga, seperti yang manual sebutkan. Lain-lain yang tidak tercantum di atas mencakup Replay Database dan SQL Performance Analyzer berjalan (11g), dan pekerjaan impor impor datapump - dan tentu saja setiap proses Anda sendiri yang Anda sertakan dbmsapplicationinfo.setsessionlongops panggilan untuk mencatat total pekerjaan dan jumlah yang diproses sejauh ini. Saya juga mendefinisikan sebuah ops Long tab query ini, yang merupakan salinan dari yang di atas tapi dengan filter tambahan untuk membatasinya pada operasi yang sedang dijalankan: ringkasan ASH - session vactivesessionhistory adalah sebuah snapshot dari vsession yang diambil sekali setiap detik, ditahan untuk sebuah Periode terbatas (biasanya 30 sampai 60 menit) dan kemudian disimpan dalam dbahistactivesesshistory. (Untuk menggunakan ini, Anda memerlukan Paket Diagnostik, jadi pastikan Anda berlisensi meskipun bekerja - Anda tidak ingin atasan Anda mendapatkan tagihan tak terduga mengikuti audit Oracle.) Ada banyak cara kreatif untuk menambang informasi ini, dan saya menggunakan tiga kueri Untuk melacak sesi yang sedang berjalan saat ini. Karena sampel ASH setiap detik, dapat berguna untuk meringkasnya dengan pernyataan SQL dan mencantumkan hasilnya berdasarkan waktu yang dibutuhkan. Jika Anda menonton prosedur atau batch yang memanggil beberapa pernyataan, ini memberi gambaran umum tentang sesi yang menghabiskan waktunya (sedikit seperti menelusuri sesi). Permintaan berikut memberikan satu baris per sqlid. Dalam urutan total waktu, dengan total di bagian bawah. Ringkasan ASH - eksekusi Saya juga memiliki versi yang lebih rinci yang dimungkinkan di 11g oleh kolom sqlexecstart dalam vactivesessionhistory. Yang memungkinkan saya melihat eksekusi individual dari pernyataan SQL daripada satu baris gabungan. ASH ringkasan - waktu kursor objek Laporan menunjukkan objek menunggu oleh semua pernyataan SQL untuk sesi tertentu. Ini dimaksudkan sebagai cara cepat untuk melihat seperti apa sesi yang telah menghabiskan waktunya, dalam hal objek dan bukan kueri. ASH ringkasan query ini dengan pemanggil Selanjutnya saya memiliki query GROUP-BY untuk sqlid saat ini. Dalam urutan hitungan sampel. Idenya adalah untuk melihat di mana waktu yang dihabiskan dalam pernyataan yang sedang dijalankan (bukan pernyataan yang telah mengambil waktu dalam sesi saat ini). Sejak Active Session History menggunakan interval polling 1 detik, sesuatu yang terjadi pada 10 sampel mungkin telah memakan waktu sekitar 10 detik. Perhatikan bahwa itu hanya filter pada sqlid. Jadi beberapa eksekusi dari kueri yang sama oleh sesi akan digabungkan bersama-sama. (Di 11g Anda bisa menggunakan kolom sqlexecid baru untuk membedakan antara eksekusi.) Ingat juga bahwa ASH dapat melakukan aktivitas sampel seperti On CPU bersama dengan objek database - ini hanya berarti objek terakhir diakses pada saat sampel diambil, bukan Bahwa CPU tentu saja terkait dengan objek itu. Saya memiliki dua rasa yang satu ini, dengan dan tanpa rincian prosedur pemanggilan PLSQL. ASH ringkasan query SQL saja Ini sama dengan query sebelumnya, tapi tanpa pemanggilan rincian PLSQL untuk memberi tampilan akses database yang lebih jelas. ASH detail sesi ini Akhirnya, saya memiliki daftar riwayat vactivesessionession yang lurus untuk sesi saat ini sehingga Anda bisa mendapatkan ide tentang apa yang sedang dilakukannya: Penyiapan default tidak disertakan dengan tab Kunci. Katakanlah sesi melakukan tindakan berikut: Tab Kunci default menampilkan ini: Mengubahnya menjadi berikut ini memberikan beberapa rincian lebih lanjut: Pengoptimal tidak standar Saya merasa berguna untuk memeriksa setelan pengoptimalan yang digunakan oleh sesi tertentu (yang mungkin bukan Pengaturan yang sama seperti sesi Anda atau default contohnya). Ini mengikuti vsysoptimizerenv (parameter sistem yang terkait dengan pengoptimasi) dengan vsesoptimizerenv (parameter sesi yang terkait dengan pengoptimasi, yang pada awalnya diwariskan dari pengaturan tingkat sistem namun mencerminkan perubahan yang dibuat oleh perintah alter session) dan melaporkan perbedaan. Ruang Temp Berapa ruang temporer yang digunakan sesi ini untuk bergabung dengan hash, semacam salinan dll William Robertson 2011 Berlangganan artikel Berlangganan kode dan skripSQL Correlated Subquery Summary. Dalam tutorial ini, Anda akan belajar tentang subkueri yang berhubungan dengan SQL. Yang merupakan subkueri yang bergantung pada kueri luar. Tutorial ini membutuhkan pengetahuan yang baik tentang subkueri. Jika Anda tidak tahu apa-apa tentang subkueri itu. Check it out the subquery tutorial sebelum bergerak maju dengan tutorial ini. Pengantar subquery berkorelasi SQL Subquery yang berkorelasi adalah subkueri yang bergantung pada kueri luar. Ini berarti klausa WHERE dari subkueri yang berkorelasi menggunakan data kueri luar. Perbedaan utama antara subkueri yang berkorelasi dan subkueri yang tidak berkorelasi adalah bahwa Anda tidak dapat mengeksekusi subkueri yang berkorelasi sendiri seperti subkueri yang tidak berkorelasi. Selain itu, subkueri yang berkorelasi mengeksekusi satu kali untuk setiap baris yang dipilih dari kueri luar. Subkueri yang berkorelasi juga dikenal sebagai subkueri ulang atau subkueri yang disinkronisasi. Contoh subquery yang berkorelasi SQL Mari kita lihat beberapa contoh untuk memahami gagasan subkueri yang berkorelasi. SQL correlated subquery pada contoh SELECT clause Query berikut memilih lima pelanggan teratas dengan penjualan: Bagaimana menganalisis kinerja SQL Server 24 Februari 2014 Jadi, Anda memiliki database SQL Server yang digunakan aplikasi Anda dan sepertinya lambat. Bagaimana Anda memecahkan masalah ini? Di mana Anda melihat Apa yang Anda ukur, saya harap artikel ini akan menjawab pertanyaan yang cukup untuk Anda mulai sehingga Anda dapat mengidentifikasi kemacetan itu sendiri, atau mengetahui apa yang harus dicari untuk memperluas arsenal dan pengetahuan Anda lebih lanjut. Bagaimana cara kerja SQL Server Agar dapat memecahkan masalah kinerja, Anda harus memiliki pemahaman tentang bagaimana SQL Server bekerja. Penjelasan yang sangat disederhanakan adalah bahwa SQL Server menjalankan query Anda sebagai berikut: Aplikasi mengirimkan permintaan ke server, berisi nama prosedur tersimpan atau beberapa pernyataan T-SQL. Permintaan ditempatkan dalam antrian di dalam memori SQL Server. Sebuah thread gratis dari kolam thread thread milik SQL Server8217s mengambil permintaan tersebut, mengkompilasi dan mengeksekusinya. Permintaan tersebut dieksekusi oleh pernyataan pernyataan, secara berurutan. Sebuah pernyataan dalam sebuah permintaan harus selesai sebelum dimulai berikutnya, selalu. Prosedur tersimpan mengeksekusi dengan cara yang sama, pernyataan berdasarkan pernyataan. Pernyataan dapat membaca atau memodifikasi data. Semua data dibaca dari cache in-memory dari database (buffer pool). Jika data tidak dalam cache ini, maka harus dibaca dari disk ke cache. Semua pembaruan ditulis ke dalam log database dan masuk ke cache dalam memori (ke dalam kolam penyangga), sesuai dengan protokol Write-Ahead Logging. Penguncian data memastikan kebenaran dalam concurrency. Ketika semua pernyataan dalam permintaan telah dijalankan, thread bebas untuk mengambil permintaan lain dan menjalankannya. Permintaan adalah eksekusi atau menunggu Hal ini mungkin terdengar sepele, namun memahami bahwa permintaan tersebut dijalankan atau sedang menunggu sesuatu (ditangguhkan) adalah kunci untuk mengatasi masalah kinerja SQL Server. Jika permintaan yang dikirim ke SQL Server butuh waktu lama untuk mengembalikan hasilnya maka mereka akan membutuhkan waktu lama untuk mengeksekusi atau mereka membutuhkan waktu lama untuk menunggu. Mengetahui apakah satu kasus atau yang lainnya sangat penting untuk mengetahui kemacetan kinerja. Selain itu, jika permintaan memakan waktu lama menunggu, kita bisa menggali lebih jauh dan mencari tahu apa yang mereka tunggu dan berapa lama. Memahami permintaan Menunggu Permintaan menunggu ada data Wait Info Setiap kali permintaan dihentikan, untuk alasan apapun, SQL Server akan mengumpulkan informasi tentang mengapa diskors dan untuk berapa lama. Dalam kode SQL Server internal tidak ada cara untuk memanggil fungsi yang menunda tugas tanpa menyediakan data info tunggu yang diminta. Dan data ini kemudian dikumpulkan dan tersedia untuk Anda dalam banyak cara. Data info tunggu ini sangat penting dalam menentukan masalah kinerja: Permintaan yang saat ini dijalankan yang ditangguhkan sekarang Anda dapat melihat apa yang menunggu dan berapa lama telah menunggu. Permintaan yang saat ini dijalankan yang dijalankan saat ini, Anda dapat melihat hal terakhir yang ditunggu. Anda bisa mengerti kapan permintaan menunggu permintaan lainnya. Anda bisa mendapatkan agregat untuk apa yang paling banyak ditunggu sumber daya (sibuk) di seluruh server. Anda dapat memahami sumber daya fisik (perangkat keras) yang jenuh dan menyebabkan masalah kinerja. Tunggu Info untuk saat ini mengeksekusi permintaan Untuk setiap permintaan yang dijalankan pada SQL Server ada baris di sys.dmexecrequests. Dengan mengajukan DMV ini, setiap saat, memberi Anda gambaran cepat tentang segala hal yang dilakukan saat itu juga. Waittype Kolom waittime dan lastwaittype akan memberi Anda nuansa langsung tentang apa yang 8216runnig8217 vs. apa yang sedang menunggu dan apa yang sedang menunggu: Permintaan pada sesi 53 adalah SELECT dan saat ini menunggu. Ini sedang menunggu di kunci. Sesi 54 adalah INSERT dan saat ini sedang menunggu. Ini sedang menunggu di kait halaman. Sesi 55 adalah INSERT dan saat ini sedang berjalan. Tunggu sebelumnya adalah kait halaman. Sesi 56 adalah INSERT dan saat ini sedang menunggu. Menunggu log database menjadi flush (melakukan transaksi). Sesi 57 adalah INSERT dan saat ini sedang menunggu. Menunggu log database menjadi flush. Perhatikan bahwa permintaan untuk sesi 54 memiliki status berjalan tapi sebenarnya menunggu. Ini karena kait menunggu diperkirakan akan singkat. Blockingsessionid juga memberitahu kita, untuk beberapa tugas menunggu, permintaan lain apa yang menahan sumber daya yang saat ini sedang menunggu. Sesi 53 menunggu sesi 56 untuk kunci kunci kunci, yang berarti SELECT sedang mencoba membaca baris yang dikunci oleh INSERT. SELECT tidak akan dilanjutkan sampai INSERT melakukan. Sesi 54 sedang menunggu sesi 55 untuk kait halaman, yang berarti bahwa sesi 55 INSERT memodifikasi halaman data itu sekarang dan data pada halaman tidak stabil, tidak boleh dibaca. Sesi 56 dan 57 sedang menunggu tapi tidak ada sesi lain yang menghalangi mereka. Mereka menunggu log ke 8216flush8217, yang berarti mereka harus memastikan catatan komit untuk transaksi mereka telah ditulis dengan baik ke disk. Mereka tidak akan melanjutkan sampai pengontrol disk mengenali bahwa log itu ditulis. Berikut adalah contoh lain: Permintaan pada sesi 53 adalah COMMIT dan saat ini sedang menunggu. Menunggu log database menjadi flush. Sesi 54 adalah sebuah SELECT dan saat ini sedang menunggu. Ini sedang menunggu di kunci. Sesi 55 adalah sebuah SELECT dan saat ini sedang menunggu. Ini sedang menunggu di kunci. Sesi 56 adalah SELECT dan saat ini sedang menunggu. Ini sedang menunggu di kunci. Sesi 57 adalah sebuah SELECT dan saat ini sedang menunggu. Ini sedang menunggu di kunci. Perhatikan bahwa dalam contoh ini setiap permintaan benar-benar ditangguhkan. Pada saat ini server pada dasarnya tidak melakukan apapun. Kami memiliki 4 sesi (54, 55, 56 dan 57) menunggu kunci yang sama (baris dengan kunci kunci sumber daya KUNCI: 5: 72057594039369728 (ac11a2bc89a9)). Sesi 54 sedang menunggu sesi 55 dan sesi 55 sedang menunggu sesi 53 yang berarti sesi 54 benar sedang menunggu sesi 53. Jadi semua orang menunggu sesi 53, yang menunggu kontroler disk untuk menulis catatan log pada disk. Kita juga bisa melihat, dari kolom waittime, berapa lama setiap sesi menunggu: sekitar 160 milidetik. Perhatikan bagaimana pada contoh sebelumnya, kami hanya memiliki satu permintaan yang benar-benar kehabisan 5. I8217m menjalankan kueri ini di workstation dengan 8 core, banyak RAM dan disk yang layak, jadi ada banyak perangkat keras untuk membawa permintaan ini, namun sebaliknya Sebagian besar waktu menunggu alih-alih mengeksekusi. Untuk membuat permintaan Anda lebih cepat, Anda perlu melakukannya agar tidak dieksekusi daripada menunggu. Memiliki permintaan paling banyak (atau bahkan semua) menunggu, daripada mengeksekusi, sesuatu yang tidak biasa Sama sekali, ini adalah norma Kapan pun Anda akan melihat penerapan SQL Server Sebuah beban moderat sekalipun, Anda akan melihat bahwa sebagian besar permintaan sedang menunggu dan hanya sedikit yang mengeksekusi. Apa yang perlu diwaspadai untuk menunggu lama atau singkat tapi berulang menunggu itu bertambah. Lama menunggu menunjukkan beberapa sumber daya yang dimiliki untuk waktu yang lama, dan biasanya ini terjadi dengan kunci. Waktu tunggu yang berulang menunjukkan sumber daya yang sedang jenuh, mungkin merupakan hot spot untuk kinerja. Sebelum aku melangkah lebih jauh, aku hanya ingin menunjukkan sys.dmoswaaskaskaskask. Yang merupakan SQL Server DMV yang dirancang khusus untuk menunjukkan tugas menunggu saat ini: Sesi 53 sedang menunggu log untuk menyiram Sesi 57 menunggu 40 ms untuk kunci berturut-turut dan diblokir oleh sesi 53 (yang karenanya harus memiliki kunci) Sesi 54 menunggu 37 ms untuk kunci berturut-turut dan diblokir oleh sesi 57 (tapi sesi ke 57 pada gilirannya diblokir oleh sesi 53) Situasi yang kita hadapi di sini jauh lebih mirip dengan skenario sebelumnya, di mana kita memiliki 4 sesi SELECT Diblokir oleh INSERT. Dia bisa melihat di sini dua permintaan diblokir dengan mencoba membaca satu baris (jadi mungkin itu SELECT) dan sesi pemblokirannya menunggu transaksinya berlangsung lama. Informasi dalam DMV ini sangat mirip dengan yang ada di daftar sys.dmexecrequests dan yang terakhir memiliki lebih banyak informasi, namun ada satu kasus penting di mana informasi di sys.dmexecrequests menyesatkan: kueri paralel. Untuk memahami jenis tunggu CXPACKET, Anda perlu melihat ke dalam tugas paralel anak Bila sebuah pernyataan bisa mendapatkan keuntungan dari eksekusi paralel mesin akan membuat banyak tugas untuk permintaan tersebut, masing-masing memproses subkumpulan data. Masing-masing tugas ini bisa dijalankan di CPUcore yang terpisah. Permintaan berkomunikasi dengan tugas ini pada dasarnya menggunakan antrian konsumen produsen. Operator query yang menerapkan antrian ini disebut operator Exchange (I8217m yang benar-benar menyederhanakannya, baca The Parallelism Operator (aka Exchange) untuk deskripsi yang lebih akurat). Jika antrian konsumen produsen ini kosong (artinya produsen tidak memasukkan data ke dalamnya) konsumen harus menangguhkan dan menunggu dan jenis menunggu yang sesuai adalah tipe tunggu CXPACKET. Permintaan yang menunjukkan jenis menunggu ini benar-benar menunjukkan bahwa tugas yang seharusnya menghasilkan data untuk dikonsumsi tidak menghasilkan data (atau cukup). Tugas produsen ini pada gilirannya dapat ditangguhkan, menunggu jenis wait lain dan itulah yang menghalangi permintaan Anda, bukan operator pertukaran. Berikut adalah sebuah contoh: Disini kita dapat melihat bahwa permintaan pada sesi 54 memiliki 3 tugas menunggu, dan sementara permintaan waittype menunjukkan CXPACKET. Salah satu tugas anak paralel sebenarnya menunggu kunci halaman. Statistik tunggu gabungan: sys.dmoswaitstats SQL Server mengumpulkan statistik tentang semua tipe tunggu dan menampilkannya dalam sys.dmoswaitstats. Jika melihat permintaan yang sedang dijalankan dan tugas menunggu menunjukkan kepada kita apa yang sedang menunggu kapan saja, statistik agregat memberikan status kumulatif sejak server dinyalakan. Mengajukan DMV ini sangat mudah, namun menafsirkan hasilnya sedikit lebih rumit: Pertama, apa masalahnya dengan semua jenis wait yang mengambil bagian lion8217s di bagian atas hasil DIRTYPAGEPOOL. REQUESTFORDEADLOCKSEARCH. LAZYWRITERSLEEP. Kami tidak melihat ada permintaan yang menunggu ini Inilah alasannya: Dengan menambahkan sesi WHERE WHERE, kami memfilter tugas latar belakang, benang internal untuk SQL Server yang ditugaskan untuk berbagai pekerjaan pemeliharaan. Banyak dari tugas latar belakang ini mengikuti pola seperti 8220 menunggu sebuah acara, saat acara diberi isyarat melakukan beberapa pekerjaan, lalu menunggu lagi8221, sementara pola bercorak pola tidur lainnya (tertidur selama 5 detik, terbangun dan melakukan sesuatu, kembali Tidur 5 detik8221). Karena tidak ada tugas yang dapat menangguhkan dirinya sendiri tanpa memberikan jenis menunggu, ada jenis menunggu untuk ditangkap saat tugas latar belakang ini menangguhkan diri mereka sendiri. Karena pola eksekusi ini menghasilkan tugas yang benar-benar ditangguhkan hampir sepanjang waktu, waktu tunggu agregat untuk jenis menunggu ini sering mengalahkan setiap jenis menunggu lainnya. Komunitas SQL Server datang untuk memberi nama jenis tunggu ini. Tunggu sampai waitholder8217 dan kebanyakan ahli memiliki daftar tipe tunggu yang mereka filterkan saja, misalnya lihat Menyaring menunggu jinak: Sekarang kita memiliki gambaran yang lebih koheren tentang menunggu. Gambar tersebut memberi tahu kita jenis tunggu apa yang paling umum, secara agregat, contoh SQL Server ini. Ini bisa menjadi langkah penting untuk mengidentifikasi penyebab kemacetan. Selanjutnya, menafsirkan data adalah data yang subjektif. Apakah nilai WRITELOG gabungan dari 4636805 milidetik baik atau buruk, saya tidak tahu Apakah agregat, terakumulasi sejak proses ini berjalan, maka jelas akan meningkat secara kontinu. Mungkin itu telah mengumpulkan nilai dari periode ketika server berjalan lancar dan dari periode ketika berjalan buruk. Namun, sekarang saya tahu, dari semua jenis menunggu, WRITELOG adalah yang paling banyak menunggu waktu. Saya juga tahu bahwa maxwaittime untuk tipe wait ini, jadi saya tahu setidaknya ada satu waktu ketika sebuah tugas harus menunggu 1,4 detik agar log itu disiram. Waittaskcount memberi tahu saya berapa banyak waktu menunggu jenis menunggu, dan membagi waittimemswaittaskcount akan memberi tahu saya waktu rata-rata jenis menunggu tertentu telah ditunggu. Dan saya melihat beberapa tipe wait lock yang terkait: LCKMS. LCKMIS dan LCKMIX. Saya sudah bisa mengetahui beberapa hal tentang keseluruhan perilaku server, dari sudut pandang kinerja: membilas log adalah sumber daya yang paling banyak ditunggu di server, dan pertengkaran kunci tampaknya merupakan masalah utama berikutnya. Tipe tunggu CXPACKET ada di atas, tapi kami tahu bahwa tipe tunggu CXPACKET paling banyak hanya pengganti jenis wait lainnya, seperti yang dibahas di atas. Bagaimana dengan yang lain dengan tipe dalam daftar, seperti SOSSCHEDULERYIELD. PAGELATCHEXSH atau PAGEIOLATCHEXSHUP Jenis menunggu umum Untuk menyelidiki jenis tunggu dan waktu menunggu, baik agregat atau untuk kueri individual, orang perlu memahami arti nama tunggu. Banyak nama yang menggambarkan dirinya sendiri, ada yang samar dalam nama mereka dan ada pula yang dengan sengaja menipu namanya. Menurut saya sumber terbaik untuk membaca deskripsi mendetail tentang namanya adalah kertas putih Waits and Queues. Ini memiliki daftar alfabetis tipe tunggu, deskripsi dan sumber fisik yang berkorelasi dengannya. Kertas putih agak tua (mencakup SQL Server 2005) namun tetap sangat relevan. The wait type names for important resources has not changed since SQL server 2005, what you8217ll be missing will be newer wait type names related to post SQL Server 2005 features. The wait types are briefly documented also in the sys.dmoswaittypes topic on MSDN. Disk and IO related wait types PAGEIOLATCH This is the quintessential IO, data read from disk and write to disk wait type. A task blocked on these wait type is waiting for data to be transferred between the disk and the in-memory data cache (the buffer pool). A system that has high aggregate PAGEIOLATCH wait types is very likely memory starved and is spending much time reading data from the disk into the buffer pool. Be careful not to confuse this wait type with the PAGELATCH wait type (not the missing IO in the name). WRITELOG This wait type occurs when a task is issuing a COMMIT and it waits for the log to write the transaction commit log record to disk. High average wait times on this wait type indicate that the disk is writing the log slowly and this slows down every transaction. Very frequent waits on this wait type are indicative of doing many small transaction and having to block frequently to wait for COMMIT (remember that all data writes require a transaction and one is implicitly created for each statement if no BEGIN TRANSACTION is explicitly used). IOCOMPLETION This wait type occurs for tasks that are waiting for something else that ordinary data IO. Misalnya. loading an assembly DLL, reading and writing TEMPDB sort files. some special DBCC data reading operations. ASYNCIOCOMPLETION This wait type is mostly associated with backup, restore, database and database file operations. If your wait time analysis finds that IO and disk are important wait types then your should focus on analyzing disk activity . Memory related wait types RESOURCESEMAPHORE This wait type indicate queries that are waiting for a memory grant. See Understanding SQL Server memory grant. OLTP type workload queries should not require memory grants. if you see this wait type on an OLTP system then you need to revisit your application design. OLAP workloads often are in need of (sometimes large) memory grants and large wait times on this wait type usually point toward RAM increase upgrades. SOSVIRTUALMEMORYLOW Are you still on 32 bit systems Move on Network related wait types ASYNCNETWORKIO This wait type indicate that the SQL Server has result sets to send to the application but the application odes not process them. This may indicate a slow network connection. But more often the problem is with the application code, it is either blocking while processing the result set or is requesting a huge result set. CPU, Contention and Concurrency related wait types LCK Locks. All wait types that start with LCK indicate a task suspended waiting for a lock. LCKMS wait types indicate a task that is waiting to read data (shared locks) and is blocked by another task that had modified the data (had acquired an exclusive LCKMX lock). LCKMSCH wait types indicate object schema modification locks and indicate that access to an object (eg. a table) is blocked by another task that did a DDL modfication to that object ( ALTER ). PAGELATCH Do not confuse this wait types with the PAGEIOLATCH wait types. High wait times on these wait types indicate a hot spot in the database, a region of the data that is very frequently updated (eg. it could be a single record in a table that is constantly modified). To further analyze, I recommend the Diagnosing and Resolving Latch Contention on SQL Server white paper. LATCH These wait types indicate contention on internal SQL Server resources, not on data (unlike PAGELATCH they do not indicate a hot spot in the data). To investigate these waits you need to dig further using the sys.dmoslatchstats DMV which will detail the wait times by latch type. Again, the best resource is Diagnosing and Resolving Latch Contention on SQL Server white paper. CMEMTHREAD This wait type occurs when tasks block on waiting to access a shared memory allocator. I placed thi here, in concurrency section, and not in 8216memory8217 section because the problem is related to internal SQL Server concurrency. If you see high CMEMTHREAD wait types you should make sure you are at the latest SQL Server available Service Pack and Cumulative Update for your version, because some of these kind of problems denote internal SQL Server issues and are often addressed in newer releases. SOSSCHEDULERYIELD This wait type can indicate spinlock contention. Spinlocks are extremely light wait locking primitives in SQL Server used for protecting access to resources that can be modified within few CPU instructions. SQL Server tasks acquire spinlocks by doing interlocked CPU operations in a tight loop, so contention on spinlocks burns a lot of CPU time (CPU usage counters show 90-100 usage, but progress is slow). Further analysis need to be done using sys.dmosspinlockstats : RESOURCESEMAPHOREQUERYCOMPILE This wait type indicate that a task is waiting to compile its request. High wait times of this type indicate that query compilation is a bottleneck. For more details I recommend reading Troubleshooting Plan Cache Issues. SQLCLRQUANTUMPUNISHMENT This wait type occurs if you run CLR code inside the SQL Server engine and your CLR code does not yield the CPU in time. This results in an throttling of the CLR code (8220punishment8221). If you have CLR code that can potentially hijack the CPU for a long time you must call Thread.BeginThreadAffinity() . For more details I recommend watching Data, Faster: Microsoft SQL Server Performance Techniques with SQLCLR. Special wait types TRACEWRITE This wait type indicate that tasks are being blocked by SQL Profiler. This wait type occurs only if you have SQL Profiler attached to the server. This wait type occur often during investigation if you had set up a SQL Profiler trace that is too aggressive (gets too many events). PREEMPTIVEOSWRITEFILEGATHER This wait type occurs, among other things, when auto-growth of files is triggered. Auto-growth occurs when a insufficiently sized file is grown by SQL Server and is a hugely expensive event. During growth event all activity on the database is frozen. Data file growth can be made fast by enabling instant file growth, see Database File Initialization. But log growth cannot benefit from instant file initialization so log growth is always slow, sometimes very slow. Log Auto-Growth events can be diagnosed by simply looking at the Log Growths performance counter in the SQL Server, Databases Object. if is anything but 0 it means log auto-growth had occurred at least once. Real-time monitoring can be done by watching for Data File Auto Grow Event Class and Log File Auto Grow Event Class events in SQL Profiler. I did not cover many wait types here (eg. CLR . SQLCLR . SOSHOST . HADR . DTC and many more). If you encounter a wait type you do not understand, usually just searching online for its name will reveal information about what that wait type is what potential bottleneck it indicates, if any. Analyze disk activity: IO stats SQL Server needs to read and write to the disk. All writes (inserts, updates, deletes) must be written to disk. Queries always return data from the in-memory cache (the buffer pool) but the cache may not contain the desired data and has to be read from disk. Understanding if the IO is a bottleneck for your performance is a necessary step in any performance investigation. SQL Server collects, aggregates and exposes information about every data and log IO request. First thing I like to look at is sys.dmiovirtualfilestats . This DMV exposes the number of writes and reads on each file for every database in the system, along with the aggregated read and write IO 8216stall8217 times. Stall times are the total time tasks had to block waiting for transfer of data to and from disk. The per file IO stats are aggregated since server start up but be aware that they reset for each file if it ever goes offline. The total number of bytes transferred (reads and writes) is a good indicator of how busy is a database from IO point of view. The stalls indicate which IO subsytem (which disk) is busy and may even be saturated. Analyzing individual query execution When analyzing an individual statement or query for performance allows us to understand what the query is doing, how much is executing vs. what is waiting on. The most simple analysis is to use the execution statistics. These work by first running the appropriate SET STATISTICS. ON in your session and then executing the statement or query you want to analyze. In addition to the usual result, the query will also report execution statistics, as follows: SET STATISTICS TIME ON The query parse time, compile time and execution time are reported. If you execute a batch or a stored procedure with multiple statements then you get back the time for each statement, which helps determining which statement in a procedure is the expensive one. But we8217ll see that analyzing the execution plan reveals the same information, and more. SET STATISTICS IO ON The IO statistics show, for each statement, the number of IO operations. The result shows several metrics for each table touched by the statement : scan count Number of times the scans or seeks were started on the table. Ideally each table should be scanned at most once. logical reads Number of data pages from which rows were read from the in-memory cache (the buffer pool). physical reads Number of data pages from which data was had to be transferred from disk in-memory cache (the buffer pool) and the task had to block and wait for the transfer to finish. read-ahead reads Number of data pages that were asynchronously transferred from disk into the buffer pool opportunistically and the task did not had to wait for the transfer. LOB logicalphysicalread-ahead reads Same as their non-lob counterparts, but referring to reading of large columns (LOBs). There is also the SET STATISTICS PROFILE ON . which provides a detailed execution information for a statement, but much of the information overlaps with the execution plan info and I think analyzing the execution plan is easier and yields better information. Logical Reads are the best measure of a statement cost. A large logical reads value for a statement indicates an expensive statement. For OLTP environments the number of logical reads should be in single digits. Large logical reads count translate to long execution times and high CPU consumption even under ideally conditions. Under less ideal conditions some or all of these logical reads turn into physical reads which mean long wait times waiting for disk transfer of data into the buffer pool. Large logical reads are indicative of large data scans, usually entire table end-to-end scan. They are most times caused by missing indexes. In OLAP, decision and DW environments, scans and large logical reads may be unavoidable as indexing for an OLAP workload is tricky, and indexing for an ad-hoc analytic workload is basically impossible. For these later cases the answer usually relies in using DW specific technologies like columnstores . Information about query execution statistics can also be obtained using SQL Profiler. The SQL:StmtCompleted . SQL:BatchCompleted , SP:StmtCompleted and RPC:Completed capture the number of page reads, the number of page writes and the execution time of an individual invocation of a statement, a stored procedure or a SQL batch. The number of reads is logical reads. Note that monitoring with SQL Profiler for individual statement completed events will have effect on performance and on a big busy server it can cause significant performance degradation. You can also see the number of logical reads, reads and writes as it happens by looking at the sys.dmexecrequests but this information is visible only if while a request is running. Furthermore the number aggregate all statements in a request so you cannot determine the cost of an individual statement using this DMV. Analyzing individual query execution wait times If you need to drill down more detail that execution time and IO statistics for a query or for a stored procedure, the best information is the wait types and wait times that occurred during execution. Obtaining this information is no longer straightforward though, it involves using Extended Events monitoring. The method I8217m presenting here is based on the Debugging slow response times in SQL Server 2008 article. It involves creating an extended event session that captures the sqlos.waitinfo info and filter the extended events session for a specific execution session (SPID): With the Extended Events session created and started, you can now run the query or procedure you want to analyze. After that, stop the Extended Event session and look at the captured data: As you can see the Extended Events session captured each individual wait, each incident when the session was suspended. If we click on an individual captured event we see the event data XML: This is a 4 millisecond wait for an IX mode lock. Another 2 milliseconds had spent until the task resumed, after the lock was granted. You can shred out the XML into columns for a better view: Finally, we can aggregate all the data in the captured Extended Events session: This is an exceptional wealth of information about what happened during the execution of my request. 742 times it waited on the log commit to be written to disk for a total of 14 seconds wait time, 12 times it waited for a lock, 2 times for a page latch etc. If your curious, my workload I captured was a single row INSERT in a loop. Analyzing Execution Plans SQL Server can expose the actual execution plan for queries. The actual query tree gets serialized as XML and there are several ways to obtain it: SET SHOWPLANXML ON in the session you execute your query. Use the SQL Profiler, see Displaying Execution Plans by Using SQL Server Profiler Event Classes . Enable the Include Actual Execution Plan in SSMS, see Displaying Graphical Execution Plans . Use sys.dmexecqueryplan function to obtain the plan XML from a plan handle. The plan handle can be obtained from DMVs like sys.dmexecrequests (currently executing queries) or sys.dmexecquerystats (past executed queries). If you dont know anything about execution plans then focus on thick arrows I will not enter into much detail into how to analyze a query plan because the subject is way too vast for this article. Execution plans capture what the query did . namely what operators it executed, how many times was each operator invoked, how much data did each operator process and how much data it produced in turn, and how much actual time it took for each operation. Unlike the wait times analysis, analyzing the execution focuses on runtime and where was the actual CPU time consumed on. The graphical display of SSMS simplifies the information in an execution plan XML to make it more easily consumable and the graphical representation makes easy to stop the bottlenecks. Thick arrows represent large data transfers between operators, meaning that operators had to look at a lot of rows to produce their output. Needless to say, the more data an operator needs to process, the more time it takes. Hovering over operators display a popup info note with details about the operator. A large actual row count shows large amount of data being processed. The popup include also the estimated row count which is how much data SQL Server had predicted the operator will process, based on the table statistics. A wild discrepancy between actual and estimated often is responsible for bad performance and can be tracked to outdated statistics on the table. Another are of interest in the execution plan are the operators themselves. Certain operators are inherently expensive, for example sort operators. An expensive operator coupled with a large data input is usually the cause of a huge execution time. Even if you do no know which operators are expensive and which are not, the execution plan contains the cost associated with each operator and you can use this information to get an idea for where problems may be. Identifying problem queries SQL Server exposes the runtime execution statistics for most queries it had run in sys.dmexecquerystats . This DMV shows the number of times a query had run, totalmaxminlast active CPU time (worker time), totalmaxminlast elapsed wall-clock time, totalmaxminlast logical reads and logical writes, totalmaxminlast number of rows returned. This kind of information is a real treasure cove to identify problems in an application: Large execution count Queries that are run frequently are the most sensitive for performance. Even if they perform acceptable, if they are run often then small improvements in each individual execution can yield overall significant speed. But even better is to look, with a critical eye, into why is the query executed often. Application changes can reduce the number of execution count. Large logical reads A query that has to scan large amounts of data is going to be a slow query, there is no question about this. The focus should be in reducing the amount of data scanned, typically the problem is a missing index. A bad query plan can also be a problem. A high number of logical reads is accompanied by a high worker time but the issue is not high CPU usage, but the focus should be on large logical reads. Large physical reads This is basically the same problem as large logical reads, but it also indicates that your server does not have sufficient RAM. Luckily this is, by far, the easiest problem to solve: just buy more RAM, max out the server RAM slots. Youre still going to have a large logical reads, and you should address that problem too, but addressing an application design issue is seldom as easy as ordering 1TB of RAM. High worker time with low logical reads This case is not very common and indicates an operation that is very CPU intensive even with little data to process. String processing and XML processing are typical culprits and you should look at moving the CPU burn toward the periphery, in other words perform the CPU intensive operations on the client, not on the server. High elapsed time with log worker time A query that takes a long wall-clock time but utilizes few CPU cycles is indicative of blocking. This is a query that was suspended most of the time, waiting on something. Wait analysis should indicate the contention cause, the resource being waited for. High total rows count Large result sets requested by the application can be justified in an extremely low number of cases. This problem must be addressed in the application design. Finding a problem query using sys.dmexecquerystats becomes a simply exercise of ordering by the desired criteria (by execution count to find frequently run queries, by logical reads, by elapsed time etc). Tho get the text of the query in question use sys.dmexecsqltext . and to get the query execution plan use sys.dmexecqueryplan : If you do not know what kind of problem query to look for to start with, my advice is to focus in this order: High execution count. Identifying what queries are run most often is in my opinion more important that identifying which queries are particularly slow. More often than not the queries found to be run most often are a surprise and simply limiting the execution count yield significant performance improvements. High logical reads. Large data scans are the usual culprit for most performance problems. They may be caused by missing indices, by a poorly designed data model, by bad plans caused by outdated statistics or parameter sniffing and other causes. High elapsed time with low worker time. Blocking queries do not tax the server much, but your application users do not care if the time they waited in front of the screen for a refresh was spent active or blocked. Missing Indexes Repeatedly I said that performance problems are caused by missing indexes, and SQL Server has a feature aptly named Missing Indexes : The missing indexes feature uses dynamic management objects and Showplan to provide information about missing indexes that could enhance SQL Server query performance. Personally I seldom focus my analysis on the built in missing index feature. To start with the feature has known limitations. but more importantly is that the feature is starting with the solution, wo first searching for a cause. I always start with identifying problem queries first, searching for ones which would yield the highest bang for the buck. Once a problem query is identified as causing large scans, the missing index DMVs can be consulted to identify a candidate. But you should always take the recommendations with a grain of salt. The missing index feature does not know what the query is doing from an application business logic point of view. Reviewing the query can potentially find a better solution than what the automated missing index feature may recommend. Experienced administrators have in place automation that periodically inspects the missing index DMVs and find potential hot spots and problems. This is a very good proactive approach. But in most cases the performance problems are hot and immediate, and finding them using wait analysis or query execution stats is a more direct process. For a more in depth discussion of missing indexes DMVs I recommend spBlitzIndex . TEMPDB Performance tempdb is the special SQL Server database that is used to store any transient data, including things like temporary tables, static cursors, table variables, sort runs, internal worktables, the version store and piles more. Even though the problems that can occur with tempdb are ultimately CPU, IO or contention problems, tempdb deserves a special topic because some of these problems can be understood at a higher level as tempdb problems, as opposed to, say, low level latch contention problems. tempdb also tends to manifest a set of problems entirely of its own, specially due to the very high rate of creation and destruction of objects in tempdb. MSDN has an Optimizing tempdb Performance topic which contains some practical advice, and Cindy Gross has compiled a collection of SQL Server TempDB IO Best Practices . Make each tempdb data file the same size In general I tried to emphasize the importance of measuring and understanding SQL Server performance characteristics instead of blindly following advice. But here is one piece of advice that I always give, wo any secondary consideration: make sure tempdb is stored on files of identical size, with identical growth characteristics. Ive spent just too many hours chasing difficult to diagnose issues to discover that theyre ultimately caused by unaligned tempdb files. I would also recommend as mandatory reading Martin Smiths answer to this dba.stackexchange question:Whats the difference between a temp table and table variable in SQL Server. The answer goes in great detail not only from a tempdb usage point of view, but also impact on locking, compilation, parallelism and indexability, all critical components of performance. SQL Server Performance Counters Performance counters offer a different perspective into SQL Server performance than the wait analysis and execution DMVs do. The biggest advantage of performance counters is that they are extremely cheap to collect and store so they lend themselves as the natural choice for long term monitoring. Looking at current performance counter numbers can reveal potential problems, but interpreting the values is subject to experience and there are a lot of lore and myths on certain magical values. For a analyzing performance problems on a server that you have access and is misbehaving right now . a more direct approach using wait analysis and execution stats is my recommended approach. Where performance counters shine is comparing current behavior with past behavior. for which, obviously, you need to have performance counters values collected and saved from said past. These should be part of an established baseline, which has captured the server behavior under workload when the server was behaving correctly and was not experiencing problems. If you do no have a baseline, consider establishing one. The performance counters infrastructure workhorse is the logman.exe utility. For a quick intro, read Two Minute Drill: LOGMAN.EXE. I recommend you familiarize yourself with this tool. I favor it over the graphic interface ( perfmon.exe ) because, as a command line interface (CLI) tool, it allows for easy scripting. Telling someone run the attached script is always easier that telling click the button, select A from the list, then choose menu B, click twice in the middle of the red square etc etc. The graphic perfmon.exe tool is the tool of choice for displaying performance counters. Performance counters, if collected at sufficient resolution, are also an excellent tool for determining correlation. The graphic display makes easy to spot counters that tend to spike together, or in an anti-correlated pattern (one spikes the other dips). Other patterns also become evident in the graphic visualization, like lag (eg. a counter spike is always preceded by another one increasing). Short of having a data scientist doing factorial analysis on your counters, your own eyes are the best analysis tool. SQL Server usage performance counters Batch Requestssec If you want one counter to best represent the overall performance throughput of your server, this is it. It captures the workload pressure (how many requests the application is making), and how is the server coping with the workload. Trends in this counter need to be further analysed: an increase in the value could mean the server is performing better, because it can accept and handle more requests, but it can also mean the application is sending more requests (bigger, heavier workload), for example more your application is serving more client requests. Transactions The number of active transactions (any type). Be aware that there are at least two counters named Transactions . one in the SQL Server:General Statistics object and another one in the SQL Server:Transactions object. Im referring to the later one. Knowing the number of active transactions is important to set a background on your understanding of the workload. Processes blocked This is specially useful when troubleshooting spikes or jagged performance. For example if you can correlate moments where performance drops with moments when the blocking increase you have found an area to focus your investigation on: blocking. Errorssec Understanding whether errors occur in your workload is a key point in performance troubleshooting. Eliminating errors is an easy path toward performance increase. Number of Deadlockssec Related to the number of Errorssec, monitoring the rate of deadlocks can quickly point toward a performance problem. Is hard to believe that a you are not aware that deadlocks are occurring, given the impact they have on the application. But Ive seen cases where the deadlocks were quietly swallowed in the application or simply there was no communication between the organization monitoring the application and the DBA organization monitoring the server. Log Growths I can hardly think of any event in SQL Server execution that has a more dramatic impact on performance than log growth. During log growth every write request effectively freezes as it waits for available log to generate the write-ahead log records necessary to record any update. Log growth cannot use instant file initialization so it must wait until the log file is grown and the newly allocated disk space is filled with 0s. Your application users might as well watch paint dry. Often cases this is aggravated by a log file gone out of control with 10 increments which is now growing in hundreds of megabytes or even gigabytes at a time. The impact on performance is usually devastating, and is also difficult to track down after the fact. It shows as a sudden performance dip (actually often a complete freeze) that lasts few seconds or even minutes, and then everything is again fast until the next log growth event. The article How to shrink the SQL Server log offers an explanation why log growth can occur. Data and log growth can also be tracked by non-zero values for the PREEMPTIVEOSWRITEFILEGATHER wait info statistics. Data File(s) Size (KB) Monitoring the data size is interesting on its own, but there is another reason why this counter should be collected: it can show when database growth events occur. Unlike Log Growths, data growths do not have counter of their own (shame), but the events can be deduced from sudden jumps in the data file size. Note that data growth can leverage instant file initialization so the impact may not be as dramatic. You should always ensure instant file initialization is enabled for SQL Server, if is not the impact may be serious, specially if you encounter tempdb growth events (which in my experience occurs on most deployments). IO related performance counters Page readssec The rate at which data pages are read from disk. This will be the main driver factor for disk read IO. Normally your workload should read only a very small amount of data from disk, the data should be cached in memory. Constant reading is a sign of data scans (missing indexes) andor insufficient memory (RAM). Log Flushessec Together with the Log Flush Waitssec . Log Flush Wait Time and Log Flush Write Time (ms) you can quickly get a feel of how much blocking occurs due to transactions waiting to commit (log flush events). For well written OLTP intensive applications the rate at which transactions can be committed is often the main performance bottleneck. Page writessec I intentionally put data write after log writes, because most times is the log that is the problem. Only few workloads are data-write heavy. However data-write can interfere with disk IO, specially with log writes, and cause delays in log flush waits that are very visible as application performance drops. The typical pattern is some longer time of good performance with periodic short times of performance dip. Long and short are relative, sometime you see 1-2 minutes long and 10-15 seconds as short, but other times is 10-15 minutes long and 1-2 minutes short. The jagged pattern is the key, with a strong correlation between performance dips and data-writes spikes. The pattern is caused by checkpoints and the timing is driven by the recovery interval option. Looking at Checkpoint pagessec will quickly corroborate this hypothesis. Checkpoint pagessec This counter is the usual culprit to blame Page writessec counter spikes. Log write waits This performance counter exposes the wait info object for log writes. The advantage of using performance counters vs. the DMVs is to leverage the performance counters infrastructure, namely collecting the values in a continuous fashion using the operating system collectors. Page IO latch waits Same as above, this is a wait info exposed through performance counters. Strictly speaking this does not measure IO, it measures only when blocking caused by IO occurs. You cannot distinguish between read IO and write IO with this counter. BackupRestore Throughputsec Often the IO requirements of the maintenance backup operations are forgotten when doing performance analysis. Understanding the additional IO pressure a backup adds and tracking it through this counter is important on its own, but is even more important to understand correlation between spikes in this counter and general performance degradation. This is a scenario Ive see all too often: the maintenance plan kicks in and the overall throughput dips significantly, but nobody understands why. PhysicalDisk Object This category is the operating system counter for monitoring the IO operations. The typical focus is not on throughput, but on queue length, indicating IO operations that take a long time. For a more thorough explanation, read Windows Performance Monitor Disk Counters Explained. Monitoring Usage and Monitoring Queue Length. Operating system exposes IO counters for each individual drive separately, always corroborate findings with the SQL Servers own IO stats as reported by the virtual IO stats DMVs. Another good resource to read is this SQL Server Technet wiki page: Monitoring Disk Usage. ProcessIO Data Operationssec The Process counter category has a different instance for each OS executing process and is very important to analyze when the overall IO on the system does not match the IO as reported by SQL Server. Often times youll discover that another process is causing IO making the disks busy and increasing the response time in SQL Server. Unfortunately monitoring this counter is difficult long term because instances come and go as OS executable processes start and terminate. Pages sec Despite being in the Memory counter category, understanding if and when paging occurs is critical in understand IO performance as paging can introduce a large spike in IO requests. See Monitoring Paging. Memory related performance counters Page life expectancy PLE is measuring the average time a page stays cached in memory before being evicted because of the need to read more data from disk. The DBA lore give this counter a magical value of 300 (5 minutes). This originates with the The 5 Minute Rule for Trading Memory for Disc Accesses paper published back in 1985, then revised as The Five-Minute Rule Ten Years Later and again revised as The Five-Minute Rule 20 Years Later. This 2011 SQL Magazine QA with Paul Randal goes on to say: The value of 300 seconds is a Microsoft recommendation in a white paper that was written five years ago. Its not a relevant guideline nowadays, and even back in 2006 I would have argued that aiming for a set value isnt a valid recommendation. Analyzing PLE is useful as it gives a single value to get a feel for the server memory health, but do not panic if the value is 297 and relax is is 302. More important is to understand trends and the dynamic of this value. A jagged pattern (periodic dips) indicates something that comes and creates a great disturbance in the server memory, perhaps a periodic query that causes a scan, evicting much of the cached data. An overall trend in reducing PLE indicates your workload increases but the server hardware is the same and is a great indicator of potential future problems, better to alleviate now. On machines with NUMA nodes, which in this day and age means pretty much every server, you should pay attention to the PLE per node using the SQL Server:Buffer NodePage life expectancy counter. Read Page Life Expectancy isnt what you think. SQL Server:Memory Manager This category tracks the how is memory used inside the SQL Server process. the absolute values themselves are somehow esoteric, but having a baseline to compare against and looking at long term trends is a great way to determine what changed and what components start putting SQL Server under memory pressure. Memory Grants Pending Im calling out this counter in the Memory Manager category because is particularly important in understanding blocking caused by memory grant waits. Memory grants are only needed for certain query operators and queries requesting large memory grants tend to wreak havoc with your SQL Server performance. Read Understanding SQL server memory grant for more details. Memory grant queue waits Related to the above this is the memory grant wait info exposed as a performance counter. ProcessPrivate Bytes The Process category OS performance counter has an instance for each process in the system and allows you to easily track other processes that may consume memory, causing external memory pressure for SQL Server and ultimately performance degradation. CPU performance counters Processor Object I really hope this one doesnt need an explanation. The OS reported CPU usage counter. Page lookupssec Im mentioning this counter here, in the CPU category, because it is a critical counter to analyze when considering CPU usage in SQL Server. When this counter correlates strongly with CPU usage is a clear indicator of why the CPU usage increased: more pages are scanned, the queries simply look at more data and therefore consume more CPU. The usual culprit is, again, table scans (ie. missing index, poor data modeling or a bad query plan). Process Processor Time The Process category OS performance counter has an instance for each process in the system and allows you to easily track other processes that may consume CPU, causing SQL Server performance degradation. SQL Server blocking related performance counters SQL Server:Locks Monitoring and analyzing the locking performance counters can reveal if lock related blocking is a significant cause of performance problems. Look specially at the Lock Wait Time (ms) value, it will give you an insight on how much percent of the time is spent by queries being blocked waiting for locks. You wont be able to determine exactly what query is blocking what, but knowing that lock waits are significant allows you to focus on analyzing the block chains. spwhoIsActive is a great tool for that. SQL Server:Wait Statistics Most important wait info types are reported also as performance counters. Analyzing these is similar to analyzing the wait statistics using the DMVs, but the performance counters have the advantage of being available in the whole performance counters toolset ecosystem, making easy to collect, store and analyze. Not all wait info types are exposed as performance counters. SQL Server:Latches If you see high Average Latch Wait Time (ms) values you should perform an investigation to find the problem latches. I recommend you read Diagnosing and Resolving Latch Contention on SQL Server. Network performance counters ProTip: Network is not your bottleneck. Network performance comes into picture usually only for deployments using Database Mirroring or Availability Groups. These features are indeed network hungry and require a fast, high bandwidth-low latency connection between the nodes. Furthermore, both DBM and AG tend to push their problems up the stack, resulting in performance degradation when the network traffic cannot keep up with the workload. Network IO waits This counter shows the wait info stats related to the server being blocked because the client is not consuming the result sets. Most often this does no indicate a network problem, but an application design problem: the client is requesting large result sets. Send IO bytessec and Receive IO bytessec These counters show the network traffic generated by Service Broker and Database Mirroring. Availability Groups have a more specialized counter category in SQL Server:Availability Replica . Network Interface This is the performance counter where all the network activity is exposed, from all processes. IP Object. TCP Object These categories are important for monitoring the health of the traffic, not the amount. Specifically they can indicate network errors, dropped packets and retries. Defining your own counters You can actually report custom performance counters from T-SQL. The SQL Server:User Settable is specifically designed for this and allows you to report up the 10 user defined values to be monitored and collected by the system performance counters tools. You publish counter values by using spusercounter1 through spusercounter10 : For application developers is also possible to add performance counters to the application itself. Publishing performance counters from managed () application code is trivially easy, and you can automate the somehow boring process of declaring them, see Using XSLT to generate Performance Counters code . Advanced Performance Analysis Developers are familiar with performance analysis using sample profiling, with tools like VTune. F1 or WPA. The sample profiling technique consist of periodically taking a stack sample of each thread in the profiled process, up to several hundred times per second. The process is non-invasive, it does not require a specially instrumented process, any process can be profiled. It is also fairly lightweight, taking several hundred samples per second has no measurable impact on the performance of the process being sampled. The trick is interpreting the observations. Using the Microsoft public symbols server you can resolve the collected samples to actual function names in the source code (note that in my experience F1 and WPA do a much better job at handling the LTCG code of SQL Server than VTune does). With some common sense, one can make an educated guess what exactly was the SQL Server doing during the period being sampled. This technique makes sense only if you are seeing significant CPU usage. If the performance is bad and you see slow queries but low CPU usage it means the queries are waiting and you should focus instead on wait info analysis. Sample profiling of a blocked process will reveal nothing useful. WPA is one of my favorite performance tools and it can do more than just sample profiling. It can visualize XPerf ETW traces and this makes it extremely powerful. Existing documentation and whitepapers for WPA tends to focus on multimedia and game development, but if you are and adventurous spirit and want to learn about how your favorite database works, using WPA to analyse SQL Server works can reveal a great deal of information and help you spot performance improvements that can be leveraged in your application. One of my favorite use cases for WPA is to collect IO activity (this will collect every single IO request ) and then visualize the Disk Offset as a graph. This is an incredibly simple, yet powerful, way to visualize random IO vs. sequential IO patterns. If you have a feeling WPA and XPerfETW are somehow related to SQL Server Extended Events, that is because they are, very much so. Finally, some readings to get you started on using WPA: The USE method USE stands for Utilization . Saturation and Errors . and the USE Method is a formalized approach to investigating performance troubleshooting. Its focus is on identifying resources in a system and then for each one measure the utilization (percent in use compared to maximum bandwith), the saturation of the resource (extra work queued because the resource cannot service due to 100 utilization) and errors. When used in SQL Server context, the tricky part is to identify the resources and how to measure the utilizationsaturationerrors. Some resources are obvious: disk, CPU, memory, network. Sometimes even simply starting with the USE method and measuring these hardware parameters is a good way to start a performance investigation, at the very least youll know what hardware component is saturated, if any. But knowing how SQL Server works can reveal more detailed, internal resources that can be analyzed. In Understanding how SQL Server executes a query I have shown this image: Many of the components in the image above can be investigated as Resources in the USE method. Applying this methodology requires some thinking outside the box since you will not find much references online about how to apply the USE method to SQL Server, what resources to look for and how to measure the utilization, saturation and errors for each. I myself do not have a clear picture yet for each resource involved and Im still collecting facts and know-how on the subject. But I like the USE approach because it gives a method, a strategy to follow in troubleshooting performance. Komentar ditutup.
Bagaimana-untuk-trade-nifty-options-strategy
Simple-free-forex-trading-system