Ben karmaşık bir SELECT sorgusu çalıştırmak için bir saklı yordam kullanmalı mıyım?

4 Cevap php

Ben oldukça karmaşık bir SELECT sorgusu olduğu ortaya çeviriyor ne çalışıyorum. Ben birkaç hiyerarşik sorguları tek bir SELECT iç içe olmak ve onu yönetmek için oldukça zor oluyor.

Ben inline Defa birden fazla yerde yürütülmesi gereken birkaç yerde çalıştırıyorum, bu yüzden bir saklı yordam başında bir kez bu yürütmek ve sonra gerektiği gibi sonuçlar üzerinde bazı yineleme yapmak için makul bir fikir gibi görünüyor .

Herhangi bir neden neden olmamalı, ya da, benim PHP kodu ile adlandırılan bir Oracle saklı yordam, idam olamazdı ve bir OUT parametresi resultset olarak dönmek varsa ben merak ediyorum. Ben sadece güncellemeleri / / ekler siler ama bozuldu gerekiyor gibi bu sorgunun büyüklüğü ve karmaşıklığı gibi görünüyor yapmak için SP'ler kullanma eğilimi var.

Bu herhangi bir teknik sorunlar, iyi ya da kötü bir uygulama olup olmadığı konusunda herhangi bir yorum yoksa?

4 Cevap

Oldukça karmaşık bir SELECT sorgusu olduğu ortaya çeviriyor ne üzerinde çalışıyor Im. Ben birkaç hiyerarşik sorguları tek bir SELECT iç içe olmak ve onu yönetmek için oldukça zor oluyor.

Tamam, ama neden bir saklı yordam? Yerine neden bir görünüm oluşturmak değil mi?

Ben inline Defa birden fazla yerde yürütülmesi gereken birkaç yerde çalıştırıyorum, bu yüzden bir saklı yordam başında bir kez bu yürütmek ve sonra gerektiği gibi sonuçlar üzerinde bazı yineleme yapmak için makul bir fikir gibi görünüyor .

Yine - bir görünüm için mükemmel bir kullanım durumda.

I'm wondering if there are any reasons why I should not, or could not, execute an Oracle Stored Procedure, called via my PHP code, and return as an OUT parameter the resultset. If there aren't any technical problems with this, any comments on whether it is good or bad practice?

Eh, ben bir dini savaş başlatmak istemiyorum, ve ben sizin durumunuza uygun karşı argümanları önermek istemiyorum. Ama burada gider:

  • Ben saklı işlemleri önlemek eğilimindedir bir nedeni taşınabilirlik - Bununla Ben çoğunlukla veritabanı taşınabilirliği demek. Saklı yordam dilleri dbs genelinde herkesin bildiği, taşınamaz, ve yerleşik Oracle paketleri gibi kütüphanelerini bu açıdan kötü şeyler yapmak.
  • saklanan prosedürler veritabanı sunucusundan bazı ek işlem gücü alır. Bu zor bir bütün olarak uygulamayı ölçekli yapar: db sunucu kapasitesi nedeniyle saklı prosedürleri tükenirse, ve Harware yükseltme hatta çünkü ekstra bir kehanet yazılım lisansını satın almanız gerekir, ben mutlu olmaz karavan, ben işlem yapmak yerine ucuz webserver / php kutuları satın alabilirdim özellikle.

Ben saklı yordamlar için giderdim nedenleri:

  • dil taşınabilirlik. Veritabanı taşınabilirliği çok bir sorun değil, ancak birden çok uygulama arasında mantığını yeniden istiyor, ya da farklı dillerde kod yeteneği var, o saklanan prosedürler dil belirli bir veritabanı başlatma kodu yazmadan sizi kurtarabilir yoksa.
  • Karmaşık izni senaryolar. Eğer saklı yordam definer veya sahibi ayrıcalıkları ile yordamı çalıştırabilirsiniz beri saklanan prosedürleri, size izin uan ekstra seviyesini verir. Bazen bu bir kullanıcı bazı tablolar ile çalışmak gerekiyor sorunları çözer, ama onları doğrudan erişim izni edilemez.
  • rountrips tasarrufu: Bir saklı prosedürleri koyarak, karmaşık, multistatement işlemleri ile uğraşmak zorunda eğer uygulaması ve db arasında rountrips kaydeder, saklı yordamı çalıştırmak için gereken tek rountrip var çünkü. bazen bu size daha fazla performans alabilirsiniz.

Tüm bu senaryolarda, ben hala saklanan prosedürleri tüm usul mantığı koymak değil öneririm olduğunu tekrar vurgulamak istiyorum. veritabanları veri depolama ve alma konusunda en iyi olan, php / java / perl gibi dilleri / zehir almak işlenmesi daha iyidir.

Eğer aynı satır içi görünümü birçok kez kullanıyorsanız, onun için iyi bir aday with clause

PHP Ref Cusrors kullanarak, saklanan prosedürler döndü resultsets işleyebilir. Oracle+PHP Cookbook has an example.

Yani hiçbir teknik engeller vardır ama çeşitli cevaplar gördüğünüz gibi Sorunuzun bazı felsefi yönleri vardır. Sen - - o zaman büyük ölçüde seçer dahil etmek "güncelleme / / ekler siler" uzatarak sistem taşınabilirlik ödün değil biz zaten saklanan prosedürleri bazı SQL deyimlerini sarma eğer kabul düşünüyorum.

Ilgili soru ardından "Bu belirli bir sorgu için bir saklı yordamı kullanın embed gerekir?" Olur Cevabı sen demek tam olarak ne menteşeleri:

the sheer size and complexity of this query seems like it needs to be broken down.

Birkaç küçük sorguları içine büyük bir sorgu Yaramaz ve sonra PL / SQL birlikte sonuçları dikiş baştan çıkarıcı olduğunu, ancak dikkatle ele alınmalıdır. PL / SQL SQL daha fazla giderleri vardır, çünkü bu, uygulamanızın performansını düşürebilir. Sorgu daha okunabilir hale yeterince iyi bir sebep değil: karmaşıklık kodunuzu çalışan bir gerçek ve olumsuz etkiye sahip emin olmak gerekir.

Eğer sorgu vücutta bağlama değişkenleri veya dinamik SQL kullanarak sorgu uygulanabilirliğini genişletmek istiyorsanız yerine bir görünüm daha bir saklı yordam kullanarak için iyi bir neden olabilir.

Sorunuzun kesin bir cevap daha fazla sorgunun doğası ile ilgili ayrıntıları ve bunu basitleştirmek için kullanarak düşünme teknikleri gerektirir.

You could look at subquery factoring which may improve the readability of the query. One risk of breaking up a single SQL query into a more procedural solution is you lose read consistency. As such you want to be pretty sure that someone changing data while your procedure runs won't break it. You may want to lock a table fore the duration of the procedure call. It seems drastic, but if you are pretty sure that the data is static and if there would be ugly side-effects if it wasn't, then it is a solution.

Bir SQL deyimi yeterince karmaşık Genellikle eğer, muhtemelen yine veritabanları arasında taşınabilir değildir, bu yüzden bu yönü hakkında endişe olmaz.

İzlenme karmaşıklığı gizlemek için iyi bir seçenek olabilir, ancak karmaşıklığı gizleme dezavantajı insanların 'basit' gibi görünüyor ama gerçekten karmaşık ve istediğiniz gibi işe yaramayan şeyleri yapmaya başlayabilirsiniz olmasıdır. Ayrıca, hibe vb dikkate başka bir nesne olsun [Edit: Roland yorumladı, bu saklanan prosedürleri için de geçerlidir, görünümleri, nesne türleri vs]

Büyük bir resultset dönmek için bekliyoruz, bir pipelined table function düşünmelisiniz. Bu şekilde aynı anda Oracle oturumda tüm resultset sahip önleyebilirsiniz.