2016-04-13 17 views
0

Şema içermeyen JSON verilerini içeren 150 mn kayıt içeren bir rethinkdb tablom var. JSON'da iç içe geçmiş bir alanı araştırıyorum, örneğin 'Kapı No.' Aşağıdaki JSON alanı. Ben 1mn kayıtlarını içeren bir tablo için aynı sorguyu ran Çok sayıda kayıt için sorgu performansını geliştirin rethinkdb

{ 'Name' : 'XYZ', 'Age' : 22, 'Address' : { 'Gate No.' : 7, 'Society' : 'ABC' } } 

, sorgu ancak 150 mn kayıtlarıyla, sorgu hiç dönmez, 680 ms döndü. Web konsolundan, bir süre çalışır ve daha sonra bir hata verir: Query terminated by an unknown cause. Java uygulamamdan, sorgu sonsuza kadar devam ediyor gibi görünüyor.

Her biri ~ 37 mn belgeleri tutan, ancak bu durumu iyileştirecek gibi görünmeyen 4 sunucuyla çalışmayı denedim. Sorguyu nasıl çalıştırabilirim?

Not: JSON verilerim tamamen şema içermez, bu nedenle verilerin indekslenmesi geçerli bir seçenek değildir. Söylediğin ekstra bilgilere dayalı

+0

Hey Kapil, yaptığınız kesin sorgu ve tablolarda oluşturduğunuz dizinler hakkında daha fazla bilgi verebilir misiniz? – dalanmiller

+0

Çalıştığım sorgu r.db ('dbName') .tablo ('tableName'). Filter (r.row ('Address') ('Gate No.') .qq (7)), var Tam olarak iade edilmesi gereken bir kayıt. Tablo 150 mn kayıtları (4 kırıkları, her biri ~ 37 mn kayıt) içerir. Dizini oluşturmak için sorgu, web konsolu zaman aşımına rağmen bir dizin kullanmıyorum. Ayrıca, JSON dosyası şema-azdır, bu yüzden bir indeks işe yaramaz mı? –

+0

filtresi hiç bir dizin kullanmıyor. GetAll'i Adress.'Gate No. 'adresindeki bir endeksle kullanmanız gerekir. Bkz. Https://www.rethinkdb.com/api/javascript/get_all/ – jishi

cevap

2

, böyle bu sorunu çözmek istiyorum:

İlk kesinlikle bir dizin yapmalıdır. Verilerinizin şematik olduğunu söylüyorsunuz, ancak girişlerin tamamının veya çoğunun bir Address ve Gate No alanına sahip olduğunu mu söylüyorsunuz? Bu durumda o zaman (veri kaşif birinde veya Java bu sorguyu çevirmek) şöyle bir dizin yaratacak:

r.db("dbName").table("tableName").indexCreate('gate_no', r.row("Address")("Gate No.") 

otomatik olarak bir tablo her zaman için tarama yaparken başvurmadan konum dizin oluşturma olmadan Bu dokümanı arıyorsunuz. Sıklıkla yaptığınız sorgularda genellikle dizin oluşturmak istersiniz. Gate No. tarafından sürekli olarak Address es'i arayacaksanız, bu yardımcı olacaktır.

Şimdi, bulmak istediğiniz değeri belirtmek ve kullanmak istediğiniz değeri döndürecek olan dizini geçmek için .getAll kullanın. (Btw denir .getAll birincil anahtarlar aksine ikincil olanlar birden fazla değere sahip olabilir çünkü)

r.db("dbName").table("tableName").getAll(7, {index: 'gate_no'}) 

Bu zamanın bir kısmını da size sonuç alırsınız. (İndeks ağacının mevcut bakiyesine bağlı olarak, özelliklerden emin değil, ancak ortalama O (n log n) 'dan emin olun).

Veri Gezgini'ne gelince, veri kümenizin basit keşiflerini yapmak için gerçekten bir araçtır ve milyonlarca belgeyi ayrıştırmak için tasarlanmamıştır. ipython veya node repl'in içine düştüğüm bu tür testlerin yapılması, işleri son ürüne göre çok daha kolay ve çevrilebilir kılar. Son olarak, Java sürücüsünün böyle davranmaması gerekir. Github ile ilgili bir sorunu kesinlikle açmalısınız, böylece uygun şekilde yatırım yapabiliriz - https://github.com/rethinkdb/rethinkdb/issues/new.