sql server linked server kinerja: mengapa permintaan jarak jauh begitu mahal?
<p>saya memiliki dua server basis data, terhubung melalui server tertaut. keduanya adalah database sql server 2008r2, dan koneksi server yang ditautkan dibuat melalui tautan "sql server" biasa, menggunakan konteks keamanan login saat ini. server yang ditautkan keduanya berada di pusat data yang sama, sehingga koneksi tidak menjadi masalah.</p><p>saya menggunakan kueri berikut untuk memeriksa nilai kolom <code>identifier</code> mana yang tersedia dari jarak jauh, tetapi tidak secara lokal.</p><pre><code>select identifier from linkedserver.remotedb.schema.[tablename] except select distinct identifier from localdb.schema.[tablename] </code></pre><p>di kedua tabel terdapat indeks yang tidak berkerumun di kolom <code>identifier</code>. secara lokal sekitar 2,6m baris, hanya berjarak 54. namun, ketika melihat rencana kueri, 70% dari waktu eksekusi dikhususkan untuk "mengeksekusi kueri jarak jauh". juga, ketika mempelajari rencana kueri lengkap, jumlah baris lokal yang diperkirakan adalah <code>1</code> dari pada <code>2695380</code> (yang merupakan jumlah taksiran baris saat memilih hanya kueri yang muncul setelah <code>except</code>). <img src="https://i.stack.imgur.com/pbnn6.png" alt="execution plan"> saat menjalankan kueri ini, memang butuh waktu lama.</p><p>itu membuat saya bertanya-tanya: mengapa ini? apakah perkiraan "hanya" jauh, atau apakah pertanyaan jarak jauh pada server yang terhubung benar-benar semahal itu?</p>
<p>rencana yang anda miliki saat ini terlihat seperti rencana paling optimal bagi saya.</p><p>saya tidak setuju dengan pernyataan di jawaban lain bahwa ia mengirim baris 2.6m ke server jarak jauh.</p><p>rencana itu terlihat bagi saya seolah-olah untuk masing-masing 54 baris yang dikembalikan dari permintaan jarak jauh itu melakukan pencarian indeks ke tabel lokal anda untuk menentukan apakah cocok atau tidak. ini adalah rencana optimal.</p><p>mengganti dengan hash join atau gabung bergabung akan menjadi kontraproduktif mengingat ukuran tabel dan menambahkan perantara <code>#temp</code> table hanya menambahkan langkah tambahan yang sepertinya tidak memberi anda keuntungan.</p>
<p>shared hosting berarti ada situs lain di server yang sama dengan anda berbagi hal-hal seperti bandwidth dan sumber daya. hosting khusus berarti anda satu-satunya di server dan semua sumber daya adalah milik anda. biasanya hosting khusus lebih mahal, tetapi memberikan kinerja yang lebih baik jika anda membutuhkannya.</p> <blockquote> <p>apakah melewatkan id sesi sebagai parameter url benar-benar tidak aman?</p> </blockquote><p>meskipun tidak <em> secara inheren tidak aman </em>, ini bisa menjadi masalah kecuali kodenya dirancang dengan sangat baik.</p><p>katakanlah saya mengunjungi forum favorit saya. itu masuk saya dan menambahkan id sesi saya ke url di setiap permintaan. saya menemukan topik yang sangat menarik, dan menyalin &amp; menempel url ke pesan instan ke teman saya.</p><p>kecuali jika aplikasi telah mengambil langkah-langkah untuk memastikan bahwa ada <em> beberapa </em> bentuk validasi pada id sesi, teman yang mengklik tautan itu <em> dapat </em> mewarisi sesi saya, dan kemudian akan dapat melakukan apa pun yang dapat saya lakukan, seperti saya.</p><p>dengan menyimpan pengidentifikasi sesi di cookie, anda sepenuhnya menghilangkan masalah berbagi tautan.</p><p>ada variasi pada tema ini yang disebut <a href="http://en.wikipedia.org/wiki/session\_fixation">fixation sesi</a> , yang melibatkan <em> yang disengaja </em> berbagi pengidentifikasi sesi untuk tujuan jahat. artikel wikipedia yang ditautkan membahas tentang cara kerja serangan ini dan perbedaannya dari <em> berbagi </em> yang tidak disengaja dari pengidentifikasi sesi.</p><blockquote> <p>mengapa cookie lebih aman?</p> </blockquote><p>cookie <em> dapat </em> lebih aman di sini, karena mereka bukan sesuatu yang dapat disalin dan ditempelkan oleh pengguna normal, atau bahkan dilihat dan dimodifikasi. itu adalah standar yang jauh lebih aman.</p><blockquote> <p>kemungkinan apa yang dimiliki penyerang untuk kedua opsi?</p> </blockquote><p><em> baik </em> dari metode ini aman dari serangan man-in-the-middle melalui komunikasi yang tidak terenkripsi. add-on browser, spyware dan nasties sisi klien lainnya juga dapat memata-matai kedua metode penyimpanan pengidentifikasi sesi.</p><p>dalam kedua kasus, validasi sisi server bahwa klien yang mengklaim memiliki id sesi adalah praktik terbaik. terdiri dari apa validasi ini untuk diperdebatkan. perlu diingat bahwa pengguna di belakang proxy perusahaan dapat melompat di antara alamat ip antara permintaan, jadi mengunci sesi ke alamat ip dapat secara tidak sengaja mengasingkan orang. artikel <a href="http://en.wikipedia.org/wiki/session\_fixation">fixation sesi</a> menyebutkan beberapa alternatif bermanfaat lainnya.</p> buatlah tabel dua kolom yang terdiri dari nilai dan frekuensi atau banyaknya siswa, oleh karena terdapat 6 nilai yang beragam maka tabel terdiri dari 6 baris. dengan demikian tabel frekuensi dari data tersebut adalah ingat rumus untuk menentukan panjang garis singgung persekutuan dua lingkaran adalah:

 

dari soal diketahui panjang jari-jari dua lingkaran adalah  dan , maka  dan . panjang garis singgung persekutuan luarnya , maka . maka untuk menentukan jarak pusat diperoleh perhitungan sebagai berikut.

 

karena panjang tidak mungkin nilainya negatif, maka panjang  yang tepat adalah .

dengan demikian jarak pusat kedua lingkaran tersebut adalah . server based merupakan uang elektronik dengan media penyimpanan berupa server. uang elektronik server based di indonesia ada ovo, gopay, linkaja, sakuku dari bank bca, dsb. penyedia uang elektronik server based juga mempermudah proses transaksi dengan menambahkan fitur pembayaran qr code. 

jadi, jawaban yang tepat adalah pilihan b. <p>ketahuilah bahwa php pada umumnya lebih lambat di bawah windows daripada di bawah sistem operasi seperti unix. semuanya menjadi lebih baik dengan versi yang lebih baru (pembaruan!) tetapi masih ada perbedaan yang terukur.</p><p>yang mengatakan ada dua langkah besar yang harus diambil ketika mengoptimalkan server anda php kinerja:</p><ol> <li> <p>gunakan fastcgi</p> <p>walaupun fpm hanya berfungsi di unix, fastcgi juga bekerja dengan iis di bawah windows. ini tutorial dari microsoft sendiri tentang cara melakukannya: <a href="http://www.iis.net/learn/application-frameworks/running-php-applications-on-iis/set-up-fastcgi-for-php">http://www.iis.net/ learn/application-frameworks/running-php-application-on-iis/set-up-fastcgi-for-php</a> </p> </li> <li> <p>gunakan cache opcode</p> <p>sekali lagi microsoft telah anda tutupi dengan ekstensi <a href="http://www.iis.net/downloads/microsoft/wincache-extension">wincache</a> .</p> </li> </ol><p>jika anda masih memiliki masalah kinerja setelah langkah-langkah ini, saya sarankan untuk membuat profil versi windows dan linux. anda dapat menggunakan <a href="http://www.php.net/manual/en/book.xhprof.php">xhprof</a> atau <a href="http://xdebug.org">xdebug</a> . coba cari tahu apakah anda memiliki masalah dengan kinerja php atau mysql. tes lain yang bisa anda lakukan adalah melayani kedua salinan dari server database yang sama (harus menjadi server ketiga). itu akan dengan cepat memberi tahu anda apakah anda memiliki php atau masalah mysql.</p> <p>karakter unicode 4 byte belum banyak digunakan, jadi tidak semua aplikasi di luar sana mendukung sepenuhnya. mysql 5.5 berfungsi dengan baik dengan karakter 4 byte ketika dikonfigurasi dengan benar - periksa apakah komponen anda yang lain dapat bekerja dengannya juga.</p><p>berikut beberapa hal lain yang perlu diperiksa:</p><ul> <li> <p>pastikan semua rangkaian karakter default tabel dan bidang teks anda dikonversi ke utf8mb4, di samping menetapkan set karakter klien &amp; server, mis. <code>alter table mytable charset=utf8mb4, modify column textfield1 varchar(255) character set utf8mb4,modify column textfield2 varchar(255) character set utf8mb4;</code> dan seterusnya.</p> <p>jika data anda sudah dalam karakter utf8, itu harus dikonversi ke utf8mb4 di tempat tanpa masalah. seperti biasa, buat cadangan data anda sebelum mencoba!</p> </li> <li> <p>pastikan juga lapisan aplikasi anda menyetel karakter koneksi basis data ke utf8mb4. periksa ini benar-benar terjadi - jika anda menjalankan versi yang lebih lama dari pustaka klien mysql framework yang anda pilih, itu mungkin belum dikompilasi dengan dukungan utf8mb4 dan itu tidak akan mengatur charset dengan benar. jika tidak, anda mungkin harus memperbarui atau mengompilasinya sendiri.</p> </li> <li> <p>saat melihat data anda melalui klien mysql, pastikan anda menggunakan mesin yang dapat menampilkan emoji, dan jalankan <code>set names utf8mb4</code> sebelum menjalankan kueri.</p> </li> </ul><p>setelah setiap tingkat aplikasi anda dapat mendukung karakter baru, anda harus dapat menggunakannya tanpa korupsi.</p> <p>implementasi yang saya lihat dari ini dilakukan dengan mengutak-atik tabel penerusan mac pada titik akses. karena titik akses hanya bertindak sebagai jembatan jaringan, itu cukup cocok untuk tugas semacam ini. pada lapisan switching itu sudah mengumpulkan semua mac yang didengar (kadang-kadang disebut belajar) dan antarmuka yang dapat ditemukan.</p><p>logikanya terlihat seperti ini:</p><ol> <li>access point menerima paket melalui antarmuka nirkabel</li> <li>subsistem bridging memeriksa paket untuk mac tujuan</li> <li>jika mac tujuan berada dalam tabel switching yang dipelajari untuk antarmuka nirkabel -&gt; drop</li> <li>kalau tidak meneruskan paket melalui antarmuka kabel</li> </ol><p>karena cara jembatan jaringan bekerja, saya melihat ini menjadi cukup sulit untuk menipu titik akses ke meneruskan paket ke klien terlepas dari isolasi. taruhan terbaik anda adalah berusaha berbicara langsung dengan klien lain, seolah-olah anda beroperasi dengan jaringan ad-hoc.</p> <p>intinya adalah untuk mencegah pembagian biaya serangan: jika seorang penyerang ingin menyerang dua kata sandi, maka itu harus dua kali lebih mahal daripada menyerang satu kata sandi.</p><p>dengan proposal anda ("pertanyaan 1"), dua pengguna dengan kata sandi yang sama akan menggunakan mac yang sama. jika penyerang memiliki akses baca ke basis data anda, ia dapat "mencoba" kata sandi (dengan menghitung ulang mac) dan mencari basis data untuk kecocokan. dia kemudian dapat menyerang <em>semua</em> kata sandi secara paralel, untuk biaya serangan satu. jika <code>long\_string</code> anda adalah sebuah konstanta hardcoded dalam kode sumber aplikasi, maka semua instal aplikasi yang terinstal membagikan konstanta ini, dan menjadi bermanfaat (bagi penyerang) untuk membuat kamus besar pasangan kata sandi ke mac , juga dikenal sebagai "a rainbow table".</p><p>dengan nonce ("pertanyaan 2") anda, anda menghindari pembagian biaya. nonce biasanya dikenal sebagai "garam". <code>long\_string</code> anda dan penggunaan hmac tidak membeli anda banyak di sini (dan anda tidak menggunakan hmac untuk apa itu dirancang, omong-omong, sehingga anda berada pada fondasi yang goyah, berbicara secara kriptografis). menggunakan garam adalah ide yang sangat bagus (well, <em>tidak</em> menggunakan garam adalah ide yang sangat buruk, setidaknya) tetapi hanya melakukan setengah dari pekerjaan. anda juga harus memiliki prosedur hashing <em>lambat</em>. intinya di sini adalah bahwa garam mencegah pembagian biaya, tetapi tidak mencegah menyerang satu kata sandi. menyerang kata sandi berarti mencoba kemungkinan kata sandi sampai satu yang cocok (itulah "serangan kamus"), dan, mengingat imajinasi rata-rata pengguna manusia, serangan kamus cenderung bekerja: orang hanya <em>cinta</em> menggunakan kata sandi yang dapat tebak. solusinya adalah dengan menggunakan proses hashing yang secara inheren lambat, biasanya dengan mengulangi fungsi hash beberapa ribu kali. idenya adalah untuk membuat verifikasi kata sandi lebih mahal: membuat pengguna menunggu 1ms bukannya 1μs bukanlah kesulitan (pengguna tidak akan menyadarinya), tetapi juga akan membuat serangan kamus 1000 kali lebih mahal. <code>long\_string</code> anda <em>boleh</em> digunakan untuk itu, asalkan itu sangat panjang (bukan 2 kilobyte, lebih dari 20 megabita).</p><p>hmac <em>boleh</em> digunakan sebagai ganti fungsi hash mentah untuk memperkuat sistem verifikasi kata sandi, tetapi dalam pengaturan yang berbeda. dengan sistem yang memeriksa kata sandi dengan garam dan fungsi hash yang diulang, anda dapat mengganti fungsi hash dengan hmac, menggunakan kunci rahasia <em> k </em>. ini mencegah serangan kamus offline selama anda dapat menyimpan <em> k </em> rahasia. menjaga kerahasiaan nilai tidak mudah, tetapi masih lebih mudah untuk menjaga 128-bit <em> k </em> rahasia daripada database lengkap.</p> <p>anda bisa mengatur variabel <a href="http://en.wikipedia.org/wiki/internal\_field\_separator">bidang pemisah internal</a> (ifs) variabel, dan kemudian membiarkannya mengurai menjadi array. ketika ini terjadi dalam suatu perintah, maka penugasan ke <code>ifs</code> hanya terjadi pada lingkungan perintah tunggal itu (ke <code>read</code>). ini kemudian mem-parsing input sesuai dengan nilai variabel <code>ifs</code> ke dalam array, yang kemudian dapat kita iterate.</p><pre><code>ifs=';' read -ra addr &lt;&lt;&lt; "$in" for i in "${addr[@]}"; do # process "$i" done </code></pre><p>ini akan mengurai satu baris item yang dipisahkan oleh <code>;</code>, mendorongnya ke dalam array. hal-hal untuk memproses seluruh <code>$in</code>, setiap kali satu baris input dipisahkan oleh <code>;</code>:</p><pre><code> while ifs=';' read -ra addr; do for i in "${addr[@]}"; do # process "$i" done done &lt;&lt;&lt; "$in" </code></pre>