Принципен въпрос...
27 отговора
1180 прегледа
Принципен въпрос...
Значи представете си искате да извадите по един ред /или част от него/ от 2 таблици, които нямат нищо общо /е, в една база се намират;-) и да имат, в случая не се ползва/, абсолютно сигурни сте, че този ред го има и той е само по един и за двете таблици... та въпроса е как ще се доберете до данните? С две заявки или с един леко фалшив "JOIN"... т.е. хем двете таблици ще участват в една заявка, хем няма да има условие, в което да участват 2-те таблици?
Аз все си мисля, че с една заявка е по-оптимална, въпроса е базата ад схване добре намеренията ти... и накрая да илюстрирам въпроса с примерни заявки
Вариант 1:
SELECT
name
FROM
table1
WHERE
id=5
и отделно
SELECT
name
FROM
table2
WHERE
id=7
Вариант 2:
SELECT
t1.name name1,
t2.name name2
FROM
table1 t1,
table2 t2
WHERE
t1.id=5 AND
t2.id=7
P.S. мисля да направя тестове с MySQL за производителност, но отначало да чуем залаганията
ViruS
Аз все си мисля, че с една заявка е по-оптимална, въпроса е базата ад схване добре намеренията ти... и накрая да илюстрирам въпроса с примерни заявки
Вариант 1:
SELECT
name
FROM
table1
WHERE
id=5
и отделно
SELECT
name
FROM
table2
WHERE
id=7
Вариант 2:
SELECT
t1.name name1,
t2.name name2
FROM
table1 t1,
table2 t2
WHERE
t1.id=5 AND
t2.id=7
P.S. мисля да направя тестове с MySQL за производителност, но отначало да чуем залаганията
ViruS
Re: Принципен въпрос...
значи
за MySql не мога да кажа нищо, предполагам че ще изпълни заявките по най-буквалния начин......
ако става дума за MS Sql Server или за Oraclе или за друга сериозна машина за баззи данни - те имат Query optymizer и ще го изпълнат така, както е най-добре да бъде изпълнено....
РАЗБЕРИ МЕ ПРАВИЛНО - МАШИНИТЕ ЗА БАЗИ ДАННИ МНОГО ОБИЧАТ КОМБИНАЦИИТЕ ОТ УСЛОВИЯ В КОИТО ИМА САМО AND направо умират от кеф....
не се замислям над въпроса дали са ти правилно написани заявките, и дали ще върнат един и същ отговор....
за MySql не мога да кажа нищо, предполагам че ще изпълни заявките по най-буквалния начин......
ако става дума за MS Sql Server или за Oraclе или за друга сериозна машина за баззи данни - те имат Query optymizer и ще го изпълнат така, както е най-добре да бъде изпълнено....
РАЗБЕРИ МЕ ПРАВИЛНО - МАШИНИТЕ ЗА БАЗИ ДАННИ МНОГО ОБИЧАТ КОМБИНАЦИИТЕ ОТ УСЛОВИЯ В КОИТО ИМА САМО AND направо умират от кеф....
не се замислям над въпроса дали са ти правилно написани заявките, и дали ще върнат един и същ отговор....
Re: Принципен въпрос...
И MySQL има Query optymizer и ще изпълни заявката по оптимален начин... а лошия вариант за изпълнението на заявката е да се JOINат таблиците и тогава да се обръща внимание на условията засягащи само по една таблица, както btw много умни книги се опитват да представят нещата...
>>> РАЗБЕРИ МЕ ПРАВИЛНО - МАШИНИТЕ ЗА БАЗИ ДАННИ МНОГО ОБИЧАТ КОМБИНАЦИИТЕ ОТ УСЛОВИЯ В КОИТО ИМА САМО AND
ама е още поэголям кеф да няма изобщо AND а само едно условие, засягащо PRIMARY KEY
А заявките дават еднакъв резултат, ако си СИГУРЕН, че и в двете таблици го има този ред...
P.S. очаквам всеки отговорил все пак да каже кой вариант предпочита...
ViruS
>>> РАЗБЕРИ МЕ ПРАВИЛНО - МАШИНИТЕ ЗА БАЗИ ДАННИ МНОГО ОБИЧАТ КОМБИНАЦИИТЕ ОТ УСЛОВИЯ В КОИТО ИМА САМО AND
ама е още поэголям кеф да няма изобщо AND а само едно условие, засягащо PRIMARY KEY
А заявките дават еднакъв резултат, ако си СИГУРЕН, че и в двете таблици го има този ред...
P.S. очаквам всеки отговорил все пак да каже кой вариант предпочита...
ViruS
Редактирано от ViruS на
Re: Принципен въпрос...
az tuka se zanimavah na skoro da optimiziram edna stranica. tia mnogo chesto se hitva i iskam da iztiskam vsiaka milisekunda ot neia. ta v neia triabva da se izpalniat 5-9 stored proceduri (sql server/C). Ustanovih che nai mnogo vreme otnema samoto izvikvane, t.e. skorostta e prakticheski proporcionalna na broia na SP-tata. Az misleh za neshto takova (sintaxisa e samo primeren kolkoto da kaja ideiata):
select CAST (t1.field1, varchar) as ResFld1, CAST (t1.field5, varchar) as ResFld2
From tblOne t1
UNION
select CAST (t2.field3, varchar) as ResFld1, CAST (t2.field4, varchar) as ResFld2
From tblOne t2
Ne sam go probval oshte. Obache tvoiata ideia mnogo mnogo me kefi neshto. Shte vzema da poexperimentiram. Ako imash resultati postni da vidim kak e.
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
select CAST (t1.field1, varchar) as ResFld1, CAST (t1.field5, varchar) as ResFld2
From tblOne t1
UNION
select CAST (t2.field3, varchar) as ResFld1, CAST (t2.field4, varchar) as ResFld2
From tblOne t2
Ne sam go probval oshte. Obache tvoiata ideia mnogo mnogo me kefi neshto. Shte vzema da poexperimentiram. Ako imash resultati postni da vidim kak e.
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
Re: Принципен въпрос...
ми не съм много на ясно как точно се изпълняват заявките, но знам че първо се отчитат условията, които изключват най-много записи.....
после, ти даваш два примера, които ще върнат различен резултат - първия с двата селекта ще върне два реда...а втория един, и това ако полетата, по които правиш филтър съдържат уникални стойности.......
така че според тва което ти трябва избирай стратегията...
после, ти даваш два примера, които ще върнат различен резултат - първия с двата селекта ще върне два реда...а втория един, и това ако полетата, по които правиш филтър съдържат уникални стойности.......
така че според тва което ти трябва избирай стратегията...
Re: Принципен въпрос...
mdamm, ama ako imash poveche recorda koito iskash da selectnesh v tvoita tablica shte napravi niakolko reda, kato ot ednata tablica shte se povtariat v drugata. primerno:
SELECT
t1.name name1,
t2.name name2
FROM
table1 t1,
table2 t2
WHERE
t1.id=5 AND
t2.id between 5 and 105
a kakvo shte kajesh za tova:
SELECT
null, name
FROM
table1
WHERE
id=5
union
SELECT
name, null
FROM
table2
WHERE
id=7
?????
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
SELECT
t1.name name1,
t2.name name2
FROM
table1 t1,
table2 t2
WHERE
t1.id=5 AND
t2.id between 5 and 105
a kakvo shte kajesh za tova:
SELECT
null, name
FROM
table1
WHERE
id=5
union
SELECT
name, null
FROM
table2
WHERE
id=7
?????
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
Re: Принципен въпрос...
Ще ти дам жокерче, тъй като направих вече тестовете: варианта със JOIN е по-успешният, после ще кажа колко...
колкото за различния резултат: мисля че добре обясних... данните ти трябват едновременно и ти е все едно дали са в един дълъг /с две колонки/ или два по-къси /с по една/ resultset-ове... за уникалността, т'ва също беше към условието на задачата...
ViruS
колкото за различния резултат: мисля че добре обясних... данните ти трябват едновременно и ти е все едно дали са в един дълъг /с две колонки/ или два по-къси /с по една/ resultset-ове... за уникалността, т'ва също беше към условието на задачата...
ViruS
Редактирано от ViruS на
Re: Принципен въпрос...
и ти е все едно.....
не може да ти е все едно
има две крайни условия
1. когато губиш повече време за "извикване" на резултсета
и
2. когато губиш повече време за изпълнение на зявките......
оказва се, че е може когато базата данни ти е празна едно решение да е дъбест а когато се изпълни с данни съвсем друго да се окаже по добро....
идеята е да се пишат максимално лесни за изпълнение заявки....а това май не винаги е лесно....
не може да ти е все едно
има две крайни условия
1. когато губиш повече време за "извикване" на резултсета
и
2. когато губиш повече време за изпълнение на зявките......
оказва се, че е може когато базата данни ти е празна едно решение да е дъбест а когато се изпълни с данни съвсем друго да се окаже по добро....
идеята е да се пишат максимално лесни за изпълнение заявки....а това май не винаги е лесно....
Re: Принципен въпрос...
както вече казах, единия начин си е по-бърз във всички отношения...
тестовите таблици имат по 800000 записа /само толкова, щото ги правих за друг тест, където наистина ги JOINвах с други таблици/, ако е почти празна, вервай ми метода, дето и без това се оказа по-добър, ще поведе още повече
ViruS
тестовите таблици имат по 800000 записа /само толкова, щото ги правих за друг тест, където наистина ги JOINвах с други таблици/, ако е почти празна, вервай ми метода, дето и без това се оказа по-добър, ще поведе още повече
ViruS
Re: Принципен въпрос...
не бързам да ти вярвам....отивам да се наспя първо......
лека!
лека!
Re: Принципен въпрос...
eto tuka niakolko testa (vij po-nadolu) varhu SQL Server 2000/Northwind.
izvodi:
- kombiniraneto na zaiavki e po-izgodno kogato vrashat po-malko danni (i se izpalniavat po-barzo sashto) - sravni resultatite s top 5 i bez top 5.
- razlikata stava naistina goliama ako DB servera e na druga masina. ako e na druga mashina efekta e na praktika 2 pati za 2 SP i imam podozrenia che ako iskash da napahash 5 resultseta v edin shte e kaji rechi 5 pati po-barzo.
mojesh li da publikuvash tvoite resultati? S MySQL li bachkash? Ako gi sravnim shte moje da si napravim niakoi izvodi dokolko optimiziraneto na zaiavkite i arhitekturata na bazata kato cialo vliiaiat.
--------------------------------------------------------------------------
ASP test file:
--------------------------------------------------------------------------
<%
Set oCnn = Server.CreateObject ("ADODB.Connection")
oCnn.Open "Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=northwind;Data Source=newlechuck"
Sub TestRS (strSQL)
' Record beginning
Dim tmBegin
tmBegin = Timer
' Open disconnected recordset 500 times so that it takes more time
For i = 1 to 500
Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.CursorLocation = adUseClient
rs.Open strSQL, oCnn, adOpenForwardOnly, adLockReadOnly, adCmdText
rs.ActiveConnection = Nothing
Set OpenDisconnectedRS = rs
Set rs = Nothing
Next
' Write result
%> [<% = strSQL %>] executed in <% = Timer - tmBegin %> seconds
<%
End Sub
TestRS ("EXEC sp_Recordset1")
TestRS ("EXEC sp_Recordset2")
TestRS ("EXEC sp_TwoRecordsets")
TestRS ("EXEC sp_Recordset1_5")
TestRS ("EXEC sp_Recordset2_5")
TestRS ("EXEC sp_TwoRecordsets_5")
%>
--------------------------------------------------------------------------
Test stored procedures:
--------------------------------------------------------------------------
CREATE PROCEDURE sp_Recordset1 AS
select categoryid, categoryname from categories
GO
CREATE PROCEDURE sp_Recordset1_5 AS
select top 5 categoryid, categoryname from categories
GO
CREATE PROCEDURE sp_Recordset2 AS
select customerid, companyname, contactname, contacttitle, address from customers
GO
CREATE PROCEDURE sp_Recordset2_5 AS
select top 5 customerid, companyname, contactname, contacttitle, address from customers
GO
CREATE PROCEDURE sp_TwoRecordsets AS
select null, null, null, null, null, categoryid, categoryname from categories
union
select customerid, companyname, contactname, contacttitle, address, null, null from customers
GO
CREATE PROCEDURE sp_TwoRecordsets_5 AS
select top 5 null, null, null, null, null, categoryid, categoryname from categories
union
select top 5 customerid, companyname, contactname, contacttitle, address, null, null from customers
GO
--------------------------------------------------------------------------
Results with SQL server on the same machine:
--------------------------------------------------------------------------
[EXEC sp_Recordset1] executed in 1 seconds
[EXEC sp_Recordset2] executed in 1.84375 seconds
[EXEC sp_TwoRecordsets] executed in 2.328125 seconds
[EXEC sp_Recordset1_5] executed in 0.96875 seconds
[EXEC sp_Recordset2_5] executed in 1.015625 seconds
[EXEC sp_TwoRecordsets_5] executed in 1.265625 seconds
--------------------------------------------------------------------------
Results with SQL server on different machine:
--------------------------------------------------------------------------
[EXEC sp_Recordset1] executed in 1.34375 seconds
[EXEC sp_Recordset2] executed in 2.546875 seconds
[EXEC sp_TwoRecordsets] executed in 3.03125 seconds
[EXEC sp_Recordset1_5] executed in 1.265625 seconds
[EXEC sp_Recordset2_5] executed in 1.34375 seconds
[EXEC sp_TwoRecordsets_5] executed in 1.59375 seconds
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
izvodi:
- kombiniraneto na zaiavki e po-izgodno kogato vrashat po-malko danni (i se izpalniavat po-barzo sashto) - sravni resultatite s top 5 i bez top 5.
- razlikata stava naistina goliama ako DB servera e na druga masina. ako e na druga mashina efekta e na praktika 2 pati za 2 SP i imam podozrenia che ako iskash da napahash 5 resultseta v edin shte e kaji rechi 5 pati po-barzo.
mojesh li da publikuvash tvoite resultati? S MySQL li bachkash? Ako gi sravnim shte moje da si napravim niakoi izvodi dokolko optimiziraneto na zaiavkite i arhitekturata na bazata kato cialo vliiaiat.
--------------------------------------------------------------------------
ASP test file:
--------------------------------------------------------------------------
<%
Set oCnn = Server.CreateObject ("ADODB.Connection")
oCnn.Open "Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=northwind;Data Source=newlechuck"
Sub TestRS (strSQL)
' Record beginning
Dim tmBegin
tmBegin = Timer
' Open disconnected recordset 500 times so that it takes more time
For i = 1 to 500
Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.CursorLocation = adUseClient
rs.Open strSQL, oCnn, adOpenForwardOnly, adLockReadOnly, adCmdText
rs.ActiveConnection = Nothing
Set OpenDisconnectedRS = rs
Set rs = Nothing
Next
' Write result
%> [<% = strSQL %>] executed in <% = Timer - tmBegin %> seconds
<%
End Sub
TestRS ("EXEC sp_Recordset1")
TestRS ("EXEC sp_Recordset2")
TestRS ("EXEC sp_TwoRecordsets")
TestRS ("EXEC sp_Recordset1_5")
TestRS ("EXEC sp_Recordset2_5")
TestRS ("EXEC sp_TwoRecordsets_5")
%>
--------------------------------------------------------------------------
Test stored procedures:
--------------------------------------------------------------------------
CREATE PROCEDURE sp_Recordset1 AS
select categoryid, categoryname from categories
GO
CREATE PROCEDURE sp_Recordset1_5 AS
select top 5 categoryid, categoryname from categories
GO
CREATE PROCEDURE sp_Recordset2 AS
select customerid, companyname, contactname, contacttitle, address from customers
GO
CREATE PROCEDURE sp_Recordset2_5 AS
select top 5 customerid, companyname, contactname, contacttitle, address from customers
GO
CREATE PROCEDURE sp_TwoRecordsets AS
select null, null, null, null, null, categoryid, categoryname from categories
union
select customerid, companyname, contactname, contacttitle, address, null, null from customers
GO
CREATE PROCEDURE sp_TwoRecordsets_5 AS
select top 5 null, null, null, null, null, categoryid, categoryname from categories
union
select top 5 customerid, companyname, contactname, contacttitle, address, null, null from customers
GO
--------------------------------------------------------------------------
Results with SQL server on the same machine:
--------------------------------------------------------------------------
[EXEC sp_Recordset1] executed in 1 seconds
[EXEC sp_Recordset2] executed in 1.84375 seconds
[EXEC sp_TwoRecordsets] executed in 2.328125 seconds
[EXEC sp_Recordset1_5] executed in 0.96875 seconds
[EXEC sp_Recordset2_5] executed in 1.015625 seconds
[EXEC sp_TwoRecordsets_5] executed in 1.265625 seconds
--------------------------------------------------------------------------
Results with SQL server on different machine:
--------------------------------------------------------------------------
[EXEC sp_Recordset1] executed in 1.34375 seconds
[EXEC sp_Recordset2] executed in 2.546875 seconds
[EXEC sp_TwoRecordsets] executed in 3.03125 seconds
[EXEC sp_Recordset1_5] executed in 1.265625 seconds
[EXEC sp_Recordset2_5] executed in 1.34375 seconds
[EXEC sp_TwoRecordsets_5] executed in 1.59375 seconds
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
Re: Принципен въпрос...
ами когато става дума за MySql обикновено си мисля и за интернет....
тогава за общата производителност ще е важно не само за колко време се изпълнява зявката а и за колко време ще се добереш до сървъра.....
щото човека иска да прави селект с филтър по поле, което е индексирано и няма повтарящи се стойности.....демек заявката ще се изпълни с няколко поглеждания в индекса....няма какво толкоз да забави сървъра....
всъщност, join-ването на таблици, които нямат нищ общо едва ли има някакъв смисъл? освен ако много държиш резултата да е на един ред а не на два.....
дори и твоя тест е през ASP като гледам.....)
тогава за общата производителност ще е важно не само за колко време се изпълнява зявката а и за колко време ще се добереш до сървъра.....
щото човека иска да прави селект с филтър по поле, което е индексирано и няма повтарящи се стойности.....демек заявката ще се изпълни с няколко поглеждания в индекса....няма какво толкоз да забави сървъра....
всъщност, join-ването на таблици, които нямат нищ общо едва ли има някакъв смисъл? освен ако много държиш резултата да е на един ред а не на два.....
дори и твоя тест е през ASP като гледам.....)
Re: Принципен въпрос...
opredeleno zalagam na vtoriq metod. 2 zaqvki sa si dve zaqvki, vsqka gubi vreme za analizirane, vry6tane /*ako dobavim i nqkakva posledva6ta obrabotka da re4em s php, 6te imame i veroqtno dva pyti izvikvane na nqkakva funkciq, vmesto samo vednyj */ i t.n. No tova za konkretno primera koito si dal. Ako stava vypros za ne6to po-slojno, ne znam. Ne sm mislil.
Koga 6te iznese6 rezultatite ot testa?
The things are always changing, I feel that it`s allright
Koga 6te iznese6 rezultatite ot testa?
The things are always changing, I feel that it`s allright
Re: Принципен въпрос...
Все нещо не можеш да ме разбереш... при 1 заявка вместо 2 пестиш именно 2рото "добиране на сървъра", тогава варианта с JOIN става още по-добър, въпреки че той спокойно печели пред 2-те заявки и без да се връзвам на друга машина...
Та ето ги моите резултати... макар д ами се искаше повечко хора да дадат мнение преди да ги постна, резултатите са секунди за изпълнение на 10000 JOIN-а на 2 таблици или еквивалентните 20000 по-прости заявки:
virus@adam:~/sporowe$ php joinor2queries.php
Content-type: text/html
2queries: 5.5864440202713
join: 3.7013239860535
no query (just php loop): 0.18888700008392
ViruS
Та ето ги моите резултати... макар д ами се искаше повечко хора да дадат мнение преди да ги постна, резултатите са секунди за изпълнение на 10000 JOIN-а на 2 таблици или еквивалентните 20000 по-прости заявки:
virus@adam:~/sporowe$ php joinor2queries.php
Content-type: text/html
2queries: 5.5864440202713
join: 3.7013239860535
no query (just php loop): 0.18888700008392
ViruS
Редактирано от ViruS на
Re: Принципен въпрос...ама много принципен
Цитирам Торбалан
"join-ването на таблици, които нямат нищо общо едва ли има някакъв смисъл"
Или по-точно има две възможности
1. Няма никакъв смисъл
2. Таблиците ти всъщност имат нещо общо, но .... само в главата ти
т.е. ти имаш нещо конкретно предвид за връзката на е те точно тия редове от двете таблици, но не си го "превел" в SQL терминология
Ако е 1. тогава решението е очевидно - UNION
а именно:
SELECT name FROM table1 WHERE id=5
UNION [ALL]
SELECT name FROM table2 WHERE id=7
ALL - в зависимост от това дали искаш да избегнеш повторенията или не.
Всъщност това е 1 заявка по отношение на връзка, трансфер на данни и други и 2 заявки по отношение на оптимизацията.
Каквото и както и да правиш това е оптималния вариант. Мога да се хвана на бас ей тъй както си размишлявам, че всеки сървър ще върне резултата от UNION по-бързо от две отделни заявки да не говорим пък за JOIN.
Защо JOIN няма смисъл? Ами защото сървъра е в пълното си право да оптимизира заявката както намери за добре и може да "намери" за добре първо да направи JOIN-а т.е. декартовото произведение на двете таблици пък чак тогава да филтрира само тези редове дето ги искаш .... нали се сещаш какво ще се получи
За съжаление бързата проба която направих под MySQL показа, че и в трите случая времето е около 0.01 - 0.02 sec което изобщо не е показателно
двете таблици имаха съответно
3524578
и
4870847
реда
salle.online.bg/sig
"join-ването на таблици, които нямат нищо общо едва ли има някакъв смисъл"
Или по-точно има две възможности
1. Няма никакъв смисъл
2. Таблиците ти всъщност имат нещо общо, но .... само в главата ти
т.е. ти имаш нещо конкретно предвид за връзката на е те точно тия редове от двете таблици, но не си го "превел" в SQL терминология
Ако е 1. тогава решението е очевидно - UNION
а именно:
SELECT name FROM table1 WHERE id=5
UNION [ALL]
SELECT name FROM table2 WHERE id=7
ALL - в зависимост от това дали искаш да избегнеш повторенията или не.
Всъщност това е 1 заявка по отношение на връзка, трансфер на данни и други и 2 заявки по отношение на оптимизацията.
Каквото и както и да правиш това е оптималния вариант. Мога да се хвана на бас ей тъй както си размишлявам, че всеки сървър ще върне резултата от UNION по-бързо от две отделни заявки да не говорим пък за JOIN.
Защо JOIN няма смисъл? Ами защото сървъра е в пълното си право да оптимизира заявката както намери за добре и може да "намери" за добре първо да направи JOIN-а т.е. декартовото произведение на двете таблици пък чак тогава да филтрира само тези редове дето ги искаш .... нали се сещаш какво ще се получи
За съжаление бързата проба която направих под MySQL показа, че и в трите случая времето е около 0.01 - 0.02 sec което изобщо не е показателно
двете таблици имаха съответно
3524578
и
4870847
реда
salle.online.bg/sig
Re: Принципен въпрос...
Ochevidno e che ima razlika daje na edna masina, kato iavno za php/mysql resultatite sa dosta blizki do asp/sql server. Sheteshe da e chudno ako ne e taka.
Vremeto za connect do bazata i prenasianeto na danni si e vreme koeto si struva da se pesti. a kakvo da kajem za sluchaite kogato bazata ti e na druga mashina vse pak
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
Vremeto za connect do bazata i prenasianeto na danni si e vreme koeto si struva da se pesti. a kakvo da kajem za sluchaite kogato bazata ti e na druga mashina vse pak
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
Re: Принципен въпрос...ама много принципен
Е аз постнах резултатите от теста... т.е. има смисъл... не съм пробвал с UNION, щото предполагам знаеш MySQL 3.23.44 не го рабира много много
Обаче варианта с UNION има един недостатък: аз само за случая предположих, че искаш да извадиш по точно едно поле от таблицата, ама ако са 3 в едната и 5 в другата с коренно различни типове... варианта на Perin тогава може да свърши работа, ама...
Та аз работя основно с MySQL 3.хх.хх, та UNION не ме грее, на 4 още ми е рано да минавам... и все пак ще продължа да предпочитам "JOIN"-а пред 2те заявки, защото се убедих, че е по-бързо
И все пак не съм съгласен с "join-ването на таблици, които нямат нищо общо едва ли има някакъв смисъл"... т.е. отчасти съгласен съм, знам че изглежда грозно, основно за това постнах въпроса за обсъждане, но щом е по-оптимално, защо да не го ползвам?
В този ред на мисли се сетих за още един такъв пример, където според мен, по-грозното е по-оптимално: представи си заявка с 3+ таблици, която връща много редове /т.е. няма вече защо да се обсъжда варианта с 2 заявки/ обаче имаш 2 таблици, които могат да се JOIN-ат и по СЪЩОТО поле, по което са JOIN-ати да филтрираш по константа, та въпроса е дали е по-добре да се JOIN-ват по полето или и на 2те места да се пише константа? Примери:
Вариант 1:
SELECT
........
FROM
table1 t1,
table1name t1n,
table2 t2
WHERE
t1.id=5 AND
t1.id=t1n.tid AND
t1n.language='EN' AND
t1.t2id=t2.id
Еквивалентен Вариант 2:
SELECT
........
FROM
table1 t1,
table1name t1n,
table2 t2
WHERE
t1.id=5 AND
t1n.tid=5 AND
t1n.language='EN' AND
t1.t2id=t2.id
Та аз бих заложил на варинат 2, който въпреки че е по-грозен и неестествен, според мен дава повече свобода на оптимизатора и не съм проверил, но почти съм сигурен че ще дава не по-лоши резултати от първия...
ViruS
Обаче варианта с UNION има един недостатък: аз само за случая предположих, че искаш да извадиш по точно едно поле от таблицата, ама ако са 3 в едната и 5 в другата с коренно различни типове... варианта на Perin тогава може да свърши работа, ама...
Та аз работя основно с MySQL 3.хх.хх, та UNION не ме грее, на 4 още ми е рано да минавам... и все пак ще продължа да предпочитам "JOIN"-а пред 2те заявки, защото се убедих, че е по-бързо
И все пак не съм съгласен с "join-ването на таблици, които нямат нищо общо едва ли има някакъв смисъл"... т.е. отчасти съгласен съм, знам че изглежда грозно, основно за това постнах въпроса за обсъждане, но щом е по-оптимално, защо да не го ползвам?
В този ред на мисли се сетих за още един такъв пример, където според мен, по-грозното е по-оптимално: представи си заявка с 3+ таблици, която връща много редове /т.е. няма вече защо да се обсъжда варианта с 2 заявки/ обаче имаш 2 таблици, които могат да се JOIN-ат и по СЪЩОТО поле, по което са JOIN-ати да филтрираш по константа, та въпроса е дали е по-добре да се JOIN-ват по полето или и на 2те места да се пише константа? Примери:
Вариант 1:
SELECT
........
FROM
table1 t1,
table1name t1n,
table2 t2
WHERE
t1.id=5 AND
t1.id=t1n.tid AND
t1n.language='EN' AND
t1.t2id=t2.id
Еквивалентен Вариант 2:
SELECT
........
FROM
table1 t1,
table1name t1n,
table2 t2
WHERE
t1.id=5 AND
t1n.tid=5 AND
t1n.language='EN' AND
t1.t2id=t2.id
Та аз бих заложил на варинат 2, който въпреки че е по-грозен и неестествен, според мен дава повече свобода на оптимизатора и не съм проверил, но почти съм сигурен че ще дава не по-лоши резултати от първия...
ViruS
Re: :)
Ами именно за варианта когато поне една от таблиците ти връща повече редове JOIN без условие губи всякакъв смисъл :)
salle.online.bg/sig
salle.online.bg/sig
Re: :)
Е не ти ли се случва да си СИГУРЕН, че го има тоз запис и е точно един, за тоз случай се отнасяше въпроса... примерно когато и на двете места id-то е PRIMARY KEY /случва се, знаеш/
а за варианта ако една от таблиците, ама само едната и ти знаеш теоретично коя има повече от едно поле пак върши работа, ако прецениш, че повторенията във recordset-а си струват...
а току що един приятел на ICQ ми каза:
inache oshte postgres rulez:
Select
(SELECT name FROM table1 WHERE id=5 ) as a
(SELECT name FROM table2 WHERE id=7 ) as b
ViruS
а за варианта ако една от таблиците, ама само едната и ти знаеш теоретично коя има повече от едно поле пак върши работа, ако прецениш, че повторенията във recordset-а си струват...
а току що един приятел на ICQ ми каза:
inache oshte postgres rulez:
Select
(SELECT name FROM table1 WHERE id=5 ) as a
(SELECT name FROM table2 WHERE id=7 ) as b
ViruS
Re: :)
A na MySQL mojesh li da napravish neshto ot roda na:
declare @a int
declare @b int
select @a = field1 from ....
select @b = field2 from .....
select @a, @b
?
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
declare @a int
declare @b int
select @a = field1 from ....
select @b = field2 from .....
select @a, @b
?
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ