Kiat Kinerja dan Pengoptimalan untuk XQuery

Kiat Kinerja dan Pengoptimalan untuk XQuery – Saat pertama kali kueri dijalankan, persentase yang signifikan dari total waktu kueri dihabiskan untuk menyiapkan kueri, yang mencakup pengoptimalan kueri dan membuat rencana kueri. Karena sebagian besar program memanggil kueri lebih dari sekali, kami menghabiskan waktu yang diperlukan untuk menemukan cara yang efisien untuk memproses kueri, meskipun itu membuat kueri pertama menjadi lebih lambat. Untungnya, upaya ini tidak perlu diulang.

Kiat Kinerja dan Pengoptimalan untuk XQuery

zorba-xquery – Salah satu cara untuk memastikan bahwa kueri disiapkan hanya sekali dalam program Anda adalah dengan menggunakan kueri yang disiapkan. (Cara lain adalah dengan menggunakan Query Pooling, dijelaskan di bagian berikut).Untuk membuat parameter kueri, gunakan variabel eksternal untuk mengubah nilai yang digunakan untuk kueri setiap kali kueri dipanggil. Misalnya, kueri berikut membuat portofolio untuk pengguna tertentu:

Baca Juga : Semua Yang Perlu Anda Ketahui Sebelum Memilih Prosesor

Contoh 1. Query dengan Variabel Eksternal

declare variable $user as xs:string external;
collection(‘holdings’)/holdings[userid=$user]

Dalam kueri ini, $user adalah variabel eksternal yang harus diikat sebelum mengeksekusi kueri. Kode XQJ berikut menunjukkan cara menyiapkan kueri dan mengikat nilai ke $user.

Contoh 2. Menyiapkan Query

// Get a connection, prepare the query
XQDataSource dataSource = new DDXQDataSource();
dataSource.setJdbcUrl(“jdbc:xquery:sqlserver://server1:1433;databaseName=stocks”);
XQConnection connection = dataSource.getConnection();
XQPreparedExpression preparedExpression = connection.prepareExpression(xqueryText);
// Bind variable $user to ‘Jonathan’ and execute
preparedExpression.bindString(new QName(“user”), “Jonathan”);
XQSequence xqSequence = preparedExpression.executeQuery();

Kode berikut menunjukkan cara mengikat $user ke nilai yang berbeda dan menjalankan lagi kueri yang disiapkan.

Contoh 3. Mengeksekusi Query yang Disiapkan dengan Nilai Baru

// Bind variable $user to ‘Minollo’ and execute
preparedExpression.bindString(new QName(“user”), “Minollo”);
xqSequence = preparedExpression.executeQuery();

Tolok ukur yang mengukur kecepatan kueri harus mencerminkan penggunaan yang Anda harapkan dalam program Anda. Karena sebagian besar program menjalankan kueri berkali-kali, saat Anda mendesain tolok ukur, Anda harus menyiapkan kueri, lalu menjalankannya berkali-kali.

Pengumpulan Kueri

Ekspresi yang disiapkan memungkinkan pemrogram memutuskan kapan kueri harus disiapkan dan kapan kueri yang disiapkan tidak lagi diperlukan. Dalam program yang menggunakan ratusan atau ribuan kueri, umumnya lebih baik membiarkan DataDirect XQuery® melacak kueri mana yang benar-benar digunakan, mempersiapkannya saat pertama kali dijalankan, dan membuang kueri siap yang paling jarang digunakan jika ada banyak pertanyaan. Ini disebut pengumpulan kueri.

Di DataDirect XQuery®, Anda mengaktifkan kumpulan kueri dengan menentukan jumlah kueri yang disiapkan untuk disimpan di kumpulan. Jika Anda mengonfigurasi koneksi Anda dengan menyetel properti di Java API, Anda dapat menyetel properti MaxPooledQueries untuk melakukan ini; misalnya, kode berikut menetapkan ukuran kumpulan kueri menjadi 20:

Contoh 4. Mengaktifkan Pengumpulan Kueri dengan Java API

XQDataSource dataSource = new DDXQDataSource();
dataSource.setJdbcUrl(“jdbc:xquery:sqlserver://server1:1433;
databaseName=stocks”);
dataSource.setMaxPooledQueries(20);
XQConnection connection = dataSource.getConnection();

Jika Anda mengonfigurasi koneksi menggunakan File Konfigurasi Sumber, Anda dapat mengatur ukuran kumpulan kueri menggunakan elemen maxPooledQueries:

Contoh 5. Mengaktifkan Pengumpulan Kueri dalam File Konfigurasi

<?xml version=”1.0″ encoding=”UTF-8″?>
<XQJConnection xmlns=”http://www.datadirect.com/xquery”>
<maxPooledQueries>20</maxPooledQueries>
<JDBCConnection name=”stocks”>
<url>jdbc:xquery:sqlserver://localhost:1433</url>
<sqlxmlMapping>
<forest>true</forest>
<identifierEscaping>none</identifierEscaping>
</sqlxmlMapping>
</JDBCConnection>
</XQJConnection>

Meminta File XML Besar

DataDirect XQuery menyediakan beberapa cara untuk mengkueri file XML. Di DataDirect XQuery, Anda akan mendapatkan kinerja yang lebih baik, terutama untuk file XML besar, jika Anda menggunakan fn:doc() untuk mengakses XML dalam kueri. Anda akan mendapatkan kinerja yang jauh lebih buruk jika Anda mengurai XML untuk membuat pohon DOM, mengikat pohon DOM ke variabel eksternal, dan menanyakan variabel eksternal.

Di sebagian besar prosesor XQuery, sebagian besar waktu yang diperlukan untuk kueri file XML besar dihabiskan untuk menguraikan file dan membuat representasi dalam memori yang dapat ditanyakan. Representasi dalam memori mungkin beberapa kali ukuran file XML asli, dan Java VM kehabisan memori kesalahan dapat terjadi pada waktu berjalan. Saat kueri Anda mengalamatkan file XML menggunakan fn:doc(), DataDirect XQuery menggunakan teknik yang dikenal sebagai Proyeksi Dokumen, yang memungkinkannya membuat hanya bagian dokumen yang diperlukan oleh kueri. Ini menghasilkan peningkatan dramatis dalam penggunaan memori dan skalabilitas, dan peningkatan kinerja yang signifikan. Menggunakan proyeksi dokumen, Anda biasanya dapat menanyakan dokumen berkali kali ukuran memori yang tersedia. Kebetulan, jika aplikasi Anda menggunakan XML Deployment Adapters, ini menangani adaptor ini menggunakan fn:doc(), dan DataDirect XQuery menggunakan Proyeksi Dokumen dengan tepat untuk adaptor ini seperti halnya untuk dokumen XML.

Proyeksi dokumen menggunakan ekspresi jalur dalam kueri untuk menentukan bagian dokumen apa yang perlu dibuat. Ekspresi jalur yang menggunakan karakter pengganti memberikan lebih sedikit informasi untuk proyeksi dokumen, sehingga harus dihindari saat menanyakan dokumen besar. Misalnya, dalam contoh di bawah ini, ekspresi jalur kedua akan tampil jauh lebih baik untuk dokumen besar.

Contoh 6. Hindari ekspresi jalur dengan wildcard

doc(“scenario.xml”)*[role=’teacher’]

Contoh 7. Proyeksi dokumen bantuan ekspresi jalur khusus

doc(“scenario.xml”) scenario people person[role=’teacher’]

Jika Anda mengurai dokumen untuk membuat pohon DOM, lalu mengikat pohon DOM ke variabel eksternal, Anda melewati Proyeksi Dokumen DataDirect. Ini memaksa program Anda untuk membuat seluruh representasi dalam memori dari dokumen XML Anda bukan hanya bagian yang dibutuhkan DataDirect XQuery untuk memproses kueri Anda. Selain penghematan karena Proyeksi Dokumen, representasi internal DataDirect dari dokumen XML jauh lebih efisien daripada kebanyakan implementasi DOM, jadi menggunakan fn:doc memberi Anda dua pengoptimalan substansial yang hilang jika Anda mengurai dokumen sendiri.

DataDirect XQuery juga mendukung teknik kedua yang dikenal sebagai Streaming. Streaming memproses dokumen secara berurutan, membuang bagian dokumen yang tidak lagi diperlukan untuk menghasilkan hasil kueri lebih lanjut. Ini mengurangi penggunaan memori karena hanya sebagian dari dokumen yang diperlukan pada tahap tertentu dari pemrosesan kueri yang dibuat dalam memori. Streaming dapat mengurangi konsumsi memori, tetapi umumnya melibatkan penalti kinerja (relatif kecil).

Tidak seperti proyeksi dokumen, streaming umumnya bukan merupakan kemenangan kinerja. Selain itu, beberapa kueri memerlukan banyak dokumen untuk dipakai pada waktu tertentu, sehingga mengurangi manfaat streaming. Namun, untuk beberapa kueri, streaming bisa menjadi kemenangan yang substansial, terutama jika hasil kueri melebihi memori yang tersedia; oleh karena itu, kami mengizinkan streaming untuk diaktifkan, tetapi kami tidak mengaktifkannya secara default.Untuk mengaktifkan streaming, setel opsi ddtek:xml-streaming ke ‘yes’ di XQuery Prolog:

Contoh 8. Mengaktifkan Streaming di Prolog Kueri

declare option ddtek:xml streaming ‘yes’;

Anda juga dapat mengaktifkan streaming di tingkat DataSource, yang berarti streaming akan digunakan untuk semua kueri yang menggunakan DataSource. Salah satu cara untuk melakukannya adalah dengan menyetel properti Pragmas dari kelas DDXQDataSource.

Contoh 9. Mengaktifkan Streaming untuk DataSource di Java API

XQDataSource dataSource = new DDXQDataSource();
dataSource.setJdbcUrl(“jdbc:xquery:sqlserver://server1:1433;
databaseName=stocks”);
dataSource.setPragmas(“xml-streaming=yes”);

Cara lain untuk mengaktifkan streaming di tingkat DataSource adalah dengan menentukan opsi deklarasi menggunakan elemen pragma dalam File Konfigurasi Sumber:

Contoh 10. Mengaktifkan Streaming untuk Sumber Data dalam File Konfigurasi 

<?xml version=”1.0″ encoding=”UTF-8″?>
<XQJConnection
<maxPooledQueries>20</maxPooledQueries>
<pragma name=”xml-streaming”>yes</pragma>
<JDBCConnection name=”stocks”>
<url>jdbc:xquery:sqlserver://localhost:1433</url>
<sqlxmlMapping>
<forest>true</forest>
<identifierEscaping>none</identifierEscaping>
</sqlxmlMapping>
</JDBCConnection>
</XQJConnection>

Facebooktwitterredditpinteresttumblr