1 Son düzenleyen, cihan1963 (03.10.2011 12:07:37)

Konu: SQL sorgulama

SQL de sorgulamada örnek olarak 6000 kayıtlı  stok dosyasını 20 kullanıcı birden cagırdıgı zaman baya bir bekleme söz konusu bunu nasıl aşabilirim ilgilenen olursa sevinirim.

iyi haftalar ve iyi çalışmalar

2

Re: SQL sorgulama

SQL SERVER ISOLATION LEVEL : Aynı kaynak üzerinde eşzamanlı yapılabilecek işlemlerden oluşabilecek hataların engellemesini temel alan özelliktir. İki tane transactional işlemimiz olduğunu yine banka örneği üzerinde inceleyelim. Aynı anda başlayan işlemlerden ilki bir hesaptan parayı çekti ancak diğer hesaba parayı yatıramadı, tam bu sırada ikinci işlem devreye girerek hesapta kalan parayı okudu. İlk işlem işlemi geri aldıktan sonar ikinci işlemde görülen hesap bakiyesi yanlıştır. Çünkü bu değişiklik birinci işlemin yeraldığı transaction içinde rollback edilmiştir. İşte bu gibi durumların önüne geçmek amacıyla isolation kullanılır ve bir lock level belirlenerek ikinci transactionun devreye bile girmemesini sağlamak elimizdedir.
kaynak : http://www.tameroz.com/tr/default.aspx

MSDN helpten http://msdn.microsoft.com/en-us/library … l.80).aspx

Syntax

SQL
SET TRANSACTION ISOLATION LEVEL 

    { READ COMMITTED
        | READ UNCOMMITTED
        | REPEATABLE READ
        | SERIALIZABLE
    }

This example sets the TRANSACTION ISOLATION LEVEL for the session. For each Transact-SQL statement that follows, SQL Server holds all of the shared locks until the end of the transaction.

SQL
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

GO
BEGIN TRANSACTION
SELECT * FROM publishers
SELECT * FROM authors
...
COMMIT TRANSACTION

ISOLATION LEVEL'i anlik olarak REPEATABLE READ e cevirerek performans saglayabilirsin gibime geliyor

http://www.soykansoft.com/images/twitter.jpghttp://www.soykansoft.com/images/wp.jpg

3

Re: SQL sorgulama

cihan1963 yazdı:

SQL de sorgulamada örnek olarak 6000 kayıtlı  stok dosyasını 20 kullanıcı birden cagırdıgı zaman baya bir bekleme söz konusu bunu nasıl aşabilirim ilgilenen olursa sevinirim.

iyi haftalar ve iyi çalışmalar

birincisi 6000 kaydı çağırmanı tavsiye etmem. fetch yapman gerekiyor. sql in kendi fetchi bir işine yaramaz. kendin bir algoritma geliştirip kayıtları 150-150 gerektikçe alabilirsin.
eğer bunu tercih etmezsen sql select çekerken nolock parametresini kullan. o zaman kullanıcılar birbirini beklemez.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

4

Re: SQL sorgulama

bu aşağıdaki kodu ut de bulmuştum. kendime göre değiştirdim bir miktar. sağolsun kimin yazdığını hatırlamıyorum ama iyi işimi gördü:

Visual Fox Pro
PROCEDURE GetPage(cTablename,cCursorname,nPageSize, lFirst, lLast, nOffset, cOffSet, cWhere, cOrderBy, cFieldlist)

LOCAL cOrderBy2, cOrderBy3, cPageSize, cTop
 
If Empty(cFieldlist)
    cFieldlist="*"
EndIf
* nPageSize = Size of the pages, in your example 50
* lFirst, Show first page
* lLast, Show last page
* nOffSet, Show from record nOffset onwards
* cOffset, drilldown to an alphabetic character selected (could be one or more, so A,B,C or AA, AB, AC etc)
 
* cWhere: It is assumed that the selection criteria: cWhere  is constructed by an upper layer. So for example
    * WHERE State = 'State of California' AND status IN(2,3)
    * WHERE Address LIKE  '%Lane%' AND State is 'NY' AND status = 1
 
* cOrderBy Indicates the fields on which the resultsets need to be ordered. This could be a comma delimited list
    * in this case the selection of offset would only operate on the first column in the list
 
* It assumed that the current page location is handled by the application layer (stateless) and the page number display is assumed
* to be handled by the upper layer. This routine is only retrieving the requested pages from the backend.
 
 
* Getting the 50 located records.
 
cOrderBy2 = cOrderBy
cOrderBy3 = cOrderBy
cPageSize = Transform(nPageSize)
cTop = cPageSize
 
** Handling the naviation to a particular starting char
 
cWhere = cWhere + IIF(EMPTY(cOffSet),'',' AND '+GETWORDNUM(cOrderBY,1) + " LIKE '"+ALLTRIM(cOffSet)+"%'")
 
DO CASE
    CASE lLast
        cOrderBy2 = cOrderBy+' DESC'
    CASE nOffSet > 0
*        cTop = Transform(nOffset+nPageSize)
        cTop = Transform(nOffset+nPageSize-1)
        cOrderBy3 = cOrderBy3+' DESC'
ENDCASE
 
** SQL Statement will return at most (nPageSize records) with the total rowcount of the selection in the Totalrows column
TEXT TO cSQL TEXTMERGE NOSHOW
    SELECT TOP <<cPageSize>> <<cFieldlist>> FROM (
        SELECT TOP <<cPageSize>> <<cFieldlist>> FROM (
            SELECT TOP <<cTop>> <<cFieldlist>>
                FROM <<cTablename>>
                WHERE <<cWhere>>
                ORDER BY <<cOrderBy2>> ) as A
            ORDER BY <<cOrderBy3>>) as B
        INNER JOIN (SELECT COUNT(*)  as totalrows FROM <<cTablename>> WHERE <<cWhere>>) as C ON 1 = 1
        ORDER BY <<cOrderby>>   
ENDTEXT
qsql=csql
Return sqlrun(cSql,cCursorname,.t.)
Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

5 Son düzenleyen, cetinbasoz (03.10.2011 17:27:03)

Re: SQL sorgulama

6000 kayit ufak bir miktar. Ozel birsey yapmasan da olur. VFP icinde fetching oldugundan istersen ozel bir rutin kullanmadan da fetch kullanabilirsin.

Once dogrudan almayi test et (ama connection da isolation level kur).

SQL
SET transaction isolation level READ uncommitted

Not: Tabii kullanicilarin ne is yapacagi da onemli. Belki de beklemeleri daha iyidir.

6

Re: SQL sorgulama

vfp'deki fetch dediğim gibi hiçbir işine yaramaz:

http://support.microsoft.com/kb/157047/en-us

NOTE: Keep this in mind if you intend to use FetchAsNeeded.

If you want to use this feature with a grid on a form, you should not use any buffering mode for the view, form, or the grid.

http://www.universalthread.com/ViewPage … px?ID=8150
http://www.tech-archive.net/Archive/Fox … /0368.html

simultanefetch vardı vfpde bir de onun da şimdi hatırlayamadığım bazı problemleri vardı.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

7 Son düzenleyen, metin (04.10.2011 09:42:42)

Re: SQL sorgulama

bir de bu var:
http://www.fox4um.com/topic/620/idle-time/

Microsoft Axapta ve LOGO benim yukarıda verdiğim gibi bir fonksiyon kullanıyor. Hatta Axapta'nınki o kadar güzel çalışmadığı için bazı durumlarda dosyanın sonuna geldiğini sanıyorsun.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

8

Re: SQL sorgulama

merhaba Cihan,
6.000 (60.000 dahi) kayıt ve 20 (200 dahi) kullanıcı bugünkü teknoloji için çok ufak, gene de sql serverin öncelikleri bence yukarıda vurgulanandan çok daha başka:
1. SQL server de sorgulama sayısını minimize etmeli: yani 3 kerede 1000 (bin) er satır almaktansa 1 çağrıda 10.000 (onbin) satır almak daha iyi. (senin örnek)
2. SQL kodunu sadece ihtiyaç duyulan bilgiler için düzenlemeli: alan sayısı ve satır sayısı minimizasyonu, yani daha iyi SQL kodlama, yanında indeksleme vb. (örneğin sql manegement studioda execution plan larda index önerisi bil veriyor)
3. SQL Server tarafını daha çok çalıştırmalı (SP ler, viewlar)
4. SORUN: delete - insert - update bütün databasein kurallarını denetleyerek ve uygulayarak yapılabiliyor. O nedenle "datayı biriktir- gece 'peak hour' dışında yap" diyen bile var. Tabloları eskimiş data (artık delete-insert-update yapılmayacaklar) ve taze data gibi ikili kullanmak ve union ile sorgulamayı planlayabilirsin. 

aşağıdaki makalelere bakmanı öneririm:
Top 10 steps to optimize data access in SQL Server.....
http://www.codeproject.com/KB/database/ … TSQLs.aspx

Speeding up Data Access......(burada fazla indexin zararı ve bulunması da var)
http://www.sqlservercentral.com/article … ing/74510/

VFP9 SP2